summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/linux_builds.yml2
-rw-r--r--.github/workflows/static_checks.yml2
-rw-r--r--core/core_bind.cpp9
-rw-r--r--core/core_bind.h3
-rw-r--r--core/input/gamecontrollerdb.txt56
-rw-r--r--core/input/godotcontrollerdb.txt2
-rw-r--r--core/input/input.cpp14
-rw-r--r--core/input/input_event.cpp6
-rw-r--r--core/io/file_access.cpp2
-rw-r--r--core/io/file_access.h2
-rw-r--r--core/io/file_access_compressed.cpp4
-rw-r--r--core/io/file_access_compressed.h2
-rw-r--r--core/io/file_access_encrypted.cpp4
-rw-r--r--core/io/file_access_encrypted.h2
-rw-r--r--core/io/file_access_memory.h2
-rw-r--r--core/io/file_access_network.cpp9
-rw-r--r--core/io/file_access_network.h2
-rw-r--r--core/io/file_access_pack.cpp4
-rw-r--r--core/io/file_access_pack.h2
-rw-r--r--core/io/file_access_zip.cpp4
-rw-r--r--core/io/file_access_zip.h2
-rw-r--r--core/math/math_funcs.h2
-rw-r--r--core/math/vector3.cpp2
-rw-r--r--core/math/vector3.h8
-rw-r--r--core/math/vector3i.h8
-rw-r--r--core/math/vector4.h8
-rw-r--r--core/math/vector4i.h8
-rw-r--r--core/object/class_db.h29
-rw-r--r--core/object/message_queue.cpp12
-rw-r--r--core/object/method_bind.h4
-rw-r--r--core/object/script_language.cpp18
-rw-r--r--core/object/script_language.h4
-rw-r--r--core/object/script_language_extension.cpp1
-rw-r--r--core/string/translation_po.cpp5
-rw-r--r--core/string/ustring.cpp8
-rw-r--r--core/variant/container_type_validate.h5
-rw-r--r--core/variant/variant.h4
-rw-r--r--core/variant/variant_op.cpp7
-rw-r--r--doc/classes/@GlobalScope.xml24
-rw-r--r--doc/classes/AnimationNodeAnimation.xml2
-rw-r--r--doc/classes/AnimationNodeOneShot.xml38
-rw-r--r--doc/classes/AnimationNodeStateMachinePlayback.xml3
-rw-r--r--doc/classes/AnimationNodeStateMachineTransition.xml3
-rw-r--r--doc/classes/AnimationNodeSync.xml1
-rw-r--r--doc/classes/AnimationNodeTimeSeek.xml15
-rw-r--r--doc/classes/AnimationNodeTransition.xml30
-rw-r--r--doc/classes/AnimationRootNode.xml1
-rw-r--r--doc/classes/AnimationTree.xml84
-rw-r--r--doc/classes/Area2D.xml2
-rw-r--r--doc/classes/Area3D.xml2
-rw-r--r--doc/classes/BaseMaterial3D.xml44
-rw-r--r--doc/classes/CPUParticles3D.xml2
-rw-r--r--doc/classes/Camera2D.xml1
-rw-r--r--doc/classes/CameraAttributesPhysical.xml1
-rw-r--r--doc/classes/CameraAttributesPractical.xml2
-rw-r--r--doc/classes/CanvasItem.xml1
-rw-r--r--doc/classes/CanvasLayer.xml2
-rw-r--r--doc/classes/CharacterBody2D.xml4
-rw-r--r--doc/classes/CodeEdit.xml2
-rw-r--r--doc/classes/Color.xml16
-rw-r--r--doc/classes/Control.xml5
-rw-r--r--doc/classes/Decal.xml4
-rw-r--r--doc/classes/DirectionalLight2D.xml1
-rw-r--r--doc/classes/DisplayServer.xml11
-rw-r--r--doc/classes/Engine.xml16
-rw-r--r--doc/classes/Environment.xml14
-rw-r--r--doc/classes/FileAccess.xml11
-rw-r--r--doc/classes/Font.xml3
-rw-r--r--doc/classes/FontVariation.xml2
-rw-r--r--doc/classes/Light2D.xml5
-rw-r--r--doc/classes/Light3D.xml7
-rw-r--r--doc/classes/Marshalls.xml2
-rw-r--r--doc/classes/NavigationAgent2D.xml2
-rw-r--r--doc/classes/NavigationAgent3D.xml2
-rw-r--r--doc/classes/NavigationLink2D.xml26
-rw-r--r--doc/classes/NavigationLink3D.xml26
-rw-r--r--doc/classes/NavigationServer2D.xml15
-rw-r--r--doc/classes/NavigationServer3D.xml24
-rw-r--r--doc/classes/NinePatchRect.xml2
-rw-r--r--doc/classes/Node3D.xml2
-rw-r--r--doc/classes/Object.xml2
-rw-r--r--doc/classes/OmniLight3D.xml4
-rw-r--r--doc/classes/PacketPeer.xml2
-rw-r--r--doc/classes/PhysicsDirectSpaceState3D.xml2
-rw-r--r--doc/classes/PhysicsServer2D.xml330
-rw-r--r--doc/classes/PointLight2D.xml2
-rw-r--r--doc/classes/ProjectSettings.xml45
-rw-r--r--doc/classes/ReflectionProbe.xml1
-rw-r--r--doc/classes/RenderingDevice.xml5
-rw-r--r--doc/classes/RichTextLabel.xml56
-rw-r--r--doc/classes/RigidBody2D.xml22
-rw-r--r--doc/classes/RigidBody3D.xml22
-rw-r--r--doc/classes/ScriptExtension.xml5
-rw-r--r--doc/classes/Skeleton3D.xml2
-rw-r--r--doc/classes/SpotLight3D.xml6
-rw-r--r--doc/classes/StreamPeer.xml2
-rw-r--r--doc/classes/String.xml13
-rw-r--r--doc/classes/StringName.xml14
-rw-r--r--doc/classes/TextEdit.xml6
-rw-r--r--doc/classes/TextureLayered.xml2
-rw-r--r--doc/classes/TextureRect.xml3
-rw-r--r--doc/classes/TileMap.xml23
-rw-r--r--doc/classes/VisibleOnScreenEnabler2D.xml2
-rw-r--r--doc/classes/VisibleOnScreenNotifier2D.xml1
-rw-r--r--doc/classes/VisibleOnScreenNotifier3D.xml2
-rw-r--r--doc/classes/VoxelGI.xml1
-rw-r--r--doc/classes/Window.xml2
-rw-r--r--doc/classes/XRInterface.xml2
-rw-r--r--doc/translations/es.po538
-rw-r--r--doc/translations/fr.po392
-rw-r--r--doc/translations/zh_CN.po2420
-rw-r--r--drivers/alsa/SCsub3
-rw-r--r--drivers/alsa/audio_driver_alsa.cpp5
-rw-r--r--drivers/alsa/audio_driver_alsa.h4
-rw-r--r--drivers/alsamidi/midi_driver_alsamidi.h5
-rw-r--r--drivers/gles3/rasterizer_canvas_gles3.cpp3
-rw-r--r--drivers/gles3/rasterizer_gles3.cpp9
-rw-r--r--drivers/gles3/shaders/stdlib_inc.glsl6
-rw-r--r--drivers/gles3/storage/material_storage.cpp1
-rw-r--r--drivers/gles3/storage/mesh_storage.cpp2
-rw-r--r--drivers/gles3/storage/texture_storage.cpp1
-rw-r--r--drivers/pulseaudio/SCsub3
-rw-r--r--drivers/pulseaudio/audio_driver_pulseaudio.cpp7
-rw-r--r--drivers/pulseaudio/audio_driver_pulseaudio.h4
-rw-r--r--drivers/unix/file_access_unix.cpp4
-rw-r--r--drivers/unix/file_access_unix.h2
-rw-r--r--drivers/vulkan/rendering_device_vulkan.cpp23
-rw-r--r--drivers/vulkan/rendering_device_vulkan.h2
-rw-r--r--drivers/vulkan/vulkan_context.cpp7
-rw-r--r--drivers/windows/file_access_windows.cpp5
-rw-r--r--drivers/windows/file_access_windows.h2
-rw-r--r--editor/animation_track_editor.cpp42
-rw-r--r--editor/animation_track_editor.h1
-rw-r--r--editor/animation_track_editor_plugins.cpp24
-rw-r--r--editor/code_editor.cpp290
-rw-r--r--editor/code_editor.h4
-rw-r--r--editor/editor_autoload_settings.cpp2
-rw-r--r--editor/editor_file_system.cpp29
-rw-r--r--editor/editor_help.cpp574
-rw-r--r--editor/editor_help.h49
-rw-r--r--editor/editor_inspector.cpp22
-rw-r--r--editor/editor_inspector.h2
-rw-r--r--editor/editor_locale_dialog.cpp6
-rw-r--r--editor/editor_node.cpp5
-rw-r--r--editor/editor_properties.cpp15
-rw-r--r--editor/editor_properties_array_dict.cpp8
-rw-r--r--editor/editor_property_name_processor.cpp4
-rw-r--r--editor/editor_settings.cpp9
-rw-r--r--editor/event_listener_line_edit.cpp3
-rw-r--r--editor/export/editor_export_platform.cpp4
-rw-r--r--editor/export/editor_export_platform_pc.cpp3
-rw-r--r--editor/icons/ParallaxBackground.svg2
-rw-r--r--editor/icons/ParallaxLayer.svg2
-rw-r--r--editor/import/dynamic_font_import_settings.cpp14
-rw-r--r--editor/import/scene_import_settings.cpp17
-rw-r--r--editor/import/scene_import_settings.h2
-rw-r--r--editor/input_event_configuration_dialog.cpp3
-rw-r--r--editor/plugins/mesh_library_editor_plugin.cpp4
-rw-r--r--editor/plugins/node_3d_editor_plugin.cpp7
-rw-r--r--editor/plugins/script_editor_plugin.cpp94
-rw-r--r--editor/plugins/script_editor_plugin.h18
-rw-r--r--editor/plugins/script_text_editor.cpp109
-rw-r--r--editor/plugins/skeleton_3d_editor_plugin.cpp2
-rw-r--r--editor/plugins/text_editor.cpp71
-rw-r--r--editor/plugins/text_editor.h2
-rw-r--r--editor/plugins/theme_editor_plugin.cpp71
-rw-r--r--editor/plugins/tiles/tile_atlas_view.cpp11
-rw-r--r--editor/plugins/tiles/tile_map_editor.cpp61
-rw-r--r--editor/plugins/tiles/tile_set_atlas_source_editor.cpp82
-rw-r--r--editor/plugins/tiles/tile_set_editor.cpp2
-rw-r--r--editor/plugins/tiles/tile_set_scenes_collection_source_editor.cpp11
-rw-r--r--editor/plugins/tiles/tiles_editor_plugin.cpp2
-rw-r--r--editor/project_converter_3_to_4.cpp2062
-rw-r--r--editor/project_converter_3_to_4.h47
-rw-r--r--editor/project_manager.cpp10
-rw-r--r--editor/renames_map_3_to_4.cpp1797
-rw-r--r--editor/renames_map_3_to_4.h (renamed from platform/ios/godot_view_gesture_recognizer.h)34
-rw-r--r--editor/translations/editor/ar.po169
-rw-r--r--editor/translations/editor/bg.po415
-rw-r--r--editor/translations/editor/ca.po64
-rw-r--r--editor/translations/editor/cs.po310
-rw-r--r--editor/translations/editor/de.po510
-rw-r--r--editor/translations/editor/el.po187
-rw-r--r--editor/translations/editor/eo.po63
-rw-r--r--editor/translations/editor/es.po827
-rw-r--r--editor/translations/editor/es_AR.po103
-rw-r--r--editor/translations/editor/fi.po104
-rw-r--r--editor/translations/editor/fr.po422
-rw-r--r--editor/translations/editor/gl.po50
-rw-r--r--editor/translations/editor/he.po83
-rw-r--r--editor/translations/editor/hu.po52
-rw-r--r--editor/translations/editor/id.po205
-rw-r--r--editor/translations/editor/it.po188
-rw-r--r--editor/translations/editor/ja.po2346
-rw-r--r--editor/translations/editor/ko.po117
-rw-r--r--editor/translations/editor/lv.po44
-rw-r--r--editor/translations/editor/ms.po42
-rw-r--r--editor/translations/editor/nb.po30
-rw-r--r--editor/translations/editor/nl.po261
-rw-r--r--editor/translations/editor/pl.po540
-rw-r--r--editor/translations/editor/pt.po112
-rw-r--r--editor/translations/editor/pt_BR.po142
-rw-r--r--editor/translations/editor/ro.po30
-rw-r--r--editor/translations/editor/ru.po2021
-rw-r--r--editor/translations/editor/sk.po35
-rw-r--r--editor/translations/editor/sv.po640
-rw-r--r--editor/translations/editor/th.po94
-rw-r--r--editor/translations/editor/tr.po135
-rw-r--r--editor/translations/editor/uk.po105
-rw-r--r--editor/translations/editor/vi.po82
-rw-r--r--editor/translations/editor/zh_CN.po6814
-rw-r--r--editor/translations/editor/zh_TW.po134
-rw-r--r--editor/translations/properties/de.po225
-rw-r--r--editor/translations/properties/es.po229
-rw-r--r--editor/translations/properties/fr.po529
-rw-r--r--editor/translations/properties/it.po143
-rw-r--r--editor/translations/properties/ja.po324
-rw-r--r--editor/translations/properties/ko.po145
-rw-r--r--editor/translations/properties/pt.po148
-rw-r--r--editor/translations/properties/pt_BR.po159
-rw-r--r--editor/translations/properties/ru.po210
-rw-r--r--editor/translations/properties/uk.po191
-rw-r--r--editor/translations/properties/zh_CN.po3264
-rw-r--r--editor/translations/properties/zh_TW.po230
-rw-r--r--main/main.cpp49
-rw-r--r--modules/csg/csg_shape.cpp24
-rw-r--r--modules/csg/csg_shape.h4
-rw-r--r--modules/gdscript/doc_classes/@GDScript.xml74
-rw-r--r--modules/gdscript/gdscript.cpp1
-rw-r--r--modules/gdscript/gdscript_analyzer.cpp76
-rw-r--r--modules/gdscript/gdscript_analyzer.h11
-rw-r--r--modules/gdscript/gdscript_editor.cpp8
-rw-r--r--modules/gdscript/gdscript_parser.cpp84
-rw-r--r--modules/gdscript/gdscript_tokenizer.cpp17
-rw-r--r--modules/gdscript/gdscript_vm.cpp27
-rw-r--r--modules/gdscript/language_server/gdscript_text_document.cpp1
-rw-r--r--modules/gdscript/tests/scripts/analyzer/features/typed_array_usage.gd3
-rw-r--r--modules/gdscript/tests/scripts/parser/features/allow_id_similar_to_keyword_in_ascii.gd3
-rw-r--r--modules/gdscript/tests/scripts/parser/features/allow_id_similar_to_keyword_in_ascii.out2
-rw-r--r--modules/gdscript/tests/scripts/parser/features/allow_strings_as_comments.gd21
-rw-r--r--modules/gdscript/tests/scripts/parser/features/allow_strings_as_comments.out2
-rw-r--r--modules/gdscript/tests/scripts/parser/features/allowed_keywords_as_identifiers.gd16
-rw-r--r--modules/gdscript/tests/scripts/parser/features/allowed_keywords_as_identifiers.out6
-rw-r--r--modules/gdscript/tests/scripts/parser/warnings/confusable_identifier.gd7
-rw-r--r--modules/gdscript/tests/scripts/parser/warnings/confusable_identifier.out6
-rw-r--r--modules/gdscript/tests/scripts/parser/warnings/standalone_expression.gd1
-rw-r--r--modules/gdscript/tests/scripts/parser/warnings/standalone_expression.out6
-rw-r--r--modules/gltf/editor/editor_scene_importer_blend.cpp7
-rw-r--r--modules/gltf/editor/editor_scene_importer_fbx.cpp7
-rw-r--r--modules/gltf/editor/editor_scene_importer_gltf.cpp24
-rw-r--r--modules/gltf/gltf_document.cpp1
-rw-r--r--modules/mono/editor/GodotTools/GodotTools/Build/BuildInfo.cs10
-rw-r--r--modules/mono/editor/GodotTools/GodotTools/Build/BuildManager.cs4
-rw-r--r--modules/mono/editor/GodotTools/GodotTools/Build/BuildSystem.cs8
-rw-r--r--modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs3
-rw-r--r--modules/mono/glue/GodotSharp/Godot.SourceGenerators.Internal/UnmanagedCallbacksGenerator.cs4
-rw-r--r--modules/mono/glue/GodotSharp/GodotSharp/Core/GodotSynchronizationContext.cs35
-rw-r--r--modules/multiplayer/multiplayer_spawner.cpp18
-rw-r--r--modules/multiplayer/scene_replication_interface.cpp6
-rw-r--r--modules/navigation/godot_navigation_server.cpp2
-rw-r--r--modules/webp/SCsub1
-rw-r--r--modules/websocket/doc_classes/WebSocketMultiplayerPeer.xml2
-rw-r--r--modules/webxr/native/library_godot_webxr.js7
-rw-r--r--platform/android/android_input_handler.cpp62
-rw-r--r--platform/android/android_input_handler.h8
-rw-r--r--platform/android/export/export_plugin.cpp12
-rw-r--r--platform/android/file_access_android.cpp4
-rw-r--r--platform/android/file_access_android.h2
-rw-r--r--platform/android/file_access_filesystem_jandroid.cpp6
-rw-r--r--platform/android/file_access_filesystem_jandroid.h2
-rw-r--r--platform/ios/SCsub1
-rw-r--r--platform/ios/godot_view.h5
-rw-r--r--platform/ios/godot_view.mm82
-rw-r--r--platform/ios/godot_view_gesture_recognizer.mm186
-rw-r--r--platform/linuxbsd/SCsub17
-rw-r--r--platform/linuxbsd/detect.py108
-rw-r--r--platform/linuxbsd/freedesktop_portal_desktop.cpp8
-rw-r--r--platform/linuxbsd/freedesktop_screensaver.cpp8
-rw-r--r--platform/linuxbsd/joypad_linux.cpp6
-rw-r--r--platform/linuxbsd/os_linuxbsd.cpp4
-rw-r--r--platform/linuxbsd/os_linuxbsd.h4
-rw-r--r--platform/linuxbsd/tts_linux.cpp10
-rw-r--r--platform/linuxbsd/tts_linux.h4
-rw-r--r--platform/linuxbsd/x11/SCsub20
-rw-r--r--platform/linuxbsd/x11/detect_prime_x11.cpp6
-rw-r--r--platform/linuxbsd/x11/display_server_x11.cpp31
-rw-r--r--platform/linuxbsd/x11/display_server_x11.h26
-rw-r--r--platform/linuxbsd/x11/gl_manager_x11.h15
-rw-r--r--platform/web/display_server_web.cpp24
-rw-r--r--platform/web/display_server_web.h2
-rw-r--r--platform/windows/display_server_windows.cpp33
-rw-r--r--scene/2d/camera_2d.cpp6
-rw-r--r--scene/2d/camera_2d.h2
-rw-r--r--scene/2d/line_builder.cpp2
-rw-r--r--scene/2d/navigation_agent_2d.cpp18
-rw-r--r--scene/2d/navigation_link_2d.cpp38
-rw-r--r--scene/2d/navigation_link_2d.h6
-rw-r--r--scene/2d/navigation_region_2d.cpp90
-rw-r--r--scene/2d/tile_map.cpp117
-rw-r--r--scene/2d/tile_map.h7
-rw-r--r--scene/3d/decal.cpp2
-rw-r--r--scene/3d/label_3d.cpp12
-rw-r--r--scene/3d/lightmap_gi.cpp3
-rw-r--r--scene/3d/navigation_agent_3d.cpp18
-rw-r--r--scene/3d/navigation_link_3d.cpp38
-rw-r--r--scene/3d/navigation_link_3d.h6
-rw-r--r--scene/animation/animation_blend_tree.cpp54
-rw-r--r--scene/animation/animation_player.cpp2
-rw-r--r--scene/animation/animation_tree.cpp73
-rw-r--r--scene/animation/animation_tree.h14
-rw-r--r--scene/animation/root_motion_view.cpp7
-rw-r--r--scene/animation/tween.cpp30
-rw-r--r--scene/animation/tween.h2
-rw-r--r--scene/gui/aspect_ratio_container.cpp12
-rw-r--r--scene/gui/code_edit.cpp2
-rw-r--r--scene/gui/color_picker.cpp16
-rw-r--r--scene/gui/graph_edit.cpp2
-rw-r--r--scene/gui/label.cpp255
-rw-r--r--scene/gui/label.h7
-rw-r--r--scene/gui/line_edit.cpp10
-rw-r--r--scene/gui/popup.cpp11
-rw-r--r--scene/gui/popup_menu.cpp1
-rw-r--r--scene/gui/rich_text_label.cpp28
-rw-r--r--scene/gui/rich_text_label.h1
-rw-r--r--scene/gui/tab_bar.cpp2
-rw-r--r--scene/gui/tree.cpp8
-rw-r--r--scene/gui/view_panner.cpp2
-rw-r--r--scene/main/canvas_item.cpp5
-rw-r--r--scene/main/viewport.cpp23
-rw-r--r--scene/main/window.cpp23
-rw-r--r--scene/resources/mesh.cpp3
-rw-r--r--scene/resources/primitive_meshes.cpp14
-rw-r--r--scene/resources/surface_tool.cpp4
-rw-r--r--scene/resources/text_file.cpp5
-rw-r--r--scene/resources/text_line.cpp5
-rw-r--r--scene/resources/text_paragraph.cpp12
-rw-r--r--scene/resources/tile_set.cpp52
-rw-r--r--servers/navigation/navigation_utilities.h6
-rw-r--r--servers/navigation_server_2d.cpp38
-rw-r--r--servers/navigation_server_2d.h15
-rw-r--r--servers/navigation_server_3d.cpp58
-rw-r--r--servers/navigation_server_3d.h13
-rw-r--r--servers/navigation_server_3d_dummy.h119
-rw-r--r--servers/physics_2d/godot_step_2d.cpp1
-rw-r--r--servers/physics_2d/godot_step_2d.h1
-rw-r--r--servers/physics_3d/godot_step_3d.cpp1
-rw-r--r--servers/physics_3d/godot_step_3d.h1
-rw-r--r--servers/physics_server_3d.cpp6
-rw-r--r--servers/physics_server_3d.h2
-rw-r--r--servers/rendering/renderer_rd/effects/ss_effects.cpp964
-rw-r--r--servers/rendering/renderer_rd/effects/ss_effects.h77
-rw-r--r--servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp153
-rw-r--r--servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h16
-rw-r--r--servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp1
-rw-r--r--servers/rendering/renderer_rd/renderer_scene_render_rd.cpp2
-rw-r--r--servers/rendering/renderer_rd/shader_rd.cpp1
-rw-r--r--servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl8
-rw-r--r--servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered_inc.glsl7
-rw-r--r--servers/rendering/renderer_rd/storage_rd/material_storage.cpp1
-rw-r--r--servers/rendering/renderer_scene_cull.cpp1
-rw-r--r--servers/rendering/renderer_viewport.cpp18
-rw-r--r--servers/rendering/rendering_device.cpp2
-rw-r--r--servers/rendering/rendering_device.h2
-rw-r--r--servers/rendering/rendering_server_default.h1
-rw-r--r--servers/rendering/shader_compiler.cpp9
-rw-r--r--servers/rendering_server.cpp5
-rw-r--r--servers/rendering_server.h1
-rw-r--r--tests/core/math/test_vector3.h8
-rw-r--r--tests/core/math/test_vector3i.h7
-rw-r--r--tests/core/math/test_vector4.h8
-rw-r--r--tests/core/math/test_vector4i.h8
-rw-r--r--tests/core/string/test_string.h8
-rw-r--r--tests/display_server_mock.h20
-rw-r--r--tests/scene/test_text_edit.h3
-rw-r--r--tests/scene/test_viewport.h718
-rw-r--r--tests/test_macros.h1
-rw-r--r--tests/test_main.cpp4
-rw-r--r--thirdparty/README.md2
-rw-r--r--thirdparty/libwebp/AUTHORS2
-rw-r--r--thirdparty/libwebp/sharpyuv/sharpyuv.c58
-rw-r--r--thirdparty/libwebp/sharpyuv/sharpyuv.h38
-rw-r--r--thirdparty/libwebp/sharpyuv/sharpyuv_cpu.c14
-rw-r--r--thirdparty/libwebp/sharpyuv/sharpyuv_cpu.h22
-rw-r--r--thirdparty/libwebp/sharpyuv/sharpyuv_csp.c2
-rw-r--r--thirdparty/libwebp/sharpyuv/sharpyuv_csp.h7
-rw-r--r--thirdparty/libwebp/sharpyuv/sharpyuv_dsp.c17
-rw-r--r--thirdparty/libwebp/sharpyuv/sharpyuv_dsp.h7
-rw-r--r--thirdparty/libwebp/sharpyuv/sharpyuv_gamma.c1
-rw-r--r--thirdparty/libwebp/sharpyuv/sharpyuv_gamma.h2
-rw-r--r--thirdparty/libwebp/sharpyuv/sharpyuv_neon.c9
-rw-r--r--thirdparty/libwebp/sharpyuv/sharpyuv_sse2.c7
-rw-r--r--thirdparty/libwebp/src/dec/vp8i_dec.h4
-rw-r--r--thirdparty/libwebp/src/dec/vp8l_dec.c2
-rw-r--r--thirdparty/libwebp/src/dec/webp_dec.c2
-rw-r--r--thirdparty/libwebp/src/demux/demux.c4
-rw-r--r--thirdparty/libwebp/src/dsp/alpha_processing_sse2.c12
-rw-r--r--thirdparty/libwebp/src/dsp/alpha_processing_sse41.c2
-rw-r--r--thirdparty/libwebp/src/dsp/cpu.c2
-rw-r--r--thirdparty/libwebp/src/dsp/cpu.h2
-rw-r--r--thirdparty/libwebp/src/dsp/dec_sse2.c93
-rw-r--r--thirdparty/libwebp/src/dsp/dec_sse41.c2
-rw-r--r--thirdparty/libwebp/src/dsp/enc_neon.c9
-rw-r--r--thirdparty/libwebp/src/dsp/enc_sse2.c67
-rw-r--r--thirdparty/libwebp/src/dsp/lossless.c12
-rw-r--r--thirdparty/libwebp/src/dsp/lossless_enc.c18
-rw-r--r--thirdparty/libwebp/src/dsp/lossless_enc_sse2.c8
-rw-r--r--thirdparty/libwebp/src/dsp/lossless_sse2.c88
-rw-r--r--thirdparty/libwebp/src/dsp/lossless_sse41.c7
-rw-r--r--thirdparty/libwebp/src/dsp/quant.h13
-rw-r--r--thirdparty/libwebp/src/dsp/rescaler_sse2.c6
-rw-r--r--thirdparty/libwebp/src/dsp/upsampling_sse2.c2
-rw-r--r--thirdparty/libwebp/src/dsp/yuv_sse2.c13
-rw-r--r--thirdparty/libwebp/src/dsp/yuv_sse41.c6
-rw-r--r--thirdparty/libwebp/src/enc/analysis_enc.c8
-rw-r--r--thirdparty/libwebp/src/enc/picture_csp_enc.c29
-rw-r--r--thirdparty/libwebp/src/enc/vp8i_enc.h4
-rw-r--r--thirdparty/libwebp/src/enc/vp8l_enc.c11
-rw-r--r--thirdparty/libwebp/src/mux/muxi.h4
-rw-r--r--thirdparty/libwebp/src/utils/bit_reader_inl_utils.h4
-rw-r--r--thirdparty/libwebp/src/utils/huffman_utils.c2
-rw-r--r--thirdparty/libwebp/src/utils/utils.h12
-rw-r--r--thirdparty/libwebp/src/webp/format_constants.h2
-rw-r--r--thirdparty/libwebp/src/webp/types.h6
423 files changed, 28975 insertions, 9979 deletions
diff --git a/.github/workflows/linux_builds.yml b/.github/workflows/linux_builds.yml
index 46a9228616..0000a061d7 100644
--- a/.github/workflows/linux_builds.yml
+++ b/.github/workflows/linux_builds.yml
@@ -78,8 +78,8 @@ jobs:
- name: Linux dependencies for tests
if: ${{ matrix.proj-test }}
run: |
+ sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list
sudo add-apt-repository ppa:kisak/kisak-mesa
- sudo apt-get update
sudo apt-get install -qq mesa-vulkan-drivers
- name: Setup Godot build cache
diff --git a/.github/workflows/static_checks.yml b/.github/workflows/static_checks.yml
index a3722e19ce..6c92922185 100644
--- a/.github/workflows/static_checks.yml
+++ b/.github/workflows/static_checks.yml
@@ -15,9 +15,9 @@ jobs:
- name: Install dependencies
run: |
+ sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
sudo apt-add-repository "deb http://apt.llvm.org/focal/ llvm-toolchain-focal-15 main"
- sudo apt-get update
sudo apt-get install -qq dos2unix clang-format-15 libxml2-utils python3-pip moreutils
sudo update-alternatives --remove-all clang-format || true
sudo update-alternatives --install /usr/bin/clang-format clang-format /usr/bin/clang-format-15 100
diff --git a/core/core_bind.cpp b/core/core_bind.cpp
index c752bdd057..f2eb7823e2 100644
--- a/core/core_bind.cpp
+++ b/core/core_bind.cpp
@@ -1590,8 +1590,12 @@ Vector<String> Engine::get_singleton_list() const {
return ret;
}
-void Engine::register_script_language(ScriptLanguage *p_language) {
- ScriptServer::register_language(p_language);
+Error Engine::register_script_language(ScriptLanguage *p_language) {
+ return ScriptServer::register_language(p_language);
+}
+
+Error Engine::unregister_script_language(const ScriptLanguage *p_language) {
+ return ScriptServer::unregister_language(p_language);
}
int Engine::get_script_language_count() {
@@ -1662,6 +1666,7 @@ void Engine::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_singleton_list"), &Engine::get_singleton_list);
ClassDB::bind_method(D_METHOD("register_script_language", "language"), &Engine::register_script_language);
+ ClassDB::bind_method(D_METHOD("unregister_script_language", "language"), &Engine::unregister_script_language);
ClassDB::bind_method(D_METHOD("get_script_language_count"), &Engine::get_script_language_count);
ClassDB::bind_method(D_METHOD("get_script_language", "index"), &Engine::get_script_language);
diff --git a/core/core_bind.h b/core/core_bind.h
index 8852463234..675da48591 100644
--- a/core/core_bind.h
+++ b/core/core_bind.h
@@ -499,7 +499,8 @@ public:
void unregister_singleton(const StringName &p_name);
Vector<String> get_singleton_list() const;
- void register_script_language(ScriptLanguage *p_language);
+ Error register_script_language(ScriptLanguage *p_language);
+ Error unregister_script_language(const ScriptLanguage *p_language);
int get_script_language_count();
ScriptLanguage *get_script_language(int p_index) const;
diff --git a/core/input/gamecontrollerdb.txt b/core/input/gamecontrollerdb.txt
index dcb6aefb00..59461959d5 100644
--- a/core/input/gamecontrollerdb.txt
+++ b/core/input/gamecontrollerdb.txt
@@ -69,7 +69,7 @@
03000000c82d00000121000000000000,8BitDo SN30 Pro for Android,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
03000000c82d00000260000000000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,
03000000c82d00000261000000000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,
-03000000c82d00001130000000000000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
+03000000c82d00001130000000000000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b26,paddle1:b24,paddle2:b25,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
03000000c82d00001230000000000000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
03000000c82d00001330000000000000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows,
03000000a00500003232000000000000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows,
@@ -383,7 +383,7 @@
0300000079000000d218000000000000,Mayflash Magic NS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
03000000d620000010a7000000000000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
03000000790000007918000000000000,Mayflash N64 Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,righttrigger:b7,rightx:a3,righty:a2,start:b8,platform:Windows,
-030000008f0e00001030000000000000,Mayflash Sega Saturn Adapter,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,rightshoulder:b2,righttrigger:b7,start:b9,x:b3,y:b4,platform:Windows,
+030000008f0e00001030000000000000,Mayflash Saturn Adapter,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:b7,rightshoulder:b6,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows,
0300000025090000e803000000000000,Mayflash Wii Classic Adapter,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:a5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows,
03000000790000000318000000000000,Mayflash Wii DolphinBar,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows,
03000000790000000018000000000000,Mayflash Wii U Pro Adapter,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
@@ -407,7 +407,6 @@
03000000c62400002b89000000000000,Moga XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
03000000c62400001a89000000000000,Moga XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
03000000c62400001b89000000000000,Moga XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
-03000000efbe0000edfe000000000000,Monect Virtual Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Windows,
03000000250900006688000000000000,MP-8866 Super Dual Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,
03000000091200004488000000000000,MUSIA PlayStation 2 Input Display,a:b0,b:b2,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b6,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b7,righttrigger:b11,rightx:a2,righty:a3,start:b5,x:b1,y:b3,platform:Windows,
03000000f70600000100000000000000,N64 Adaptoid,+rightx:b2,+righty:b1,-rightx:b4,-righty:b5,a:b0,b:b3,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b7,start:b8,platform:Windows,
@@ -484,8 +483,8 @@
030000004c0500006802000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b10,lefttrigger:a3~,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:a4~,rightx:a2,righty:a5,start:b8,x:b3,y:b0,platform:Windows,
030000004f1f00000800000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,
03000000632500007505000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
-03000000888800000803000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b9,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows,
-03000000888800000804000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,leftshoulder:b10,leftstick:b1,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Windows,
+03000000888800000803000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b9,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b0,platform:Windows,
+03000000888800000804000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Windows,
030000008f0e00000300000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows,
030000008f0e00001431000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
03000000ba2200002010000000000000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b3,y:b2,platform:Windows,
@@ -542,8 +541,9 @@
030000009b2800005600000000000000,Raphnet SNES Adapter,a:b1,b:b4,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Windows,
030000009b2800005700000000000000,Raphnet SNES Adapter,a:b1,b:b4,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Windows,
030000009b2800001e00000000000000,Raphnet Vectrex Adapter,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a1,lefty:a2,x:b2,y:b3,platform:Windows,
-030000009b2800002b00000000000000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Windows,
-030000009b2800002c00000000000000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Windows,
+030000009b2800002b00000000000000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Windows,
+030000009b2800002c00000000000000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Windows,
+030000009b2800008000000000000000,Raphnet Wii Classic Adapter,a:b1,b:b4,x:b0,y:b5,back:b2,guide:b10,start:b3,leftshoulder:b6,rightshoulder:b7,dpup:b12,dpleft:b14,dpdown:b13,dpright:b15,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:b8,righttrigger:b9,platform:Windows,
03000000321500000003000000000000,Razer Hydra,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
03000000321500000204000000000000,Razer Panthera PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
03000000321500000104000000000000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
@@ -574,7 +574,7 @@
030000006f0e00001e01000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
030000006f0e00002801000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
030000006f0e00002f01000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
-030000006f0e00008701000000000000,Rock Candy Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
+030000006f0e00008701000000000000,Rock Candy Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
03000000050b0000e318000000000000,ROG Chakram,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows,
03000000050b0000e518000000000000,ROG Chakram,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows,
03000000050b00005819000000000000,ROG Chakram Core,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows,
@@ -678,7 +678,7 @@
030000004f04000087b6000000000000,TWCS Throttle,dpdown:b8,dpleft:b9,dpright:b7,dpup:b6,leftstick:b5,lefttrigger:-a5,leftx:a0,lefty:a1,righttrigger:+a5,platform:Windows,
03000000411200000450000000000000,Twin Shock,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a4,start:b11,x:b3,y:b0,platform:Windows,
03000000d90400000200000000000000,TwinShock PS2 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows,
-03000000151900005678000000000000,Uniplay U6,a:b0,b:b1,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b10,x:b3,y:b4,platform:Windows,
+03000000151900005678000000000000,Uniplay U6,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
03000000101c0000171c000000000000,uRage Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
030000000b0400003065000000000000,USB Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows,
03000000242f00006e00000000000000,USB Controller,a:b1,b:b4,back:b10,leftshoulder:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b7,rightx:a2,righty:a5,start:b11,x:b0,y:b3,platform:Windows,
@@ -798,7 +798,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
03000000c82d00000161000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Mac OS X,
03000000c82d00000260000001000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,
03000000c82d00000261000000010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,
-03000000c82d00001130000000020000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
+03000000c82d00001130000000020000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b24,paddle2:b25,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
03000000c82d00001330000001000000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
03000000c82d00001330000000020000,8BitDo Ultimate Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
03000000a00500003232000008010000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X,
@@ -843,6 +843,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
030000000d0f00005e00000000010000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
030000000d0f00008400000000010000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
030000000d0f00008500000000010000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
+03000000341a00000302000014010000,Hori Fighting Stick Mini,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,
030000000d0f00008800000000010000,Hori Fighting Stick mini 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,
030000000d0f00008700000000010000,Hori Fighting Stick mini 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,
030000000d0f00004d00000000000000,Hori Gem Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
@@ -881,6 +882,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
03000000242f00007300000000020000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Mac OS X,
0300000079000000d218000026010000,Mayflash Magic NS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,
03000000d620000010a7000003010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
+030000008f0e00001030000011010000,Mayflash Saturn Adapter,a:b0,b:b2,dpdown:b28,dpleft:b30,dpright:b26,dpup:b24,leftshoulder:b10,lefttrigger:b14,rightshoulder:b12,righttrigger:b4,start:b18,x:b6,y:b8,platform:Mac OS X,
0300000025090000e803000000000000,Mayflash Wii Classic Adapter,a:b1,b:b0,back:b8,dpdown:b13,dpleft:b12,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Mac OS X,
03000000790000000318000000010000,Mayflash Wii DolphinBar,a:b8,b:b12,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b44,leftshoulder:b16,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b4,platform:Mac OS X,
03000000790000000018000000000000,Mayflash Wii U Pro Adapter,a:b4,b:b8,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b16,leftstick:b40,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,rightstick:b44,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b12,platform:Mac OS X,
@@ -897,6 +899,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
03000000d620000011a7000010050000,Nintendo Switch PowerA Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
030000007e0500000920000000000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,
030000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,
+050000007e05000009200000ff070000,Nintendo Switch Pro Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b3,y:b2,platform:Mac OS X,
030000007e0500001920000001000000,NSO N64 Controller,+rightx:b8,+righty:b7,-rightx:b3,-righty:b2,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,righttrigger:b10,start:b9,platform:Mac OS X,
030000007e0500001720000001000000,NSO SNES Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b15,start:b9,x:b2,y:b3,platform:Mac OS X,
03000000550900001472000025050000,NVIDIA Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Mac OS X,
@@ -919,6 +922,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
030000004c050000f20d000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
050000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
050000004c050000f20d000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
+030000005e040000e002000001000000,PXN P30 Pro Mobile,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Mac OS X,
03000000222c00000225000000010000,Qanba Dragon Arcade Joystick (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
03000000222c00000020000000010000,Qanba Drone Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
030000008916000000fd000000000000,Razer Onza TE,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
@@ -940,7 +944,9 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
03000000341200000400000000000000,RetroUSB N64 RetroPort,+rightx:b8,+righty:b10,-rightx:b9,-righty:b11,a:b7,b:b6,dpdown:b2,dpleft:b1,dpright:b0,dpup:b3,leftshoulder:b13,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b12,start:b4,platform:Mac OS X,
030000006b140000010d000000010000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
030000006b140000130d000000010000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
+030000004c0500006802000002100000,Rii RK707,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b2,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b3,righttrigger:b9,rightx:a2,righty:a3,start:b1,x:b15,y:b12,platform:Mac OS X,
03000000c6240000fefa000000000000,Rock Candy PS3,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
+030000006f0e00008701000005010000,Rock Candy Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
03000000730700000401000000010000,Sanwa PlayOnline Mobile,a:b0,b:b1,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Mac OS X,
03000000a30c00002500000006020000,Sega Genesis Mini 3B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,righttrigger:b5,start:b9,platform:Mac OS X,
03000000811700007e05000000000000,Sega Saturn,a:b2,b:b4,dpdown:b16,dpleft:b15,dpright:b14,dpup:b17,leftshoulder:b8,lefttrigger:a5,leftx:a0,lefty:a2,rightshoulder:b9,righttrigger:a4,start:b13,x:b0,y:b6,platform:Mac OS X,
@@ -973,6 +979,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
030000005f140000c501000000020000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,
03000000100800000100000000000000,Twin USB Joystick,a:b4,b:b2,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b12,leftstick:b20,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b14,rightstick:b22,righttrigger:b10,rightx:a6,righty:a4,start:b18,x:b6,y:b0,platform:Mac OS X,
03000000632500002605000000010000,Uberwith Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
+03000000151900005678000010010000,Uniplay U6,a:b3,b:b6,back:b25,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b17,leftstick:b31,lefttrigger:b21,leftx:a1,lefty:a3,rightshoulder:b19,rightstick:b33,righttrigger:b23,rightx:a4,righty:a5,start:b27,x:b11,y:b13,platform:Mac OS X,
030000006f0e00000302000025040000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,
030000006f0e00000702000003060000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,
050000005769696d6f74652028303000,Wii Remote,a:b4,b:b5,back:b7,dpdown:b3,dpleft:b0,dpright:b1,dpup:b2,guide:b8,leftshoulder:b11,lefttrigger:b12,leftx:a0,lefty:a1,start:b6,x:b10,y:b9,platform:Mac OS X,
@@ -985,6 +992,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
030000005e040000130b000011050000,Xbox One Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
030000005e040000200b000011050000,Xbox One Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
030000005e040000200b000013050000,Xbox One Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
+030000005e040000200b000015050000,Xbox One Controller,a:b0,b:b1,x:b3,y:b4,back:b10,guide:b12,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,platform:Mac OS X,
030000005e040000d102000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
030000005e040000dd02000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
030000005e040000e002000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Mac OS X,
@@ -1029,8 +1037,11 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
03000000c82d00000751000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:a8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
05000000c82d00000851000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:a8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
03000000c82d00000660000011010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
-03000000c82d00001030000011010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
05000000c82d00000660000000010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
+03000000c82d00000631000014010000,8BitDo Pro 2 Wired Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
+03000000c82d00001030000011010000,8BitDo Pro 2 Wired Controller,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
+03000000c82d00000020000000000000,8BitDo Pro 2 Wired Controller for Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
+06000000c82d00000020000006010000,8BitDo Pro 2 Wired Controller for Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000c82d00000131000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
03000000c82d00000231000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
03000000c82d00000331000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
@@ -1053,7 +1064,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
03000000c82d00000260000011010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
05000000c82d00000261000000010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
05000000202800000900000000010000,8BitDo SNES30,a:b1,b:b0,back:b10,dpdown:b122,dpleft:b119,dpright:b120,dpup:b117,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux,
-03000000c82d00001130000011010000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
+03000000c82d00001130000011010000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b24,paddle2:b25,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
03000000c82d00000760000011010000,8BitDo Ultimate Wireless,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
03000000c82d00001230000011010000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
03000000c82d00001330000011010000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
@@ -1116,12 +1127,14 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
03000000430b00000300000000010000,EMS Production PS2 Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a5,righty:a2,start:b9,x:b3,y:b0,platform:Linux,
03000000b40400001124000011010000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
05000000151900004000000001000000,Flydigi Vader 2,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
+030000007e0500003703000000000000,GameCube Adapter,a:b0,b:b1,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux,
19000000030000000300000002030000,GameForce Controller,a:b1,b:b0,back:b8,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b14,lefttrigger:b6,leftx:a1,lefty:a0,rightshoulder:b5,rightstick:b15,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux,
03000000ac0500005b05000010010000,GameSir G3w,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
03000000bc2000000055000011010000,GameSir G3w,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
03000000558500001b06000010010000,GameSir G4 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
05000000ac0500002d0200001b010000,GameSir G4s,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b33,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
03000000bc2000005656000011010000,GameSir T4w,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
+03000000ac0500001a06000011010000,GameSir-T3 2.02,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
030000006f0e00000104000000010000,Gamestop Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000008f0e00000800000010010000,Gasia PlayStation Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
@@ -1149,6 +1162,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
030000000d0f00005001000009040000,Hori Fighting Commander OCTA Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000000d0f00008500000010010000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
030000000d0f00008600000002010000,Hori Fighting Commander Xbox 360,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
+030000000d0f00003701000013010000,Hori Fighting Stick Mini,a:b1,b:b0,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b3,y:b2,platform:Linux,
030000000d0f00008800000011010000,Hori Fighting Stick mini 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
030000000d0f00008700000011010000,Hori Fighting Stick mini 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,rightshoulder:b5,rightstick:b11,righttrigger:a4,start:b9,x:b0,y:b3,platform:Linux,
030000000d0f00001000000011010000,Hori Fightstick 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
@@ -1173,6 +1187,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
05000000242e00000b20000001000000,Hyperkin Admiral N64 Controller,+rightx:b11,+righty:b13,-rightx:b8,-righty:b12,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,platform:Linux,
03000000242e0000ff0b000011010000,Hyperkin N64 Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,platform:Linux,
03000000242e00008816000001010000,Hyperkin X91,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
+03000000f00300008d03000011010000,HyperX Clutch,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
03000000830500006020000010010000,iBuffalo SNES Controller,a:b1,b:b0,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Linux,
050000006964726f69643a636f6e0000,idroidcon Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
03000000b50700001503000010010000,Impact,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux,
@@ -1230,8 +1245,10 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
0300000079000000d218000011010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
03000000d620000010a7000011010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
03000000242f0000f700000001010000,Mayflash Magic S Pro,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
+030000008f0e00001030000010010000,Mayflash Saturn Adapter,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:b7,rightshoulder:b6,righttrigger:b2,start:b9,x:b3,y:b4,platform:Linux,
0300000025090000e803000001010000,Mayflash Wii Classic Adapter,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:a5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux,
03000000790000000318000011010000,Mayflash Wii DolphinBar,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Linux,
+03000000790000000018000011010000,Mayflash Wii U Pro Adapter,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
03000000b50700001203000010010000,Mega World Logic 3 Controller,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux,
03000000780000000600000010010000,Microntek Joystick,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux,
030000005e0400002800000000010000,Microsoft Dual Strike,a:b3,b:b2,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,rightshoulder:b7,rightx:a0,righty:a1~,start:b5,x:b1,y:b0,platform:Linux,
@@ -1276,12 +1293,14 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
030000009b2800008000000020020000,Nintendo Classic Controller,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Linux,
030000007e0500003703000000016800,Nintendo GameCube Controller,a:b0,b:b2,dpdown:b6,dpleft:b4,dpright:b5,dpup:b7,lefttrigger:a4,leftx:a0,lefty:a1~,rightshoulder:b9,righttrigger:a5,rightx:a2,righty:a3~,start:b8,x:b1,y:b3,platform:Linux,
03000000790000004618000010010000,Nintendo GameCube Controller Adapter,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a5~,righty:a2~,start:b9,x:b2,y:b3,platform:Linux,
+060000004e696e74656e646f20537700,Nintendo Switch Combined Joy-Cons,a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux,
060000007e0500000620000000000000,Nintendo Switch Combined Joy-Cons,a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux,
060000007e0500000820000000000000,Nintendo Switch Combined Joy-Cons,a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux,
050000004c69632050726f20436f6e00,Nintendo Switch Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
050000007e0500000620000001800000,Nintendo Switch Left Joy-Con,a:b16,b:b15,back:b4,leftshoulder:b6,leftstick:b12,leftx:a1,lefty:a0~,rightshoulder:b8,start:b9,x:b14,y:b17,platform:Linux,
03000000d620000013a7000011010000,Nintendo Switch PowerA Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
03000000d620000011a7000011010000,Nintendo Switch PowerA Core Plus Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
+030000007e0500000920000000026803,Nintendo Switch Pro Controller,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Linux,
030000007e0500000920000011810000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux,
050000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
050000007e0500000920000001800000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux,
@@ -1312,7 +1331,6 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
030000006f0e0000c802000012010000,PDP Kingdom Hearts Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000006f0e00008501000011010000,PDP Nintendo Switch Fightpad Pro,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
030000006f0e00002801000011010000,PDP PS3 Rock Candy Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
-030000006f0e00008701000011010000,PDP Rock Nintendo Switch Candy Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
030000006f0e00000901000011010000,PDP Versus Fighting,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
030000006f0e0000a802000023020000,PDP Xbox One Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
030000006f0e0000a702000023020000,PDP Xbox One Raven Black,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
@@ -1330,6 +1348,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
03000000d62000000228000001010000,PowerA Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000c62400001a54000001010000,PowerA Xbox One Mini Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000d62000000240000001010000,PowerA Xbox One Spectra Infinity,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
+03000000d62000000f20000001010000,PowerA Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b7,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000006d040000d2ca000011010000,Precision Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
03000000ff1100004133000010010000,PS2 Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux,
03000000341a00003608000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
@@ -1369,6 +1388,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
03000000300f00001211000011010000,Qanba Arcade Joystick,a:b2,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b5,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b6,start:b9,x:b1,y:b3,platform:Linux,
03000000222c00000225000011010000,Qanba Dragon Arcade Joystick (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
03000000222c00000025000011010000,Qanba Dragon Arcade Joystick (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
+03000000222c00000020000011010000,Qanba Drone Arcade PS4 Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,rightshoulder:b5,righttrigger:a4,start:b9,x:b0,y:b3,platform:Linux,
03000000300f00001210000010010000,Qanba Joystick Plus,a:b0,b:b1,back:b8,leftshoulder:b5,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b6,start:b9,x:b2,y:b3,platform:Linux,
03000000222c00000223000011010000,Qanba Obsidian Arcade Joystick (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
03000000222c00000023000011010000,Qanba Obsidian Arcade Joystick (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
@@ -1400,6 +1420,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
030000006b140000130d000011010000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
030000006f0e00001f01000000010000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000006f0e00001e01000011010000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
+030000006f0e00008701000011010000,Rock Candy Switch Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
03000000c6240000fefa000000010000,Rock Candy Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000006f0e00004601000001010000,Rock Candy Xbox One Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000a306000023f6000011010000,Saitek Cyborg V1 PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux,
@@ -1429,6 +1450,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
030000005e0400008e02000073050000,Speedlink Torid,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000005e0400008e02000020200000,SpeedLink Xeox Pro Analog,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000d11800000094000011010000,Stadia Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux,
+05000000d11800000094000000010000,Stadia Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux,
03000000de2800000112000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux,
03000000de2800000112000011010000,Steam Controller,a:b2,b:b3,back:b10,dpdown:+a5,dpleft:-a4,dpright:+a4,dpup:-a5,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a7,leftx:a0,lefty:a1,paddle1:b15,paddle2:b16,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a3,start:b11,x:b4,y:b5,platform:Linux,
03000000de2800000211000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux,
@@ -1482,6 +1504,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
03000000f00600000300000003000000,TRBot Virtual Joypad,a:b11,b:b12,back:b15,dpdown:b6,dpleft:b3,dpright:b4,dpup:b5,leftshoulder:b17,leftstick:b21,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b22,righttrigger:a2,rightx:a3,righty:a4,start:b16,x:b13,y:b14,platform:Linux,
030000005f140000c501000010010000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
03000000100800000100000010010000,Twin PS2 Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,
+03000000151900005678000010010000,Uniplay U6,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
03000000100800000300000010010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,
03000000790000000600000007010000,USB gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Linux,
03000000790000001100000000010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:a0,dpleft:a1,dpright:a2,dpup:a4,start:b9,platform:Linux,
@@ -1656,9 +1679,11 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
6d6179666c617368206c696d69746564,Mayflash GameCube Adapter,a:b22,b:b21,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a5,righty:a2,start:b30,x:b23,y:b24,platform:Android,
436f6e74726f6c6c6572000000000000,Mayflash N64 Adapter,a:b1,b:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android,
65666330633838383061313633326461,Mayflash N64 Adapter,a:b1,b:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android,
+37316565396364386635383230353365,Mayflash Saturn Adapter,a:b21,b:b22,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android,
+4875694a696120205553422047616d65,Mayflash Saturn Adapter,a:b21,b:b22,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android,
535a4d792d706f776572204c54442043,Mayflash Wii Classic Adapter,a:b23,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b31,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android,
30653962643666303631376438373532,Mayflash Wii DolphinBar,a:b23,b:b24,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b0,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android,
-484a5a204d6179666c61736820576969,Mayflash Wii DolphinBar,a:b23,b:b24,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b0,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android,
+39346131396233376535393665363161,Mayflash Wii U Pro Adapter,a:b22,b:b23,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,leftstick:b31,lefttrigger:b27,rightshoulder:b26,rightstick:b0,righttrigger:b28,rightx:a0,righty:a1,start:b30,x:b21,y:b24,platform:Android,
31323564663862633234646330373138,Mega Drive,a:b23,b:b22,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b25,righttrigger:b26,start:b30,x:b24,y:b21,platform:Android,
37333564393261653735306132613061,Mega Drive,a:b21,b:b22,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android,
64363363336633363736393038313464,Mega Drive,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b2,y:b3,platform:Android,
@@ -1737,10 +1762,10 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
5365616c6965436f6d707574696e6720,RetroUSB N64 RetroPort,+rightx:b17,+righty:b15,-rightx:b18,-righty:b6,a:b10,b:b9,dpdown:b19,dpleft:b1,dpright:b0,dpup:b2,leftshoulder:b7,lefttrigger:b20,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Android,
526574726f5553422e636f6d20534e45,RetroUSB SNES RetroPort,a:b1,b:b20,back:b19,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b2,x:b0,y:b3,platform:Android,
64643037633038386238303966376137,RetroUSB SNES RetroPort,a:b1,b:b20,back:b19,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b2,x:b0,y:b3,platform:Android,
+37656564346533643138636436356230,Rock Candy Switch Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b7,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
33373336396634316434323337666361,RumblePad 2,a:b22,b:b23,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b24,platform:Android,
66386565396238363534313863353065,Sanwa PlayOnline Mobile,a:b21,b:b22,back:b23,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b24,platform:Android,
32383165316333383766336338373261,Saturn,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:a4,righttrigger:a5,x:b2,y:b3,platform:Android,
-37316565396364386635383230353365,Saturn,a:b21,b:b22,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android,
38613865396530353338373763623431,Saturn,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,lefttrigger:b10,rightshoulder:b20,righttrigger:b19,start:b17,x:b2,y:b3,platform:Android,
61316232336262373631343137633631,Saturn,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:a4,righttrigger:a5,x:b2,y:b3,platform:Android,
30353835333338613130373363646337,SG H510,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android,
@@ -1753,6 +1778,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
63303964303462366136616266653561,Sony PSP,a:b21,b:b22,back:b27,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,leftx:a0,lefty:a1,rightshoulder:b26,start:b28,x:b23,y:b24,platform:Android,
63376637643462343766333462383235,Sony Vita,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a3,righty:a4,start:b18,x:b0,y:b2,platform:Android,
476f6f676c65204c4c43205374616469,Stadia Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
+5374616469614e3848532d6532633400,Stadia Controller,a:b0,b:b1,back:b15,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Android,
05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Android,
0500000011010000201400000f7e0f00,SteelSeries Nimbus,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,x:b19,y:b2,platform:Android,
diff --git a/core/input/godotcontrollerdb.txt b/core/input/godotcontrollerdb.txt
index e11099f380..eb4a1a1578 100644
--- a/core/input/godotcontrollerdb.txt
+++ b/core/input/godotcontrollerdb.txt
@@ -32,7 +32,7 @@ Linux046dc216,046d-c216-Logitech Logitech Dual Action,a:b1,b:b2,y:b3,x:b0,start:
Linux20d6a713,Bensussen Deutsch & Associates Inc.(BDA) NSW Wired controller,a:b1,b:b2,y:b3,x:b0,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:-a5,dpleft:-a4,dpdown:+a5,dpright:+a4,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Web
Linux054c05c4,Sony Computer Entertainment Wireless Controller,a:b0,b:b1,y:b2,x:b3,start:b9,back:b8,leftstick:b11,rightstick:b12,leftshoulder:b4,rightshoulder:b5,dpup:-a7,dpleft:-a6,dpdown:+a7,dpright:+a6,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Web
Linux18d19400,18d1-9400-Google LLC Stadia Controller rev. A,a:b0,b:b1,y:b3,x:b2,start:b7,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:-a7,dpleft:-a6,dpdown:+a7,dpright:+a6,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,platform:Web
-Linux054c0268,054c-0268-Sony PLAYSTATION(R)3 Controller,a:b0,b:b1,y:b2,x:b3,start:b9,back:b8,leftstick:b11,rightstick:b12,leftshoulder:b4,rightshoulder:b5,dpup:b13,dpleft:b15,dpdown:b14,dpright:b16,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Web
+Linux054c0268,054c-0268-Sony PLAYSTATION(R)3 Controller,a:b0,b:b1,y:b2,x:b3,start:b9,guide:b10,back:b8,leftstick:b11,rightstick:b12,leftshoulder:b4,rightshoulder:b5,dpup:b13,dpleft:b15,dpdown:b14,dpright:b16,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Web
# UWP
__UWP_GAMEPAD__,Xbox Controller,a:b2,b:b3,x:b4,y:b5,start:b0,back:b1,leftstick:b12,rightstick:b13,leftshoulder:b10,rightshoulder:b11,dpup:b6,dpdown:b7,dpleft:b8,dpright:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,platform:UWP,
diff --git a/core/input/input.cpp b/core/input/input.cpp
index 071d9ba648..b2164b8e76 100644
--- a/core/input/input.cpp
+++ b/core/input/input.cpp
@@ -231,14 +231,17 @@ Input::VelocityTrack::VelocityTrack() {
bool Input::is_anything_pressed() const {
_THREAD_SAFE_METHOD_
+ if (!keys_pressed.is_empty() || !joy_buttons_pressed.is_empty() || !mouse_button_mask.is_empty()) {
+ return true;
+ }
+
for (const KeyValue<StringName, Input::Action> &E : action_state) {
if (E.value.pressed) {
return true;
}
}
- return !keys_pressed.is_empty() ||
- !joy_buttons_pressed.is_empty() ||
- !mouse_button_mask.is_empty();
+
+ return false;
}
bool Input::is_key_pressed(Key p_keycode) const {
@@ -1362,8 +1365,9 @@ void Input::parse_mapping(String p_mapping) {
JoyButton output_button = _get_output_button(output);
JoyAxis output_axis = _get_output_axis(output);
- ERR_CONTINUE_MSG(output_button == JoyButton::INVALID && output_axis == JoyAxis::INVALID,
- vformat("Unrecognized output string \"%s\" in mapping:\n%s", output, p_mapping));
+ if (output_button == JoyButton::INVALID && output_axis == JoyAxis::INVALID) {
+ print_verbose(vformat("Unrecognized output string \"%s\" in mapping:\n%s", output, p_mapping));
+ }
ERR_CONTINUE_MSG(output_button != JoyButton::INVALID && output_axis != JoyAxis::INVALID,
vformat("Output string \"%s\" matched both button and axis in mapping:\n%s", output, p_mapping));
diff --git a/core/input/input_event.cpp b/core/input/input_event.cpp
index 7c4642a8a5..a6c1bb168c 100644
--- a/core/input/input_event.cpp
+++ b/core/input/input_event.cpp
@@ -1186,14 +1186,14 @@ static const char *_joy_button_descriptions[(size_t)JoyButton::SDL_MAX] = {
};
String InputEventJoypadButton::as_text() const {
- String text = "Joypad Button " + itos((int64_t)button_index);
+ String text = vformat(RTR("Joypad Button %d"), (int64_t)button_index);
if (button_index > JoyButton::INVALID && button_index < JoyButton::SDL_MAX) {
- text += vformat(" (%s)", _joy_button_descriptions[(size_t)button_index]);
+ text += vformat(" (%s)", TTRGET(_joy_button_descriptions[(size_t)button_index]));
}
if (pressure != 0) {
- text += ", Pressure:" + String(Variant(pressure));
+ text += ", " + RTR("Pressure:") + " " + String(Variant(pressure));
}
return text;
diff --git a/core/io/file_access.cpp b/core/io/file_access.cpp
index cacbcb28a4..0e9084de84 100644
--- a/core/io/file_access.cpp
+++ b/core/io/file_access.cpp
@@ -856,6 +856,8 @@ void FileAccess::_bind_methods() {
ClassDB::bind_method(D_METHOD("store_pascal_string", "string"), &FileAccess::store_pascal_string);
ClassDB::bind_method(D_METHOD("get_pascal_string"), &FileAccess::get_pascal_string);
+ ClassDB::bind_method(D_METHOD("close"), &FileAccess::close);
+
ClassDB::bind_static_method("FileAccess", D_METHOD("file_exists", "path"), &FileAccess::exists);
ClassDB::bind_static_method("FileAccess", D_METHOD("get_modified_time", "file"), &FileAccess::get_modified_time);
diff --git a/core/io/file_access.h b/core/io/file_access.h
index 3e51ba11ed..47770cad87 100644
--- a/core/io/file_access.h
+++ b/core/io/file_access.h
@@ -166,6 +166,8 @@ public:
void store_var(const Variant &p_var, bool p_full_objects = false);
+ virtual void close() = 0;
+
virtual bool file_exists(const String &p_name) = 0; ///< return true if a file exists
virtual Error reopen(const String &p_path, int p_mode_flags); ///< does not change the AccessType
diff --git a/core/io/file_access_compressed.cpp b/core/io/file_access_compressed.cpp
index c256668af0..da59ae8c59 100644
--- a/core/io/file_access_compressed.cpp
+++ b/core/io/file_access_compressed.cpp
@@ -385,6 +385,10 @@ Error FileAccessCompressed::_set_unix_permissions(const String &p_file, uint32_t
return FAILED;
}
+void FileAccessCompressed::close() {
+ _close();
+}
+
FileAccessCompressed::~FileAccessCompressed() {
_close();
}
diff --git a/core/io/file_access_compressed.h b/core/io/file_access_compressed.h
index 136fcede06..601b74a9c1 100644
--- a/core/io/file_access_compressed.h
+++ b/core/io/file_access_compressed.h
@@ -97,6 +97,8 @@ public:
virtual uint32_t _get_unix_permissions(const String &p_file) override;
virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override;
+ virtual void close() override;
+
FileAccessCompressed() {}
virtual ~FileAccessCompressed();
};
diff --git a/core/io/file_access_encrypted.cpp b/core/io/file_access_encrypted.cpp
index 8282f2515c..c39d19d52b 100644
--- a/core/io/file_access_encrypted.cpp
+++ b/core/io/file_access_encrypted.cpp
@@ -294,6 +294,10 @@ Error FileAccessEncrypted::_set_unix_permissions(const String &p_file, uint32_t
return ERR_UNAVAILABLE;
}
+void FileAccessEncrypted::close() {
+ _close();
+}
+
FileAccessEncrypted::~FileAccessEncrypted() {
_close();
}
diff --git a/core/io/file_access_encrypted.h b/core/io/file_access_encrypted.h
index d8cd0df6d1..9702b5a517 100644
--- a/core/io/file_access_encrypted.h
+++ b/core/io/file_access_encrypted.h
@@ -88,6 +88,8 @@ public:
virtual uint32_t _get_unix_permissions(const String &p_file) override;
virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override;
+ virtual void close() override;
+
FileAccessEncrypted() {}
~FileAccessEncrypted();
};
diff --git a/core/io/file_access_memory.h b/core/io/file_access_memory.h
index adc29f74be..43fe6ab658 100644
--- a/core/io/file_access_memory.h
+++ b/core/io/file_access_memory.h
@@ -71,6 +71,8 @@ public:
virtual uint32_t _get_unix_permissions(const String &p_file) override { return 0; }
virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override { return FAILED; }
+ virtual void close() override {}
+
FileAccessMemory() {}
};
diff --git a/core/io/file_access_network.cpp b/core/io/file_access_network.cpp
index e765eb2d42..7fabff26ac 100644
--- a/core/io/file_access_network.cpp
+++ b/core/io/file_access_network.cpp
@@ -469,6 +469,15 @@ void FileAccessNetwork::configure() {
GLOBAL_DEF(PropertyInfo(Variant::INT, "network/remote_fs/page_read_ahead", PROPERTY_HINT_RANGE, "0,8,1,or_greater"), 4);
}
+void FileAccessNetwork::close() {
+ _close();
+
+ FileAccessNetworkClient *nc = FileAccessNetworkClient::singleton;
+ nc->lock_mutex();
+ nc->accesses.erase(id);
+ nc->unlock_mutex();
+}
+
FileAccessNetwork::FileAccessNetwork() {
FileAccessNetworkClient *nc = FileAccessNetworkClient::singleton;
nc->lock_mutex();
diff --git a/core/io/file_access_network.h b/core/io/file_access_network.h
index 16e8920114..78c19347ce 100644
--- a/core/io/file_access_network.h
+++ b/core/io/file_access_network.h
@@ -156,6 +156,8 @@ public:
virtual uint32_t _get_unix_permissions(const String &p_file) override;
virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override;
+ virtual void close() override;
+
static void configure();
FileAccessNetwork();
diff --git a/core/io/file_access_pack.cpp b/core/io/file_access_pack.cpp
index 7c392c005a..9553f35b19 100644
--- a/core/io/file_access_pack.cpp
+++ b/core/io/file_access_pack.cpp
@@ -366,6 +366,10 @@ bool FileAccessPack::file_exists(const String &p_name) {
return false;
}
+void FileAccessPack::close() {
+ f = Ref<FileAccess>();
+}
+
FileAccessPack::FileAccessPack(const String &p_path, const PackedData::PackedFile &p_file) :
pf(p_file),
f(FileAccess::open(pf.pack, FileAccess::READ)) {
diff --git a/core/io/file_access_pack.h b/core/io/file_access_pack.h
index baa62e4516..8bfabc9529 100644
--- a/core/io/file_access_pack.h
+++ b/core/io/file_access_pack.h
@@ -178,6 +178,8 @@ public:
virtual bool file_exists(const String &p_name) override;
+ virtual void close() override;
+
FileAccessPack(const String &p_path, const PackedData::PackedFile &p_file);
};
diff --git a/core/io/file_access_zip.cpp b/core/io/file_access_zip.cpp
index b71dd5e9bd..064353476f 100644
--- a/core/io/file_access_zip.cpp
+++ b/core/io/file_access_zip.cpp
@@ -336,6 +336,10 @@ bool FileAccessZip::file_exists(const String &p_name) {
return false;
}
+void FileAccessZip::close() {
+ _close();
+}
+
FileAccessZip::FileAccessZip(const String &p_path, const PackedData::PackedFile &p_file) {
open_internal(p_path, FileAccess::READ);
}
diff --git a/core/io/file_access_zip.h b/core/io/file_access_zip.h
index 63f1012f99..f8b640946c 100644
--- a/core/io/file_access_zip.h
+++ b/core/io/file_access_zip.h
@@ -109,6 +109,8 @@ public:
virtual uint32_t _get_unix_permissions(const String &p_file) override { return 0; }
virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override { return FAILED; }
+ virtual void close() override;
+
FileAccessZip(const String &p_path, const PackedData::PackedFile &p_file);
~FileAccessZip();
};
diff --git a/core/math/math_funcs.h b/core/math/math_funcs.h
index 0fa82bb8c1..078320d620 100644
--- a/core/math/math_funcs.h
+++ b/core/math/math_funcs.h
@@ -31,6 +31,7 @@
#ifndef MATH_FUNCS_H
#define MATH_FUNCS_H
+#include "core/error/error_macros.h"
#include "core/math/math_defs.h"
#include "core/math/random_pcg.h"
#include "core/typedefs.h"
@@ -225,6 +226,7 @@ public:
}
static _ALWAYS_INLINE_ int64_t posmod(int64_t p_x, int64_t p_y) {
+ ERR_FAIL_COND_V_MSG(p_y == 0, 0, "Division by zero in posmod is undefined. Returning 0 as fallback.");
int64_t value = p_x % p_y;
if (((value < 0) && (p_y > 0)) || ((value > 0) && (p_y < 0))) {
value += p_y;
diff --git a/core/math/vector3.cpp b/core/math/vector3.cpp
index d732f1e8b2..ae009fc4ef 100644
--- a/core/math/vector3.cpp
+++ b/core/math/vector3.cpp
@@ -108,7 +108,9 @@ Vector3 Vector3::octahedron_decode(const Vector2 &p_oct) {
}
Vector2 Vector3::octahedron_tangent_encode(const float sign) const {
+ const float bias = 1.0f / 32767.0f;
Vector2 res = this->octahedron_encode();
+ res.y = MAX(res.y, bias);
res.y = res.y * 0.5f + 0.5f;
res.y = sign >= 0.0f ? res.y : 1 - res.y;
return res;
diff --git a/core/math/vector3.h b/core/math/vector3.h
index bd8739d024..18943a820f 100644
--- a/core/math/vector3.h
+++ b/core/math/vector3.h
@@ -76,6 +76,14 @@ struct _NO_DISCARD_ Vector3 {
return x < y ? (y < z ? Vector3::AXIS_Z : Vector3::AXIS_Y) : (x < z ? Vector3::AXIS_Z : Vector3::AXIS_X);
}
+ Vector3 min(const Vector3 &p_vector3) const {
+ return Vector3(MIN(x, p_vector3.x), MIN(y, p_vector3.y), MIN(z, p_vector3.z));
+ }
+
+ Vector3 max(const Vector3 &p_vector3) const {
+ return Vector3(MAX(x, p_vector3.x), MAX(y, p_vector3.y), MAX(z, p_vector3.z));
+ }
+
_FORCE_INLINE_ real_t length() const;
_FORCE_INLINE_ real_t length_squared() const;
diff --git a/core/math/vector3i.h b/core/math/vector3i.h
index 96f9beef12..53d3829a99 100644
--- a/core/math/vector3i.h
+++ b/core/math/vector3i.h
@@ -69,6 +69,14 @@ struct _NO_DISCARD_ Vector3i {
Vector3i::Axis min_axis_index() const;
Vector3i::Axis max_axis_index() const;
+ Vector3i min(const Vector3i &p_vector3i) const {
+ return Vector3i(MIN(x, p_vector3i.x), MIN(y, p_vector3i.y), MIN(z, p_vector3i.z));
+ }
+
+ Vector3i max(const Vector3i &p_vector3i) const {
+ return Vector3i(MAX(x, p_vector3i.x), MAX(y, p_vector3i.y), MAX(z, p_vector3i.z));
+ }
+
_FORCE_INLINE_ int64_t length_squared() const;
_FORCE_INLINE_ double length() const;
diff --git a/core/math/vector4.h b/core/math/vector4.h
index 0509261f33..f16b040317 100644
--- a/core/math/vector4.h
+++ b/core/math/vector4.h
@@ -68,6 +68,14 @@ struct _NO_DISCARD_ Vector4 {
Vector4::Axis min_axis_index() const;
Vector4::Axis max_axis_index() const;
+ Vector4 min(const Vector4 &p_vector4) const {
+ return Vector4(MIN(x, p_vector4.x), MIN(y, p_vector4.y), MIN(z, p_vector4.z), MIN(w, p_vector4.w));
+ }
+
+ Vector4 max(const Vector4 &p_vector4) const {
+ return Vector4(MAX(x, p_vector4.x), MAX(y, p_vector4.y), MAX(z, p_vector4.z), MAX(w, p_vector4.w));
+ }
+
_FORCE_INLINE_ real_t length_squared() const;
bool is_equal_approx(const Vector4 &p_vec4) const;
bool is_zero_approx() const;
diff --git a/core/math/vector4i.h b/core/math/vector4i.h
index d38a9de6f1..b815aa8e76 100644
--- a/core/math/vector4i.h
+++ b/core/math/vector4i.h
@@ -71,6 +71,14 @@ struct _NO_DISCARD_ Vector4i {
Vector4i::Axis min_axis_index() const;
Vector4i::Axis max_axis_index() const;
+ Vector4i min(const Vector4i &p_vector4i) const {
+ return Vector4i(MIN(x, p_vector4i.x), MIN(y, p_vector4i.y), MIN(z, p_vector4i.z), MIN(w, p_vector4i.w));
+ }
+
+ Vector4i max(const Vector4i &p_vector4i) const {
+ return Vector4i(MAX(x, p_vector4i.x), MAX(y, p_vector4i.y), MAX(z, p_vector4i.z), MAX(w, p_vector4i.w));
+ }
+
_FORCE_INLINE_ int64_t length_squared() const;
_FORCE_INLINE_ double length() const;
diff --git a/core/object/class_db.h b/core/object/class_db.h
index 0e408e8845..0b62cf40f7 100644
--- a/core/object/class_db.h
+++ b/core/object/class_db.h
@@ -40,6 +40,8 @@
#include "core/object/callable_method_pointer.h"
#include "core/templates/hash_set.h"
+#include <type_traits>
+
#define DEFVAL(m_defval) (m_defval)
#ifdef DEBUG_METHODS_ENABLED
@@ -241,6 +243,24 @@ public:
static uint64_t get_api_hash(APIType p_api);
+ template <typename>
+ struct member_function_traits;
+
+ template <typename R, typename T, typename... Args>
+ struct member_function_traits<R (T::*)(Args...)> {
+ using return_type = R;
+ };
+
+ template <typename R, typename T, typename... Args>
+ struct member_function_traits<R (T::*)(Args...) const> {
+ using return_type = R;
+ };
+
+ template <typename R, typename... Args>
+ struct member_function_traits<R (*)(Args...)> {
+ using return_type = R;
+ };
+
template <class N, class M, typename... VarArgs>
static MethodBind *bind_method(N p_method_name, M p_method, VarArgs... p_args) {
Variant args[sizeof...(p_args) + 1] = { p_args..., Variant() }; // +1 makes sure zero sized arrays are also supported.
@@ -249,6 +269,9 @@ public:
argptrs[i] = &args[i];
}
MethodBind *bind = create_method_bind(p_method);
+ if constexpr (std::is_same<typename member_function_traits<M>::return_type, Object *>::value) {
+ bind->set_return_type_is_raw_object_ptr(true);
+ }
return bind_methodfi(METHOD_FLAGS_DEFAULT, bind, p_method_name, sizeof...(p_args) == 0 ? nullptr : (const Variant **)argptrs, sizeof...(p_args));
}
@@ -261,6 +284,9 @@ public:
}
MethodBind *bind = create_static_method_bind(p_method);
bind->set_instance_class(p_class);
+ if constexpr (std::is_same<typename member_function_traits<M>::return_type, Object *>::value) {
+ bind->set_return_type_is_raw_object_ptr(true);
+ }
return bind_methodfi(METHOD_FLAGS_DEFAULT, bind, p_method_name, sizeof...(p_args) == 0 ? nullptr : (const Variant **)argptrs, sizeof...(p_args));
}
@@ -273,6 +299,9 @@ public:
bind->set_name(p_name);
bind->set_default_arguments(p_default_args);
+ if constexpr (std::is_same<typename member_function_traits<M>::return_type, Object *>::value) {
+ bind->set_return_type_is_raw_object_ptr(true);
+ }
String instance_type = bind->get_instance_class();
diff --git a/core/object/message_queue.cpp b/core/object/message_queue.cpp
index ebed6c21e9..decf030e27 100644
--- a/core/object/message_queue.cpp
+++ b/core/object/message_queue.cpp
@@ -55,9 +55,9 @@ Error MessageQueue::push_set(ObjectID p_id, const StringName &p_prop, const Vari
if (ObjectDB::get_instance(p_id)) {
type = ObjectDB::get_instance(p_id)->get_class();
}
- print_line("Failed set: " + type + ":" + p_prop + " target ID: " + itos(p_id));
+ ERR_PRINT("Failed set: " + type + ":" + p_prop + " target ID: " + itos(p_id) + ". Message queue out of memory. Try increasing 'memory/limits/message_queue/max_size_kb' in project settings.");
statistics();
- ERR_FAIL_V_MSG(ERR_OUT_OF_MEMORY, "Message queue out of memory. Try increasing 'memory/limits/message_queue/max_size_kb' in project settings.");
+ return ERR_OUT_OF_MEMORY;
}
Message *msg = memnew_placement(&buffer[buffer_end], Message);
@@ -82,9 +82,9 @@ Error MessageQueue::push_notification(ObjectID p_id, int p_notification) {
uint8_t room_needed = sizeof(Message);
if ((buffer_end + room_needed) >= buffer_size) {
- print_line("Failed notification: " + itos(p_notification) + " target ID: " + itos(p_id));
+ ERR_PRINT("Failed notification: " + itos(p_notification) + " target ID: " + itos(p_id) + ". Message queue out of memory. Try increasing 'memory/limits/message_queue/max_size_kb' in project settings.");
statistics();
- ERR_FAIL_V_MSG(ERR_OUT_OF_MEMORY, "Message queue out of memory. Try increasing 'memory/limits/message_queue/max_size_kb' in project settings.");
+ return ERR_OUT_OF_MEMORY;
}
Message *msg = memnew_placement(&buffer[buffer_end], Message);
@@ -117,9 +117,9 @@ Error MessageQueue::push_callablep(const Callable &p_callable, const Variant **p
int room_needed = sizeof(Message) + sizeof(Variant) * p_argcount;
if ((buffer_end + room_needed) >= buffer_size) {
- print_line("Failed method: " + p_callable);
+ ERR_PRINT("Failed method: " + p_callable + ". Message queue out of memory. Try increasing 'memory/limits/message_queue/max_size_kb' in project settings.");
statistics();
- ERR_FAIL_V_MSG(ERR_OUT_OF_MEMORY, "Message queue out of memory. Try increasing 'memory/limits/message_queue/max_size_kb' in project settings.");
+ return ERR_OUT_OF_MEMORY;
}
Message *msg = memnew_placement(&buffer[buffer_end], Message);
diff --git a/core/object/method_bind.h b/core/object/method_bind.h
index 8334a7eef6..d37479f45b 100644
--- a/core/object/method_bind.h
+++ b/core/object/method_bind.h
@@ -49,6 +49,7 @@ class MethodBind {
bool _static = false;
bool _const = false;
bool _returns = false;
+ bool _returns_raw_obj_ptr = false;
protected:
Variant::Type *argument_types = nullptr;
@@ -121,6 +122,9 @@ public:
_FORCE_INLINE_ bool has_return() const { return _returns; }
virtual bool is_vararg() const { return false; }
+ _FORCE_INLINE_ bool is_return_type_raw_object_ptr() { return _returns_raw_obj_ptr; }
+ _FORCE_INLINE_ void set_return_type_is_raw_object_ptr(bool p_returns_raw_obj) { _returns_raw_obj_ptr = p_returns_raw_obj; }
+
void set_default_arguments(const Vector<Variant> &p_defargs);
uint32_t get_hash() const;
diff --git a/core/object/script_language.cpp b/core/object/script_language.cpp
index 1d53cf66d4..71f40660f4 100644
--- a/core/object/script_language.cpp
+++ b/core/object/script_language.cpp
@@ -165,22 +165,30 @@ ScriptLanguage *ScriptServer::get_language(int p_idx) {
return _languages[p_idx];
}
-void ScriptServer::register_language(ScriptLanguage *p_language) {
- ERR_FAIL_NULL(p_language);
- ERR_FAIL_COND(_language_count >= MAX_LANGUAGES);
+Error ScriptServer::register_language(ScriptLanguage *p_language) {
+ ERR_FAIL_NULL_V(p_language, ERR_INVALID_PARAMETER);
+ ERR_FAIL_COND_V_MSG(_language_count >= MAX_LANGUAGES, ERR_UNAVAILABLE, "Script languages limit has been reach, cannot register more.");
+ for (int i = 0; i < _language_count; i++) {
+ const ScriptLanguage *other_language = _languages[i];
+ ERR_FAIL_COND_V_MSG(other_language->get_extension() == p_language->get_extension(), ERR_ALREADY_EXISTS, "A script language with extension '" + p_language->get_extension() + "' is already registered.");
+ ERR_FAIL_COND_V_MSG(other_language->get_name() == p_language->get_name(), ERR_ALREADY_EXISTS, "A script language with name '" + p_language->get_name() + "' is already registered.");
+ ERR_FAIL_COND_V_MSG(other_language->get_type() == p_language->get_type(), ERR_ALREADY_EXISTS, "A script language with type '" + p_language->get_type() + "' is already registered.");
+ }
_languages[_language_count++] = p_language;
+ return OK;
}
-void ScriptServer::unregister_language(const ScriptLanguage *p_language) {
+Error ScriptServer::unregister_language(const ScriptLanguage *p_language) {
for (int i = 0; i < _language_count; i++) {
if (_languages[i] == p_language) {
_language_count--;
if (i < _language_count) {
SWAP(_languages[i], _languages[_language_count]);
}
- return;
+ return OK;
}
}
+ return ERR_DOES_NOT_EXIST;
}
void ScriptServer::init_languages() {
diff --git a/core/object/script_language.h b/core/object/script_language.h
index 14cc30e029..3ef121a8e7 100644
--- a/core/object/script_language.h
+++ b/core/object/script_language.h
@@ -70,8 +70,8 @@ public:
static bool is_scripting_enabled();
_FORCE_INLINE_ static int get_language_count() { return _language_count; }
static ScriptLanguage *get_language(int p_idx);
- static void register_language(ScriptLanguage *p_language);
- static void unregister_language(const ScriptLanguage *p_language);
+ static Error register_language(ScriptLanguage *p_language);
+ static Error unregister_language(const ScriptLanguage *p_language);
static void set_reload_scripts_on_save(bool p_enable);
static bool is_reload_scripts_on_save_enabled();
diff --git a/core/object/script_language_extension.cpp b/core/object/script_language_extension.cpp
index 19c6fc3383..c7eb32c020 100644
--- a/core/object/script_language_extension.cpp
+++ b/core/object/script_language_extension.cpp
@@ -36,6 +36,7 @@ void ScriptExtension::_bind_methods() {
GDVIRTUAL_BIND(_can_instantiate);
GDVIRTUAL_BIND(_get_base_script);
+ GDVIRTUAL_BIND(_get_global_name);
GDVIRTUAL_BIND(_inherits_script, "script");
GDVIRTUAL_BIND(_get_instance_base_type);
diff --git a/core/string/translation_po.cpp b/core/string/translation_po.cpp
index 2d3a9c7575..6b1595174a 100644
--- a/core/string/translation_po.cpp
+++ b/core/string/translation_po.cpp
@@ -254,11 +254,6 @@ StringName TranslationPO::get_plural_message(const StringName &p_src_text, const
}
ERR_FAIL_COND_V_MSG(translation_map[p_context][p_src_text].is_empty(), StringName(), "Source text \"" + String(p_src_text) + "\" is registered but doesn't have a translation. Please report this bug.");
- if (translation_map[p_context][p_src_text].size() == 1) {
- WARN_PRINT("Source string \"" + String(p_src_text) + "\" doesn't have plural translations. Use singular translation API for such as tr(), TTR() to translate \"" + String(p_src_text) + "\"");
- return translation_map[p_context][p_src_text][0];
- }
-
int plural_index = _get_plural_index(p_n);
ERR_FAIL_COND_V_MSG(plural_index < 0 || translation_map[p_context][p_src_text].size() < plural_index + 1, StringName(), "Plural index returned or number of plural translations is not valid. Please report this bug.");
diff --git a/core/string/ustring.cpp b/core/string/ustring.cpp
index b34d9f3271..1b3b070592 100644
--- a/core/string/ustring.cpp
+++ b/core/string/ustring.cpp
@@ -1157,6 +1157,14 @@ Vector<String> String::split_spaces() const {
Vector<String> String::split(const String &p_splitter, bool p_allow_empty, int p_maxsplit) const {
Vector<String> ret;
+
+ if (is_empty()) {
+ if (p_allow_empty) {
+ ret.push_back("");
+ }
+ return ret;
+ }
+
int from = 0;
int len = length();
diff --git a/core/variant/container_type_validate.h b/core/variant/container_type_validate.h
index ad679db9d0..ffe1dc90a3 100644
--- a/core/variant/container_type_validate.h
+++ b/core/variant/container_type_validate.h
@@ -73,7 +73,7 @@ struct ContainerTypeValidate {
return type != p_type.type || class_name != p_type.class_name || script != p_type.script;
}
- // Coerces String and StringName into each other when needed.
+ // Coerces String and StringName into each other and int into float when needed.
_FORCE_INLINE_ bool validate(Variant &inout_variant, const char *p_operation = "use") const {
if (type == Variant::NIL) {
return true;
@@ -89,6 +89,9 @@ struct ContainerTypeValidate {
} else if (type == Variant::STRING_NAME && inout_variant.get_type() == Variant::STRING) {
inout_variant = StringName(inout_variant);
return true;
+ } else if (type == Variant::FLOAT && inout_variant.get_type() == Variant::INT) {
+ inout_variant = (float)inout_variant;
+ return true;
}
ERR_FAIL_V_MSG(false, "Attempted to " + String(p_operation) + " a variable of type '" + Variant::get_type_name(inout_variant.get_type()) + "' into a " + where + " of type '" + Variant::get_type_name(type) + "'.");
diff --git a/core/variant/variant.h b/core/variant/variant.h
index b2f31a6d57..f694e59051 100644
--- a/core/variant/variant.h
+++ b/core/variant/variant.h
@@ -346,6 +346,10 @@ public:
bool is_one() const;
bool is_null() const;
+ // Make sure Variant is not implicitly cast when accessing it with bracket notation (GH-49469).
+ Variant &operator[](const Variant &p_key) = delete;
+ const Variant &operator[](const Variant &p_key) const = delete;
+
operator bool() const;
operator signed int() const;
operator unsigned int() const; // this is the real one
diff --git a/core/variant/variant_op.cpp b/core/variant/variant_op.cpp
index 59f562865d..33c285dc6d 100644
--- a/core/variant/variant_op.cpp
+++ b/core/variant/variant_op.cpp
@@ -1105,8 +1105,11 @@ bool Variant::in(const Variant &p_index, bool *r_valid) const {
evaluate(OP_IN, p_index, *this, ret, valid);
if (r_valid) {
*r_valid = valid;
+ }
+ if (valid) {
+ ERR_FAIL_COND_V(ret.type != BOOL, false);
+ return *VariantGetInternalPtr<bool>::get_ptr(&ret);
+ } else {
return false;
}
- ERR_FAIL_COND_V(ret.type != BOOL, false);
- return *VariantGetInternalPtr<bool>::get_ptr(&ret);
}
diff --git a/doc/classes/@GlobalScope.xml b/doc/classes/@GlobalScope.xml
index 55810156a1..d5280cb548 100644
--- a/doc/classes/@GlobalScope.xml
+++ b/doc/classes/@GlobalScope.xml
@@ -803,7 +803,8 @@
Returns the result of [param base] raised to the power of [param exp].
In GDScript, this is the equivalent of the [code]**[/code] operator.
[codeblock]
- pow(2, 5) # Returns 32
+ pow(2, 5) # Returns 32.0
+ pow(4, 1.5) # Returns 8.0
[/codeblock]
</description>
</method>
@@ -1287,14 +1288,14 @@
Converts a formatted [param string] that was returned by [method var_to_str] to the original [Variant].
[codeblocks]
[gdscript]
- var a = '{ "a": 1, "b": 2 }' # a is a String
- var b = str_to_var(a) # b is a Dictionary
- print(b["a"]) # Prints 1
+ var data = '{ "a": 1, "b": 2 }' # data is a String
+ var dict = str_to_var(data) # dict is a Dictionary
+ print(dict["a"]) # Prints 1
[/gdscript]
[csharp]
- string a = "{ \"a\": 1, \"b\": 2 }"; // a is a string
- var b = GD.StrToVar(a).AsGodotDictionary(); // b is a Dictionary
- GD.Print(b["a"]); // Prints 1
+ string data = "{ \"a\": 1, \"b\": 2 }"; // data is a string
+ var dict = GD.StrToVar(data).AsGodotDictionary(); // dict is a Dictionary
+ GD.Print(dict["a"]); // Prints 1
[/csharp]
[/codeblocks]
</description>
@@ -2272,7 +2273,7 @@
Command (on macOS) or Meta/Windows key mask.
</constant>
<constant name="KEY_MASK_CTRL" value="268435456" enum="KeyModifierMask" is_bitfield="true">
- Ctrl key mask.
+ Control key mask.
</constant>
<constant name="KEY_MASK_KPAD" value="536870912" enum="KeyModifierMask" is_bitfield="true">
Keypad key mask.
@@ -2293,10 +2294,10 @@
Middle mouse button.
</constant>
<constant name="MOUSE_BUTTON_WHEEL_UP" value="4" enum="MouseButton">
- Mouse wheel up.
+ Mouse wheel scrolling up.
</constant>
<constant name="MOUSE_BUTTON_WHEEL_DOWN" value="5" enum="MouseButton">
- Mouse wheel down.
+ Mouse wheel scrolling down.
</constant>
<constant name="MOUSE_BUTTON_WHEEL_LEFT" value="6" enum="MouseButton">
Mouse wheel left button (only present on some mice).
@@ -2760,6 +2761,7 @@
Hints that a string property is a password, and every character is replaced with the secret character.
</constant>
<constant name="PROPERTY_HINT_MAX" value="37" enum="PropertyHint">
+ Represents the size of the [enum PropertyHint] enum.
</constant>
<constant name="PROPERTY_USAGE_NONE" value="0" enum="PropertyUsageFlags" is_bitfield="true">
The property is not stored, and does not display in the editor. This is the default for non-exported properties.
@@ -2818,7 +2820,7 @@
When duplicating a resource with [method Resource.duplicate], and this flag is set on a property of that resource, the property should never be duplicated, regardless of the [code]subresources[/code] bool parameter.
</constant>
<constant name="PROPERTY_USAGE_HIGH_END_GFX" value="2097152" enum="PropertyUsageFlags" is_bitfield="true">
- The property is only shown in the editor if modern renderers are supported (GLES3 is excluded).
+ The property is only shown in the editor if modern renderers are supported (the Compatibility rendering method is excluded).
</constant>
<constant name="PROPERTY_USAGE_NODE_PATH_FROM_SCENE_ROOT" value="4194304" enum="PropertyUsageFlags" is_bitfield="true">
</constant>
diff --git a/doc/classes/AnimationNodeAnimation.xml b/doc/classes/AnimationNodeAnimation.xml
index 5a8bac1629..93839c6782 100644
--- a/doc/classes/AnimationNodeAnimation.xml
+++ b/doc/classes/AnimationNodeAnimation.xml
@@ -21,8 +21,10 @@
</members>
<constants>
<constant name="PLAY_MODE_FORWARD" value="0" enum="PlayMode">
+ Plays animation in forward direction.
</constant>
<constant name="PLAY_MODE_BACKWARD" value="1" enum="PlayMode">
+ Plays animation in backward direction.
</constant>
</constants>
</class>
diff --git a/doc/classes/AnimationNodeOneShot.xml b/doc/classes/AnimationNodeOneShot.xml
index 9e8193868c..713296069d 100644
--- a/doc/classes/AnimationNodeOneShot.xml
+++ b/doc/classes/AnimationNodeOneShot.xml
@@ -5,6 +5,35 @@
</brief_description>
<description>
A resource to add to an [AnimationNodeBlendTree]. This node will execute a sub-animation and return once it finishes. Blend times for fading in and out can be customized, as well as filters.
+ After setting the request and changing the animation playback, the one-shot node automatically clears the request on the next process frame by setting its [code]request[/code] value to [constant ONE_SHOT_REQUEST_NONE].
+ [codeblocks]
+ [gdscript]
+ # Play child animation connected to "shot" port.
+ animation_tree.set("parameters/OneShot/request", AnimationNodeOneShot.ONE_SHOT_REQUEST_FIRE)
+ # Alternative syntax (same result as above).
+ animation_tree["parameters/OneShot/request"] = AnimationNodeOneShot.ONE_SHOT_REQUEST_FIRE
+
+ # Abort child animation connected to "shot" port.
+ animation_tree.set("parameters/OneShot/request", AnimationNodeOneShot.ONE_SHOT_REQUEST_ABORT)
+ # Alternative syntax (same result as above).
+ animation_tree["parameters/OneShot/request"] = AnimationNodeOneShot.ONE_SHOT_REQUEST_ABORT
+
+ # Get current state (read-only).
+ animation_tree.get("parameters/OneShot/active"))
+ # Alternative syntax (same result as above).
+ animation_tree["parameters/OneShot/active"]
+ [/gdscript]
+ [csharp]
+ // Play child animation connected to "shot" port.
+ animationTree.Set("parameters/OneShot/request", AnimationNodeOneShot.ONE_SHOT_REQUEST_FIRE);
+
+ // Abort child animation connected to "shot" port.
+ animationTree.Set("parameters/OneShot/request", AnimationNodeOneShot.ONE_SHOT_REQUEST_ABORT);
+
+ // Get current state (read-only).
+ animationTree.Get("parameters/OneShot/active");
+ [/csharp]
+ [/codeblocks]
</description>
<tutorials>
<link title="AnimationTree">$DOCS_URL/tutorials/animation/animation_tree.html</link>
@@ -13,6 +42,7 @@
<members>
<member name="autorestart" type="bool" setter="set_autorestart" getter="has_autorestart" default="false">
If [code]true[/code], the sub-animation will restart automatically after finishing.
+ In other words, to start auto restarting, the animation must be played once with the [constant ONE_SHOT_REQUEST_FIRE] request. The [constant ONE_SHOT_REQUEST_ABORT] request stops the auto restarting, but it does not disable the [member autorestart] itself. So, the [constant ONE_SHOT_REQUEST_FIRE] request will start auto restarting again.
</member>
<member name="autorestart_delay" type="float" setter="set_autorestart_delay" getter="get_autorestart_delay" default="1.0">
The delay after which the automatic restart is triggered, in seconds.
@@ -21,22 +51,30 @@
If [member autorestart] is [code]true[/code], a random additional delay (in seconds) between 0 and this value will be added to [member autorestart_delay].
</member>
<member name="fadein_time" type="float" setter="set_fadein_time" getter="get_fadein_time" default="0.0">
+ The fade-in duration. For example, setting this to [code]1.0[/code] for a 5 second length animation will produce a crossfade that starts at 0 second and ends at 1 second during the animation.
</member>
<member name="fadeout_time" type="float" setter="set_fadeout_time" getter="get_fadeout_time" default="0.0">
+ The fade-out duration. For example, setting this to [code]1.0[/code] for a 5 second length animation will produce a crossfade that starts at 4 second and ends at 5 second during the animation.
</member>
<member name="mix_mode" type="int" setter="set_mix_mode" getter="get_mix_mode" enum="AnimationNodeOneShot.MixMode" default="0">
+ The blend type.
</member>
</members>
<constants>
<constant name="ONE_SHOT_REQUEST_NONE" value="0" enum="OneShotRequest">
+ The default state of the request. Nothing is done.
</constant>
<constant name="ONE_SHOT_REQUEST_FIRE" value="1" enum="OneShotRequest">
+ The request to play the animation connected to "shot" port.
</constant>
<constant name="ONE_SHOT_REQUEST_ABORT" value="2" enum="OneShotRequest">
+ The request to stop the animation connected to "shot" port.
</constant>
<constant name="MIX_MODE_BLEND" value="0" enum="MixMode">
+ Blends two animations. See also [AnimationNodeBlend2].
</constant>
<constant name="MIX_MODE_ADD" value="1" enum="MixMode">
+ Blends two animations additively. See also [AnimationNodeAdd2].
</constant>
</constants>
</class>
diff --git a/doc/classes/AnimationNodeStateMachinePlayback.xml b/doc/classes/AnimationNodeStateMachinePlayback.xml
index 17a946bb3e..4772c1d819 100644
--- a/doc/classes/AnimationNodeStateMachinePlayback.xml
+++ b/doc/classes/AnimationNodeStateMachinePlayback.xml
@@ -24,12 +24,15 @@
<method name="get_current_length" qualifiers="const">
<return type="float" />
<description>
+ Returns the current state length.
+ [b]Note:[/b] It is possible that any [AnimationRootNode] can be nodes as well as animations. This means that there can be multiple animations within a single state. Which animation length has priority depends on the nodes connected inside it. Also, if a transition does not reset, the remaining length at that point will be returned.
</description>
</method>
<method name="get_current_node" qualifiers="const">
<return type="StringName" />
<description>
Returns the currently playing animation state.
+ [b]Note:[/b] When using a cross-fade, the current state changes to the next state immediately after the cross-fade begins.
</description>
</method>
<method name="get_current_play_position" qualifiers="const">
diff --git a/doc/classes/AnimationNodeStateMachineTransition.xml b/doc/classes/AnimationNodeStateMachineTransition.xml
index bccab4613a..537120aec5 100644
--- a/doc/classes/AnimationNodeStateMachineTransition.xml
+++ b/doc/classes/AnimationNodeStateMachineTransition.xml
@@ -1,8 +1,11 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="AnimationNodeStateMachineTransition" inherits="Resource" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
<brief_description>
+ A resource to connect each node to make a path for [AnimationNodeStateMachine].
</brief_description>
<description>
+ The path generated when using [method AnimationNodeStateMachinePlayback.travel] is limited to the nodes connected by [AnimationNodeStateMachineTransition].
+ You can set the timing and conditions of the transition in detail.
</description>
<tutorials>
<link title="AnimationTree">$DOCS_URL/tutorials/animation/animation_tree.html</link>
diff --git a/doc/classes/AnimationNodeSync.xml b/doc/classes/AnimationNodeSync.xml
index 21cac11d50..c0e7741ac0 100644
--- a/doc/classes/AnimationNodeSync.xml
+++ b/doc/classes/AnimationNodeSync.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="AnimationNodeSync" inherits="AnimationNode" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
<brief_description>
+ The base class for [AnimationNode] which has more than two input ports and needs to synchronize them.
</brief_description>
<description>
</description>
diff --git a/doc/classes/AnimationNodeTimeSeek.xml b/doc/classes/AnimationNodeTimeSeek.xml
index 0a7da8ba07..5033059927 100644
--- a/doc/classes/AnimationNodeTimeSeek.xml
+++ b/doc/classes/AnimationNodeTimeSeek.xml
@@ -4,25 +4,26 @@
A time-seeking animation node to be used with [AnimationTree].
</brief_description>
<description>
- This node can be used to cause a seek command to happen to any sub-children of the animation graph. Use this node type to play an [Animation] from the start or a certain playback position inside the [AnimationNodeBlendTree]. After setting the time and changing the animation playback, the seek node automatically goes into sleep mode on the next process frame by setting its [code]seek_position[/code] value to [code]-1.0[/code].
+ This node can be used to cause a seek command to happen to any sub-children of the animation graph. Use this node type to play an [Animation] from the start or a certain playback position inside the [AnimationNodeBlendTree].
+ After setting the time and changing the animation playback, the time seek node automatically goes into sleep mode on the next process frame by setting its [code]seek_request[/code] value to [code]-1.0[/code].
[codeblocks]
[gdscript]
# Play child animation from the start.
- animation_tree.set("parameters/Seek/seek_position", 0.0)
+ animation_tree.set("parameters/TimeSeek/seek_request", 0.0)
# Alternative syntax (same result as above).
- animation_tree["parameters/Seek/seek_position"] = 0.0
+ animation_tree["parameters/TimeSeek/seek_request"] = 0.0
# Play child animation from 12 second timestamp.
- animation_tree.set("parameters/Seek/seek_position", 12.0)
+ animation_tree.set("parameters/TimeSeek/seek_request", 12.0)
# Alternative syntax (same result as above).
- animation_tree["parameters/Seek/seek_position"] = 12.0
+ animation_tree["parameters/TimeSeek/seek_request"] = 12.0
[/gdscript]
[csharp]
// Play child animation from the start.
- animationTree.Set("parameters/Seek/seek_position", 0.0);
+ animationTree.Set("parameters/TimeSeek/seek_request", 0.0);
// Play child animation from 12 second timestamp.
- animationTree.Set("parameters/Seek/seek_position", 12.0);
+ animationTree.Set("parameters/TimeSeek/seek_request", 12.0);
[/csharp]
[/codeblocks]
</description>
diff --git a/doc/classes/AnimationNodeTransition.xml b/doc/classes/AnimationNodeTransition.xml
index bc3e5716dd..4eeaf15b53 100644
--- a/doc/classes/AnimationNodeTransition.xml
+++ b/doc/classes/AnimationNodeTransition.xml
@@ -5,6 +5,36 @@
</brief_description>
<description>
Simple state machine for cases which don't require a more advanced [AnimationNodeStateMachine]. Animations can be connected to the inputs and transition times can be specified.
+ After setting the request and changing the animation playback, the transition node automatically clears the request on the next process frame by setting its [code]transition_request[/code] value to empty.
+ [b]Note:[/b] When using a cross-fade, [code]current_state[/code] and [code]current_index[/code] change to the next state immediately after the cross-fade begins.
+ [codeblocks]
+ [gdscript]
+ # Play child animation connected to "state_2" port.
+ animation_tree.set("parameters/Transition/transition_request", "state_2")
+ # Alternative syntax (same result as above).
+ animation_tree["parameters/Transition/transition_request"] = "state_2"
+
+ # Get current state name (read-only).
+ animation_tree.get("parameters/Transition/current_state")
+ # Alternative syntax (same result as above).
+ animation_tree["parameters/Transition/current_state"]
+
+ # Get current state index (read-only).
+ animation_tree.get("parameters/Transition/current_index"))
+ # Alternative syntax (same result as above).
+ animation_tree["parameters/Transition/current_index"]
+ [/gdscript]
+ [csharp]
+ // Play child animation connected to "state_2" port.
+ animationTree.Set("parameters/Transition/transition_request", "state_2");
+
+ // Get current state name (read-only).
+ animationTree.Get("parameters/Transition/current_state");
+
+ // Get current state index (read-only).
+ animationTree.Get("parameters/Transition/current_index");
+ [/csharp]
+ [/codeblocks]
</description>
<tutorials>
<link title="AnimationTree">$DOCS_URL/tutorials/animation/animation_tree.html</link>
diff --git a/doc/classes/AnimationRootNode.xml b/doc/classes/AnimationRootNode.xml
index d364c15f77..cdcec3787a 100644
--- a/doc/classes/AnimationRootNode.xml
+++ b/doc/classes/AnimationRootNode.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="AnimationRootNode" inherits="AnimationNode" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
<brief_description>
+ The [AnimationNode] which can be set as the root of an [AnimationTree].
</brief_description>
<description>
</description>
diff --git a/doc/classes/AnimationTree.xml b/doc/classes/AnimationTree.xml
index 98256f0a38..ed98f47f58 100644
--- a/doc/classes/AnimationTree.xml
+++ b/doc/classes/AnimationTree.xml
@@ -33,7 +33,7 @@
<method name="get_root_motion_position" qualifiers="const">
<return type="Vector3" />
<description>
- Retrieve the motion of position with the [member root_motion_track] as a [Vector3] that can be used elsewhere.
+ Retrieve the motion delta of position with the [member root_motion_track] as a [Vector3] that can be used elsewhere.
If [member root_motion_track] is not a path to a track of type [constant Animation.TYPE_POSITION_3D], returns [code]Vector3(0, 0, 0)[/code].
See also [member root_motion_track] and [RootMotionView].
The most basic example is applying position to [CharacterBody3D]:
@@ -50,12 +50,46 @@
move_and_slide()
[/gdscript]
[/codeblocks]
+ By using this in combination with [method get_root_motion_position_accumulator], you can apply the root motion position more correctly to account for the rotation of the node.
+ [codeblocks]
+ [gdscript]
+ func _process(delta):
+ if Input.is_action_just_pressed("animate"):
+ state_machine.travel("Animate")
+ set_quaternion(get_quaternion() * animation_tree.get_root_motion_rotation())
+ var velocity: Vector3 = (animation_tree.get_root_motion_rotation_accumulator().inverse() * get_quaternion()) * animation_tree.get_root_motion_position() / delta
+ set_velocity(velocity)
+ move_and_slide()
+ [/gdscript]
+ [/codeblocks]
+ </description>
+ </method>
+ <method name="get_root_motion_position_accumulator" qualifiers="const">
+ <return type="Vector3" />
+ <description>
+ Retrieve the blended value of the position tracks with the [member root_motion_track] as a [Vector3] that can be used elsewhere.
+ This is useful in cases where you want to respect the initial key values of the animation.
+ For example, if an animation with only one key [code]Vector3(0, 0, 0)[/code] is played in the previous frame and then an animation with only one key [code]Vector3(1, 0, 1)[/code] is played in the next frame, the difference can be calculated as follows:
+ [codeblocks]
+ [gdscript]
+ var prev_root_motion_position_accumulator: Vector3
+
+ func _process(delta):
+ if Input.is_action_just_pressed("animate"):
+ state_machine.travel("Animate")
+ var current_root_motion_position_accumulator: Vector3 = animation_tree.get_root_motion_position_accumulator()
+ var difference: Vector3 = current_root_motion_position_accumulator - prev_root_motion_position_accumulator
+ prev_root_motion_position_accumulator = current_root_motion_position_accumulator
+ transform.origin += difference
+ [/gdscript]
+ [/codeblocks]
+ However, if the animation loops, an unintended discrete change may occur, so this is only useful for some simple use cases.
</description>
</method>
<method name="get_root_motion_rotation" qualifiers="const">
<return type="Quaternion" />
<description>
- Retrieve the motion of rotation with the [member root_motion_track] as a [Quaternion] that can be used elsewhere.
+ Retrieve the motion delta of rotation with the [member root_motion_track] as a [Quaternion] that can be used elsewhere.
If [member root_motion_track] is not a path to a track of type [constant Animation.TYPE_ROTATION_3D], returns [code]Quaternion(0, 0, 0, 1)[/code].
See also [member root_motion_track] and [RootMotionView].
The most basic example is applying rotation to [CharacterBody3D]:
@@ -69,10 +103,33 @@
[/codeblocks]
</description>
</method>
+ <method name="get_root_motion_rotation_accumulator" qualifiers="const">
+ <return type="Quaternion" />
+ <description>
+ Retrieve the blended value of the rotation tracks with the [member root_motion_track] as a [Quaternion] that can be used elsewhere.
+ This is necessary to apply the root motion position correctly, taking rotation into account. See also [method get_root_motion_position].
+ Also, this is useful in cases where you want to respect the initial key values of the animation.
+ For example, if an animation with only one key [code]Quaternion(0, 0, 0, 1)[/code] is played in the previous frame and then an animation with only one key [code]Quaternion(0, 0.707, 0, 0.707)[/code] is played in the next frame, the difference can be calculated as follows:
+ [codeblocks]
+ [gdscript]
+ var prev_root_motion_rotation_accumulator: Quaternion
+
+ func _process(delta):
+ if Input.is_action_just_pressed("animate"):
+ state_machine.travel("Animate")
+ var current_root_motion_rotation_accumulator: Quaternion = animation_tree.get_root_motion_Quaternion_accumulator()
+ var difference: Quaternion = prev_root_motion_rotation_accumulator.inverse() * current_root_motion_rotation_accumulator
+ prev_root_motion_rotation_accumulator = current_root_motion_rotation_accumulator
+ transform.basis *= difference
+ [/gdscript]
+ [/codeblocks]
+ However, if the animation loops, an unintended discrete change may occur, so this is only useful for some simple use cases.
+ </description>
+ </method>
<method name="get_root_motion_scale" qualifiers="const">
<return type="Vector3" />
<description>
- Retrieve the motion of scale with the [member root_motion_track] as a [Vector3] that can be used elsewhere.
+ Retrieve the motion delta of scale with the [member root_motion_track] as a [Vector3] that can be used elsewhere.
If [member root_motion_track] is not a path to a track of type [constant Animation.TYPE_SCALE_3D], returns [code]Vector3(0, 0, 0)[/code].
See also [member root_motion_track] and [RootMotionView].
The most basic example is applying scale to [CharacterBody3D]:
@@ -92,6 +149,27 @@
[/codeblocks]
</description>
</method>
+ <method name="get_root_motion_scale_accumulator" qualifiers="const">
+ <return type="Vector3" />
+ <description>
+ Retrieve the blended value of the scale tracks with the [member root_motion_track] as a [Vector3] that can be used elsewhere.
+ For example, if an animation with only one key [code]Vector3(1, 1, 1)[/code] is played in the previous frame and then an animation with only one key [code]Vector3(2, 2, 2)[/code] is played in the next frame, the difference can be calculated as follows:
+ [codeblocks]
+ [gdscript]
+ var prev_root_motion_scale_accumulator: Vector3
+
+ func _process(delta):
+ if Input.is_action_just_pressed("animate"):
+ state_machine.travel("Animate")
+ var current_root_motion_scale_accumulator: Vector3 = animation_tree.get_root_motion_scale_accumulator()
+ var difference: Vector3 = current_root_motion_scale_accumulator - prev_root_motion_scale_accumulator
+ prev_root_motion_scale_accumulator = current_root_motion_scale_accumulator
+ transform.basis = transform.basis.scaled(difference)
+ [/gdscript]
+ [/codeblocks]
+ However, if the animation loops, an unintended discrete change may occur, so this is only useful for some simple use cases.
+ </description>
+ </method>
</methods>
<members>
<member name="active" type="bool" setter="set_active" getter="is_active" default="false">
diff --git a/doc/classes/Area2D.xml b/doc/classes/Area2D.xml
index 8a98921a60..100a71abef 100644
--- a/doc/classes/Area2D.xml
+++ b/doc/classes/Area2D.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="Area2D" inherits="CollisionObject2D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
<brief_description>
- 2D area for detection and physics and audio influence.
+ 2D area for detection, as well as physics and audio influence.
</brief_description>
<description>
2D area that detects [CollisionObject2D] nodes overlapping, entering, or exiting. Can also alter or override local physics parameters (gravity, damping) and route audio to custom audio buses.
diff --git a/doc/classes/Area3D.xml b/doc/classes/Area3D.xml
index bd046b7cb8..cf9e865064 100644
--- a/doc/classes/Area3D.xml
+++ b/doc/classes/Area3D.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="Area3D" inherits="CollisionObject3D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
<brief_description>
- 3D area for detection and physics and audio influence.
+ 3D area for detection, as well as physics and audio influence.
</brief_description>
<description>
3D area that detects [CollisionObject3D] nodes overlapping, entering, or exiting. Can also alter or override local physics parameters (gravity, damping) and route audio to custom audio buses.
diff --git a/doc/classes/BaseMaterial3D.xml b/doc/classes/BaseMaterial3D.xml
index 60225275f3..e72aa373f7 100644
--- a/doc/classes/BaseMaterial3D.xml
+++ b/doc/classes/BaseMaterial3D.xml
@@ -215,10 +215,11 @@
If [code]true[/code], the object is rendered at the same size regardless of distance.
</member>
<member name="grow" type="bool" setter="set_grow_enabled" getter="is_grow_enabled" default="false">
- If [code]true[/code], enables the vertex grow setting. See [member grow_amount].
+ If [code]true[/code], enables the vertex grow setting. This can be used to create mesh-based outlines using a second material pass and its [member cull_mode] set to [constant CULL_FRONT]. See also [member grow_amount].
+ [b]Note:[/b] Vertex growth cannot create new vertices, which means that visible gaps may occur in sharp corners. This can be alleviated by designing the mesh to use smooth normals exclusively using [url=https://wiki.polycount.com/wiki/Face_weighted_normals]face weighted normals[/url] in the 3D authoring software. In this case, grow will be able to join every outline together, just like in the original mesh.
</member>
<member name="grow_amount" type="float" setter="set_grow" getter="get_grow" default="0.0">
- Grows object vertices in the direction of their normals.
+ Grows object vertices in the direction of their normals. Only effective if [member grow] is [code]true[/code].
</member>
<member name="heightmap_deep_parallax" type="bool" setter="set_heightmap_deep_parallax" getter="is_heightmap_deep_parallax_enabled" default="false">
If [code]true[/code], uses parallax occlusion mapping to represent depth in the material instead of simple offset mapping (see [member heightmap_enabled]). This results in a more convincing depth effect, but is much more expensive on the GPU. Only enable this on materials where it makes a significant visual difference.
@@ -277,7 +278,7 @@
If [code]true[/code], depth testing is disabled and the object will be drawn in render order.
</member>
<member name="normal_enabled" type="bool" setter="set_feature" getter="get_feature" default="false">
- If [code]true[/code], normal mapping is enabled.
+ If [code]true[/code], normal mapping is enabled. This has a slight performance cost, especially on mobile GPUs.
</member>
<member name="normal_scale" type="float" setter="set_normal_scale" getter="get_normal_scale" default="1.0">
The strength of the normal map's effect.
@@ -344,7 +345,8 @@
Specifies the channel of the [member roughness_texture] in which the roughness information is stored. This is useful when you store the information for multiple effects in a single texture. For example if you stored metallic in the red channel, roughness in the blue, and ambient occlusion in the green you could reduce the number of textures you use.
</member>
<member name="shading_mode" type="int" setter="set_shading_mode" getter="get_shading_mode" enum="BaseMaterial3D.ShadingMode" default="1">
- Sets whether the shading takes place per-pixel or per-vertex. Per-vertex lighting is faster, making it the best choice for mobile applications, however it looks considerably worse than per-pixel.
+ Sets whether the shading takes place, per-pixel, per-vertex or unshaded. Per-vertex lighting is faster, making it the best choice for mobile applications, however it looks considerably worse than per-pixel. Unshaded rendering is the fastest, but disables all interactions with lights.
+ [b]Note:[/b] Setting the shading mode vertex shading currently has no effect, as vertex shading is not implemented yet.
</member>
<member name="shadow_to_opacity" type="bool" setter="set_flag" getter="get_flag" default="false">
If [code]true[/code], enables the "shadow to opacity" render mode where lighting modifies the alpha so shadowed areas are opaque and non-shadowed areas are transparent. Useful for overlaying shadows onto a camera feed in AR.
@@ -388,7 +390,7 @@
Repeat flags for the texture. See [enum TextureFilter] for options.
</member>
<member name="transparency" type="int" setter="set_transparency" getter="get_transparency" enum="BaseMaterial3D.Transparency" default="0">
- If [code]true[/code], transparency is enabled on the body. See also [member blend_mode].
+ If [code]true[/code], transparency is enabled on the body. Some transparency modes will disable shadow casting. Any transparency mode other than Disabled has a greater performance impact compared to opaque rendering. See also [member blend_mode].
</member>
<member name="use_particle_trails" type="bool" setter="set_flag" getter="get_flag" default="false">
If [code]true[/code], enables parts of the shader required for [GPUParticles3D] trails to function. This also requires using a mesh with appropriate skinning, such as [RibbonTrailMesh] or [TubeTrailMesh]. Enabling this feature outside of materials used in [GPUParticles3D] meshes will break material rendering.
@@ -431,7 +433,7 @@
</member>
<member name="vertex_color_is_srgb" type="bool" setter="set_flag" getter="get_flag" default="false">
If [code]true[/code], vertex colors are considered to be stored in sRGB color space and are converted to linear color space during rendering. If [code]false[/code], vertex colors are considered to be stored in linear color space and are rendered as-is. See also [member albedo_texture_force_srgb].
- [b]Note:[/b] Only effective when using the Vulkan Clustered or Vulkan Mobile backends.
+ [b]Note:[/b] Only effective when using the Forward+ and Mobile rendering methods, not Compatibility.
</member>
<member name="vertex_color_use_as_albedo" type="bool" setter="set_flag" getter="get_flag" default="false">
If [code]true[/code], the vertex color is used as albedo color.
@@ -523,31 +525,31 @@
Use [code]UV2[/code] with the detail texture.
</constant>
<constant name="TRANSPARENCY_DISABLED" value="0" enum="Transparency">
- The material will not use transparency.
+ The material will not use transparency. This is the fastest to render.
</constant>
<constant name="TRANSPARENCY_ALPHA" value="1" enum="Transparency">
- The material will use the texture's alpha values for transparency.
+ The material will use the texture's alpha values for transparency. This is the slowest to render, and disables shadow casting.
</constant>
<constant name="TRANSPARENCY_ALPHA_SCISSOR" value="2" enum="Transparency">
- The material will cut off all values below a threshold, the rest will remain opaque. The opaque portions will be rendered in the depth prepass.
+ The material will cut off all values below a threshold, the rest will remain opaque. The opaque portions will be rendered in the depth prepass. This is faster to render than alpha blending, but slower than opaque rendering. This also supports casting shadows.
</constant>
<constant name="TRANSPARENCY_ALPHA_HASH" value="3" enum="Transparency">
- The material will cut off all values below a spatially-deterministic threshold, the rest will remain opaque.
+ The material will cut off all values below a spatially-deterministic threshold, the rest will remain opaque. This is faster to render than alpha blending, but slower than opaque rendering. This also supports casting shadows. Alpha hashing is suited for hair rendering.
</constant>
<constant name="TRANSPARENCY_ALPHA_DEPTH_PRE_PASS" value="4" enum="Transparency">
- The material will use the texture's alpha value for transparency, but will discard fragments with an alpha of less than 0.99 during the depth prepass and fragments with an alpha less than 0.1 during the shadow pass.
+ The material will use the texture's alpha value for transparency, but will discard fragments with an alpha of less than 0.99 during the depth prepass and fragments with an alpha less than 0.1 during the shadow pass. This also supports casting shadows.
</constant>
<constant name="TRANSPARENCY_MAX" value="5" enum="Transparency">
Represents the size of the [enum Transparency] enum.
</constant>
<constant name="SHADING_MODE_UNSHADED" value="0" enum="ShadingMode">
- The object will not receive shadows.
+ The object will not receive shadows. This is the fastest to render, but it disables all interactions with lights.
</constant>
<constant name="SHADING_MODE_PER_PIXEL" value="1" enum="ShadingMode">
- The object will be shaded per pixel. Useful for realistic shading effect.
+ The object will be shaded per pixel. Useful for realistic shading effects.
</constant>
<constant name="SHADING_MODE_PER_VERTEX" value="2" enum="ShadingMode">
- The object will be shaded per vertex. Useful when you want cheaper shaders and do not care about visual quality.
+ The object will be shaded per vertex. Useful when you want cheaper shaders and do not care about visual quality. Not implemented yet (this mode will act like [constant SHADING_MODE_PER_PIXEL]).
</constant>
<constant name="SHADING_MODE_MAX" value="3" enum="ShadingMode">
Represents the size of the [enum ShadingMode] enum.
@@ -623,13 +625,13 @@
Objects will not write their depth to the depth buffer, even during the depth prepass (if enabled).
</constant>
<constant name="CULL_BACK" value="0" enum="CullMode">
- Default cull mode. The back of the object is culled when not visible. Back face triangles will be culled when facing the camera. This results in only the front side of triangles being drawn. For closed-surface meshes this means that only the exterior of the mesh will be visible.
+ Default cull mode. The back of the object is culled when not visible. Back face triangles will be culled when facing the camera. This results in only the front side of triangles being drawn. For closed-surface meshes, this means that only the exterior of the mesh will be visible.
</constant>
<constant name="CULL_FRONT" value="1" enum="CullMode">
- Front face triangles will be culled when facing the camera. This results in only the back side of triangles being drawn. For closed-surface meshes this means that the interior of the mesh will be drawn instead of the exterior.
+ Front face triangles will be culled when facing the camera. This results in only the back side of triangles being drawn. For closed-surface meshes, this means that the interior of the mesh will be drawn instead of the exterior.
</constant>
<constant name="CULL_DISABLED" value="2" enum="CullMode">
- No culling is performed.
+ No face culling is performed; both the front face and back face will be visible.
</constant>
<constant name="FLAG_DISABLE_DEPTH_TEST" value="0" enum="Flags">
Disables the depth test, so this object is drawn on top of all others drawn before it. This puts the object in the transparent draw pass where it is sorted based on distance to camera. Objects drawn after it in the draw order may cover it. This also disables writing to depth.
@@ -639,7 +641,7 @@
</constant>
<constant name="FLAG_SRGB_VERTEX_COLOR" value="2" enum="Flags">
Vertex colors are considered to be stored in sRGB color space and are converted to linear color space during rendering. See also [member vertex_color_is_srgb].
- [b]Note:[/b] Only effective when using the Vulkan Clustered or Vulkan Mobile backends.
+ [b]Note:[/b] Only effective when using the Forward+ and Mobile rendering methods.
</constant>
<constant name="FLAG_USE_POINT_SIZE" value="3" enum="Flags">
Uses point size to alter the size of primitive points. Also changes the albedo texture lookup to use [code]POINT_COORD[/code] instead of [code]UV[/code].
@@ -717,7 +719,7 @@
Toon blob which changes size based on roughness.
</constant>
<constant name="SPECULAR_DISABLED" value="2" enum="SpecularMode">
- No specular blob.
+ No specular blob. This is slightly faster to render than other specular modes.
</constant>
<constant name="BILLBOARD_DISABLED" value="0" enum="BillboardMode">
Billboard mode is disabled.
@@ -760,10 +762,10 @@
Smoothly fades the object out based on each pixel's distance from the camera using the alpha channel.
</constant>
<constant name="DISTANCE_FADE_PIXEL_DITHER" value="2" enum="DistanceFadeMode">
- Smoothly fades the object out based on each pixel's distance from the camera using a dither approach. Dithering discards pixels based on a set pattern to smoothly fade without enabling transparency. On certain hardware this can be faster than [constant DISTANCE_FADE_PIXEL_ALPHA].
+ Smoothly fades the object out based on each pixel's distance from the camera using a dithering approach. Dithering discards pixels based on a set pattern to smoothly fade without enabling transparency. On certain hardware, this can be faster than [constant DISTANCE_FADE_PIXEL_ALPHA].
</constant>
<constant name="DISTANCE_FADE_OBJECT_DITHER" value="3" enum="DistanceFadeMode">
- Smoothly fades the object out based on the object's distance from the camera using a dither approach. Dithering discards pixels based on a set pattern to smoothly fade without enabling transparency. On certain hardware this can be faster than [constant DISTANCE_FADE_PIXEL_ALPHA].
+ Smoothly fades the object out based on the object's distance from the camera using a dithering approach. Dithering discards pixels based on a set pattern to smoothly fade without enabling transparency. On certain hardware, this can be faster than [constant DISTANCE_FADE_PIXEL_ALPHA] and [constant DISTANCE_FADE_PIXEL_DITHER].
</constant>
</constants>
</class>
diff --git a/doc/classes/CPUParticles3D.xml b/doc/classes/CPUParticles3D.xml
index 3a15a117f5..df31fa9621 100644
--- a/doc/classes/CPUParticles3D.xml
+++ b/doc/classes/CPUParticles3D.xml
@@ -143,7 +143,7 @@
Maximum damping.
</member>
<member name="damping_min" type="float" setter="set_param_min" getter="get_param_min" default="0.0">
- Minimum damping
+ Minimum damping.
</member>
<member name="direction" type="Vector3" setter="set_direction" getter="get_direction" default="Vector3(1, 0, 0)">
Unit vector specifying the particles' emission direction.
diff --git a/doc/classes/Camera2D.xml b/doc/classes/Camera2D.xml
index 4156c9451a..6a99647e46 100644
--- a/doc/classes/Camera2D.xml
+++ b/doc/classes/Camera2D.xml
@@ -178,6 +178,7 @@
</member>
<member name="zoom" type="Vector2" setter="set_zoom" getter="get_zoom" default="Vector2(1, 1)">
The camera's zoom. A zoom of [code]Vector(2, 2)[/code] doubles the size seen in the viewport. A zoom of [code]Vector(0.5, 0.5)[/code] halves the size seen in the viewport.
+ [b]Note:[/b] [member FontFile.oversampling] does [i]not[/i] take [Camera2D] zoom into account. This means that zooming in/out will cause bitmap fonts and rasterized (non-MSDF) dynamic fonts to appear blurry or pixelated unless the font is part of a [CanvasLayer] that makes it ignore camera zoom. To ensure text remains crisp regardless of zoom, you can enable MSDF font rendering by enabling [member ProjectSettings.gui/theme/default_font_multichannel_signed_distance_field] (applies to the default project font only), or enabling [b]Multichannel Signed Distance Field[/b] in the import options of a DynamicFont for custom fonts. On system fonts, [member SystemFont.multichannel_signed_distance_field] can be enabled in the inspector.
</member>
</members>
<constants>
diff --git a/doc/classes/CameraAttributesPhysical.xml b/doc/classes/CameraAttributesPhysical.xml
index a61e735932..9512fd11a8 100644
--- a/doc/classes/CameraAttributesPhysical.xml
+++ b/doc/classes/CameraAttributesPhysical.xml
@@ -7,6 +7,7 @@
[CameraAttributesPhysical] is used to set rendering settings based on a physically-based camera's settings. It is responsible for exposure, auto-exposure, and depth of field.
When used in a [WorldEnvironment] it provides default settings for exposure, auto-exposure, and depth of field that will be used by all cameras without their own [CameraAttributes], including the editor camera. When used in a [Camera3D] it will override any [CameraAttributes] set in the [WorldEnvironment] and will override the [Camera3D]s [member Camera3D.far], [member Camera3D.near], [member Camera3D.fov], and [member Camera3D.keep_aspect] properties. When used in [VoxelGI] or [LightmapGI], only the exposure settings will be used.
The default settings are intended for use in an outdoor environment, tips for settings for use in an indoor environment can be found in each setting's documentation.
+ [b]Note:[/b] Depth of field blur is only supported in the Forward+ and Mobile rendering methods, not Compatibility.
</description>
<tutorials>
</tutorials>
diff --git a/doc/classes/CameraAttributesPractical.xml b/doc/classes/CameraAttributesPractical.xml
index 924b02fc79..cd914c9eb7 100644
--- a/doc/classes/CameraAttributesPractical.xml
+++ b/doc/classes/CameraAttributesPractical.xml
@@ -24,6 +24,7 @@
</member>
<member name="dof_blur_far_enabled" type="bool" setter="set_dof_blur_far_enabled" getter="is_dof_blur_far_enabled" default="false">
Enables depth of field blur for objects further than [member dof_blur_far_distance]. Strength of blur is controlled by [member dof_blur_amount] and modulated by [member dof_blur_far_transition].
+ [b]Note:[/b] Depth of field blur is only supported in the Forward+ and Mobile rendering methods, not Compatibility.
</member>
<member name="dof_blur_far_transition" type="float" setter="set_dof_blur_far_transition" getter="get_dof_blur_far_transition" default="5.0">
When positive, distance over which (starting from [member dof_blur_far_distance]) blur effect will scale from 0 to [member dof_blur_amount]. When negative, uses physically-based scaling so depth of field effect will scale from 0 at [member dof_blur_far_distance] and will increase in a physically accurate way as objects get further from the [Camera3D].
@@ -33,6 +34,7 @@
</member>
<member name="dof_blur_near_enabled" type="bool" setter="set_dof_blur_near_enabled" getter="is_dof_blur_near_enabled" default="false">
Enables depth of field blur for objects closer than [member dof_blur_near_distance]. Strength of blur is controlled by [member dof_blur_amount] and modulated by [member dof_blur_near_transition].
+ [b]Note:[/b] Depth of field blur is only supported in the Forward+ and Mobile rendering methods, not Compatibility.
</member>
<member name="dof_blur_near_transition" type="float" setter="set_dof_blur_near_transition" getter="get_dof_blur_near_transition" default="1.0">
When positive, distance over which blur effect will scale from 0 to [member dof_blur_amount], ending at [member dof_blur_near_distance]. When negative, uses physically-based scaling so depth of field effect will scale from 0 at [member dof_blur_near_distance] and will increase in a physically accurate way as objects get closer to the [Camera3D].
diff --git a/doc/classes/CanvasItem.xml b/doc/classes/CanvasItem.xml
index c3c768c12d..f99d90d32c 100644
--- a/doc/classes/CanvasItem.xml
+++ b/doc/classes/CanvasItem.xml
@@ -292,6 +292,7 @@
<param index="2" name="scale" type="Vector2" default="Vector2(1, 1)" />
<description>
Sets a custom transform for drawing via components. Anything drawn afterwards will be transformed by this.
+ [b]Note:[/b] [member FontFile.oversampling] does [i]not[/i] take [param scale] into account. This means that scaling up/down will cause bitmap fonts and rasterized (non-MSDF) dynamic fonts to appear blurry or pixelated. To ensure text remains crisp regardless of scale, you can enable MSDF font rendering by enabling [member ProjectSettings.gui/theme/default_font_multichannel_signed_distance_field] (applies to the default project font only), or enabling [b]Multichannel Signed Distance Field[/b] in the import options of a DynamicFont for custom fonts. On system fonts, [member SystemFont.multichannel_signed_distance_field] can be enabled in the inspector.
</description>
</method>
<method name="draw_set_transform_matrix">
diff --git a/doc/classes/CanvasLayer.xml b/doc/classes/CanvasLayer.xml
index ce999c06d3..cc8c84d082 100644
--- a/doc/classes/CanvasLayer.xml
+++ b/doc/classes/CanvasLayer.xml
@@ -50,7 +50,7 @@
Scales the layer when using [member follow_viewport_enabled]. Layers moving into the foreground should have increasing scales, while layers moving into the background should have decreasing scales.
</member>
<member name="layer" type="int" setter="set_layer" getter="get_layer" default="1">
- Layer index for draw order. Lower values are drawn first.
+ Layer index for draw order. Lower values are drawn behind higher values.
</member>
<member name="offset" type="Vector2" setter="set_offset" getter="get_offset" default="Vector2(0, 0)">
The layer's base offset.
diff --git a/doc/classes/CharacterBody2D.xml b/doc/classes/CharacterBody2D.xml
index 7395556d05..51cc752cae 100644
--- a/doc/classes/CharacterBody2D.xml
+++ b/doc/classes/CharacterBody2D.xml
@@ -71,10 +71,10 @@
print("Collided with: ", collision.collider.name)
[/gdscript]
[csharp]
- for (int i = 0; i &lt; GetSlideCount(); i++)
+ for (int i = 0; i &lt; GetSlideCollisionCount(); i++)
{
KinematicCollision2D collision = GetSlideCollision(i);
- GD.Print("Collided with: ", (collision.Collider as Node).Name);
+ GD.Print("Collided with: ", (collision.GetCollider() as Node).Name);
}
[/csharp]
[/codeblocks]
diff --git a/doc/classes/CodeEdit.xml b/doc/classes/CodeEdit.xml
index df40d2a4cf..1bc214aea7 100644
--- a/doc/classes/CodeEdit.xml
+++ b/doc/classes/CodeEdit.xml
@@ -486,7 +486,7 @@
Sets whether line folding is allowed.
</member>
<member name="line_length_guidelines" type="int[]" setter="set_line_length_guidelines" getter="get_line_length_guidelines" default="[]">
- Draws vertical lines at the provided columns. The first entry is considered a main hard guideline and is draw more prominently
+ Draws vertical lines at the provided columns. The first entry is considered a main hard guideline and is draw more prominently.
</member>
<member name="symbol_lookup_on_click" type="bool" setter="set_symbol_lookup_on_click_enabled" getter="is_symbol_lookup_on_click_enabled" default="false">
Set when a validated word from [signal symbol_validate] is clicked, the [signal symbol_lookup] should be emitted.
diff --git a/doc/classes/Color.xml b/doc/classes/Color.xml
index cee0e3ef7d..faa658971d 100644
--- a/doc/classes/Color.xml
+++ b/doc/classes/Color.xml
@@ -203,18 +203,18 @@
<return type="Color" />
<param index="0" name="hex" type="int" />
<description>
- Returns the [Color] associated with the provided [param hex] integer in 32-bit ARGB format (8 bits per channel, alpha channel first).
+ Returns the [Color] associated with the provided [param hex] integer in 32-bit RGBA format (8 bits per channel, alpha channel first).
In GDScript and C#, the [int] is best visualized with hexadecimal notation ([code]"0x"[/code] prefix).
[codeblocks]
[gdscript]
- var red = Color.hex(0xffff0000)
- var dark_cyan = Color.hex(0xff008b8b)
- var my_color = Color.hex(0xa4bbefd2)
+ var red = Color.hex(0xff0000ff)
+ var dark_cyan = Color.hex(0x008b8bff)
+ var my_color = Color.hex(0xbbefd2a4)
[/gdscript]
[csharp]
- var red = new Color(0xffff0000);
- var dark_cyan = new Color(0xff008b8b);
- var my_color = new Color(0xa4bbefd2);
+ var red = new Color(0xff0000ff);
+ var dark_cyan = new Color(0x008b8bff);
+ var my_color = new Color(0xbbefd2a4);
[/csharp]
[/codeblocks]
</description>
@@ -223,7 +223,7 @@
<return type="Color" />
<param index="0" name="hex" type="int" />
<description>
- Returns the [Color] associated with the provided [param hex] integer in 64-bit ARGB format (16 bits per channel, alpha channel first).
+ Returns the [Color] associated with the provided [param hex] integer in 64-bit RGBA format (16 bits per channel, alpha channel first).
In GDScript and C#, the [int] is best visualized with hexadecimal notation ([code]"0x"[/code] prefix).
</description>
</method>
diff --git a/doc/classes/Control.xml b/doc/classes/Control.xml
index 7d7925d61e..f45ddf2738 100644
--- a/doc/classes/Control.xml
+++ b/doc/classes/Control.xml
@@ -558,7 +558,7 @@
<return type="void" />
<description>
Steal the focus from another control and become the focused control (see [member focus_mode]).
- [b]Note[/b]: Using this method together with [method Callable.call_deferred] makes it more reliable, especially when called inside [method Node._ready].
+ [b]Note:[/b] Using this method together with [method Callable.call_deferred] makes it more reliable, especially when called inside [method Node._ready].
</description>
</method>
<method name="has_focus" qualifiers="const">
@@ -1007,7 +1007,8 @@
</member>
<member name="scale" type="Vector2" setter="set_scale" getter="get_scale" default="Vector2(1, 1)">
The node's scale, relative to its [member size]. Change this property to scale the node around its [member pivot_offset]. The Control's [member tooltip_text] will also scale according to this value.
- [b]Note:[/b] This property is mainly intended to be used for animation purposes. Text inside the Control will look pixelated or blurry when the Control is scaled. To support multiple resolutions in your project, use an appropriate viewport stretch mode as described in the [url=$DOCS_URL/tutorials/rendering/multiple_resolutions.html]documentation[/url] instead of scaling Controls individually.
+ [b]Note:[/b] This property is mainly intended to be used for animation purposes. To support multiple resolutions in your project, use an appropriate viewport stretch mode as described in the [url=$DOCS_URL/tutorials/rendering/multiple_resolutions.html]documentation[/url] instead of scaling Controls individually.
+ [b]Note:[/b] [member FontFile.oversampling] does [i]not[/i] take [Control] [member scale] into account. This means that scaling up/down will cause bitmap fonts and rasterized (non-MSDF) dynamic fonts to appear blurry or pixelated. To ensure text remains crisp regardless of scale, you can enable MSDF font rendering by enabling [member ProjectSettings.gui/theme/default_font_multichannel_signed_distance_field] (applies to the default project font only), or enabling [b]Multichannel Signed Distance Field[/b] in the import options of a DynamicFont for custom fonts. On system fonts, [member SystemFont.multichannel_signed_distance_field] can be enabled in the inspector.
[b]Note:[/b] If the Control node is a child of a [Container] node, the scale will be reset to [code]Vector2(1, 1)[/code] when the scene is instantiated. To set the Control's scale when it's instantiated, wait for one frame using [code]await get_tree().process_frame[/code] then set its [member scale] property.
</member>
<member name="shortcut_context" type="Node" setter="set_shortcut_context" getter="get_shortcut_context">
diff --git a/doc/classes/Decal.xml b/doc/classes/Decal.xml
index b63f6e7252..ddfa64891d 100644
--- a/doc/classes/Decal.xml
+++ b/doc/classes/Decal.xml
@@ -8,6 +8,7 @@
They are made of an [AABB] and a group of [Texture2D]s specifying [Color], normal, ORM (ambient occlusion, roughness, metallic), and emission. Decals are projected within their [AABB] so altering the orientation of the Decal affects the direction in which they are projected. By default, Decals are projected down (i.e. from positive Y to negative Y).
The [Texture2D]s associated with the Decal are automatically stored in a texture atlas which is used for drawing the decals so all decals can be drawn at once. Godot uses clustered decals, meaning they are stored in cluster data and drawn when the mesh is drawn, they are not drawn as a post-processing effect after.
[b]Note:[/b] Decals cannot affect an underlying material's transparency, regardless of its transparency mode (alpha blend, alpha scissor, alpha hash, opaque pre-pass). This means translucent or transparent areas of a material will remain translucent or transparent even if an opaque decal is applied on them.
+ [b]Note:[/b] Decals are only supported in the Forward+ and Mobile rendering methods, not Compatibility. When using the Mobile rendering method, only 8 decals can be displayed on each mesh resource. Attempting to display more than 8 decals on a single mesh resource will result in decals flickering in and out as the camera moves.
[b]Note:[/b] When using the Mobile rendering method, decals will only correctly affect meshes whose visibility AABB intersects with the decal's AABB. If using a shader to deform the mesh in a way that makes it go outside its AABB, [member GeometryInstance3D.extra_cull_margin] must be increased on the mesh. Otherwise, the decal may not be visible on the mesh.
</description>
<tutorials>
@@ -87,7 +88,8 @@
[b]Note:[/b] Setting [member normal_fade] to a value greater than [code]0.0[/code] has a small performance cost due to the added normal angle computations.
</member>
<member name="size" type="Vector3" setter="set_size" getter="get_size" default="Vector3(2, 2, 2)">
- Sets the size of the [AABB] used by the decal. The AABB goes from [code]-size/2[/code] to [code]size/2[/code].
+ Sets the size of the [AABB] used by the decal. All dimensions must be set to a value greater than zero (they will be clamped to [code]0.001[/code] if this is not the case). The AABB goes from [code]-size/2[/code] to [code]size/2[/code].
+ [b]Note:[/b] To improve culling efficiency of "hard surface" decals, set their [member upper_fade] and [member lower_fade] to [code]0.0[/code] and set the Y component of the [member size] as low as possible. This will reduce the decals' AABB size without affecting their appearance.
</member>
<member name="texture_albedo" type="Texture2D" setter="set_texture" getter="get_texture">
[Texture2D] with the base [Color] of the Decal. Either this or the [member texture_emission] must be set for the Decal to be visible. Use the alpha channel like a mask to smoothly blend the edges of the decal with the underlying object.
diff --git a/doc/classes/DirectionalLight2D.xml b/doc/classes/DirectionalLight2D.xml
index f825a9e082..eb710efda2 100644
--- a/doc/classes/DirectionalLight2D.xml
+++ b/doc/classes/DirectionalLight2D.xml
@@ -5,6 +5,7 @@
</brief_description>
<description>
A directional light is a type of [Light2D] node that models an infinite number of parallel rays covering the entire scene. It is used for lights with strong intensity that are located far away from the scene (for example: to model sunlight or moonlight).
+ [b]Note:[/b] [DirectionalLight2D] does not support light cull masks (but it supports shadow cull masks). It will always light up 2D nodes, regardless of the 2D node's [member CanvasItem.light_mask].
</description>
<tutorials>
<link title="2D lights and shadows">$DOCS_URL/tutorials/2d/2d_lights_and_shadows.html</link>
diff --git a/doc/classes/DisplayServer.xml b/doc/classes/DisplayServer.xml
index 55ba1f4f0c..fc5de1b771 100644
--- a/doc/classes/DisplayServer.xml
+++ b/doc/classes/DisplayServer.xml
@@ -651,7 +651,7 @@
<param index="1" name="idx" type="int" />
<param index="2" name="checkable" type="bool" />
<description>
- 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
+ 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.
[b]Note:[/b] This is purely cosmetic; you must add the logic for checking/unchecking items in radio groups.
[b]Note:[/b] This method is implemented on macOS.
</description>
@@ -1453,6 +1453,7 @@
Sets the V-Sync mode of the given window. See also [member ProjectSettings.display/window/vsync/vsync_mode].
See [enum DisplayServer.VSyncMode] for possible values and how they affect the behavior of your application.
Depending on the platform and used renderer, the engine will fall back to [constant VSYNC_ENABLED] if the desired mode is not supported.
+ [b]Note:[/b] V-Sync modes other than [constant VSYNC_ENABLED] are only supported in the Forward+ and Mobile rendering methods, not Compatibility.
</description>
</method>
<method name="window_set_window_buttons_offset">
@@ -1615,7 +1616,7 @@
I-beam cursor shape. This is used by default when hovering a control that accepts text input, such as [LineEdit] or [TextEdit].
</constant>
<constant name="CURSOR_POINTING_HAND" value="2" enum="CursorShape">
- Pointing hand cursor shape. This is used by default when hovering a [LinkButton] or an URL tag in a [RichTextLabel].â‹…
+ Pointing hand cursor shape. This is used by default when hovering a [LinkButton] or an URL tag in a [RichTextLabel].
</constant>
<constant name="CURSOR_CROSS" value="3" enum="CursorShape">
Crosshair cursor. This is intended to be displayed when the user needs precise aim over an element, such as a rectangle selection tool or a color picker.
@@ -1744,17 +1745,17 @@
[b]Note:[/b] This flag is implemented on macOS.
</constant>
<constant name="VSYNC_DISABLED" value="0" enum="VSyncMode">
- No vertical synchronization, which means the engine will display frames as fast as possible (tearing may be visible). Framerate is unlimited (nonwithstanding [member Engine.max_fps]).
+ No vertical synchronization, which means the engine will display frames as fast as possible (tearing may be visible). Framerate is unlimited (nonwithstanding [member Engine.max_fps]). Not supported when using the Compatibility rendering method.
</constant>
<constant name="VSYNC_ENABLED" value="1" enum="VSyncMode">
Default vertical synchronization mode, the image is displayed only on vertical blanking intervals (no tearing is visible). Framerate is limited by the monitor refresh rate (nonwithstanding [member Engine.max_fps]).
</constant>
<constant name="VSYNC_ADAPTIVE" value="2" enum="VSyncMode">
- Behaves like [constant VSYNC_DISABLED] when the framerate drops below the screen's refresh rate to reduce stuttering (tearing may be visible). Otherwise, vertical synchronization is enabled to avoid tearing. Framerate is limited by the monitor refresh rate (nonwithstanding [member Engine.max_fps]).
+ Behaves like [constant VSYNC_DISABLED] when the framerate drops below the screen's refresh rate to reduce stuttering (tearing may be visible). Otherwise, vertical synchronization is enabled to avoid tearing. Framerate is limited by the monitor refresh rate (nonwithstanding [member Engine.max_fps]). Not supported when using the Compatibility rendering method.
</constant>
<constant name="VSYNC_MAILBOX" value="3" enum="VSyncMode">
Displays the most recent image in the queue on vertical blanking intervals, while rendering to the other images (no tearing is visible). Framerate is unlimited (nonwithstanding [member Engine.max_fps]).
- Although not guaranteed, the images can be rendered as fast as possible, which may reduce input lag (also called "Fast" V-Sync mode). [constant VSYNC_MAILBOX] works best when at least twice as many frames as the display refresh rate are rendered.
+ Although not guaranteed, the images can be rendered as fast as possible, which may reduce input lag (also called "Fast" V-Sync mode). [constant VSYNC_MAILBOX] works best when at least twice as many frames as the display refresh rate are rendered. Not supported when using the Compatibility rendering method.
</constant>
<constant name="DISPLAY_HANDLE" value="0" enum="HandleType">
Display handle:
diff --git a/doc/classes/Engine.xml b/doc/classes/Engine.xml
index d583e07f59..461ffcb2e0 100644
--- a/doc/classes/Engine.xml
+++ b/doc/classes/Engine.xml
@@ -244,10 +244,14 @@
</description>
</method>
<method name="register_script_language">
- <return type="void" />
+ <return type="int" enum="Error" />
<param index="0" name="language" type="ScriptLanguage" />
<description>
Registers a [ScriptLanguage] instance to be available with [code]ScriptServer[/code].
+ Returns:
+ - [constant OK] on success
+ - [constant ERR_UNAVAILABLE] if [code]ScriptServer[/code] has reached it limit and cannot register any new language
+ - [constant ERR_ALREADY_EXISTS] if [code]ScriptServer[/code] already contains a language with similar extension/name/type
</description>
</method>
<method name="register_singleton">
@@ -258,6 +262,16 @@
Registers the given object as a singleton, globally available under [param name].
</description>
</method>
+ <method name="unregister_script_language">
+ <return type="int" enum="Error" />
+ <param index="0" name="language" type="ScriptLanguage" />
+ <description>
+ Unregisters the [ScriptLanguage] instance from [code]ScriptServer[/code].
+ Returns:
+ - [constant OK] on success
+ - [constant ERR_DOES_NOT_EXIST] if the language is already not registered in [code]ScriptServer[/code]
+ </description>
+ </method>
<method name="unregister_singleton">
<return type="void" />
<param index="0" name="name" type="StringName" />
diff --git a/doc/classes/Environment.xml b/doc/classes/Environment.xml
index 33b6a786ae..7ee1f2dfd4 100644
--- a/doc/classes/Environment.xml
+++ b/doc/classes/Environment.xml
@@ -46,6 +46,7 @@
</member>
<member name="adjustment_enabled" type="bool" setter="set_adjustment_enabled" getter="is_adjustment_enabled" default="false">
If [code]true[/code], enables the [code]adjustment_*[/code] properties provided by this resource. If [code]false[/code], modifications to the [code]adjustment_*[/code] properties will have no effect on the rendered scene.
+ [b]Note:[/b] Adjustments are only supported in the Forward+ and Mobile rendering methods, not Compatibility.
</member>
<member name="adjustment_saturation" type="float" setter="set_adjustment_saturation" getter="get_adjustment_saturation" default="1.0">
The global color saturation value of the rendered scene (default value is 1). Effective only if [code]adjustment_enabled[/code] is [code]true[/code].
@@ -118,6 +119,7 @@
</member>
<member name="glow_enabled" type="bool" setter="set_glow_enabled" getter="is_glow_enabled" default="false">
If [code]true[/code], the glow effect is enabled.
+ [b]Note:[/b] Glow is only supported in the Forward+ and Mobile rendering methods, not Compatibility. When using the Mobile rendering method, glow will look different due to the lower dynamic range available in the Mobile rendering method.
</member>
<member name="glow_hdr_luminance_cap" type="float" setter="set_glow_hdr_luminance_cap" getter="get_glow_hdr_luminance_cap" default="12.0">
The higher threshold of the HDR glow. Areas brighter than this threshold will be clamped for the purposes of the glow effect.
@@ -126,10 +128,10 @@
The bleed scale of the HDR glow.
</member>
<member name="glow_hdr_threshold" type="float" setter="set_glow_hdr_bleed_threshold" getter="get_glow_hdr_bleed_threshold" default="1.0">
- The lower threshold of the HDR glow. When using the OpenGL renderer (which doesn't support HDR), this needs to be below [code]1.0[/code] for glow to be visible. A value of [code]0.9[/code] works well in this case.
+ The lower threshold of the HDR glow. When using the Mobile rendering method (which only supports a lower dynamic range up to [code]2.0[/code]), this may need to be below [code]1.0[/code] for glow to be visible. A value of [code]0.9[/code] works well in this case. This value also needs to be decreased below [code]1.0[/code] when using glow in 2D, as 2D rendering is performed in SDR.
</member>
<member name="glow_intensity" type="float" setter="set_glow_intensity" getter="get_glow_intensity" default="0.8">
- The overall brightness multiplier of the glow effect. When using the OpenGL renderer, this should be increased to [code]1.5[/code] to compensate for the lack of HDR rendering.
+ The overall brightness multiplier of the glow effect. When using the Mobile rendering method (which only supports a lower dynamic range up to [code]2.0[/code]), this should be increased to [code]1.5[/code] to compensate.
</member>
<member name="glow_levels/1" type="float" setter="set_glow_level" getter="get_glow_level" default="0.0">
The intensity of the 1st level of glow. This is the most "local" level (least blurry).
@@ -166,7 +168,7 @@
If [code]true[/code], glow levels will be normalized so that summed together their intensities equal [code]1.0[/code].
</member>
<member name="glow_strength" type="float" setter="set_glow_strength" getter="get_glow_strength" default="1.0">
- The strength of the glow effect. This applies as the glow is blurred across the screen and increases the distance and intensity of the blur. When using the OpenGL renderer, this should be increased to 1.3 to compensate for the lack of HDR rendering.
+ The strength of the glow effect. This applies as the glow is blurred across the screen and increases the distance and intensity of the blur. When using the Mobile rendering method, this should be increased to compensate for the lower dynamic range.
</member>
<member name="reflected_light_source" type="int" setter="set_reflection_source" getter="get_reflection_source" enum="Environment.ReflectionSource" default="0">
The reflected (specular) light source.
@@ -184,6 +186,7 @@
</member>
<member name="sdfgi_enabled" type="bool" setter="set_sdfgi_enabled" getter="is_sdfgi_enabled" default="false">
If [code]true[/code], enables signed distance field global illumination for meshes that have their [member GeometryInstance3D.gi_mode] set to [constant GeometryInstance3D.GI_MODE_STATIC]. SDFGI is a real-time global illumination technique that works well with procedurally generated and user-built levels, including in situations where geometry is created during gameplay. The signed distance field is automatically generated around the camera as it moves. Dynamic lights are supported, but dynamic occluders and emissive surfaces are not.
+ [b]Note:[/b] SDFGI is only supported in the Forward+ rendering method, not Mobile or Compatibility.
[b]Performance:[/b] SDFGI is relatively demanding on the GPU and is not suited to low-end hardware such as integrated graphics (consider [LightmapGI] instead). To improve SDFGI performance, enable [member ProjectSettings.rendering/global_illumination/gi/use_half_resolution] in the Project Settings.
[b]Note:[/b] Meshes should have sufficiently thick walls to avoid light leaks (avoid one-sided walls). For interior levels, enclose your level geometry in a sufficiently large box and bridge the loops to close the mesh.
</member>
@@ -230,6 +233,7 @@
</member>
<member name="ssao_enabled" type="bool" setter="set_ssao_enabled" getter="is_ssao_enabled" default="false">
If [code]true[/code], the screen-space ambient occlusion effect is enabled. This darkens objects' corners and cavities to simulate ambient light not reaching the entire object as in real life. This works well for small, dynamic objects, but baked lighting or ambient occlusion textures will do a better job at displaying ambient occlusion on large static objects. Godot uses a form of SSAO called Adaptive Screen Space Ambient Occlusion which is itself a form of Horizon Based Ambient Occlusion.
+ [b]Note:[/b] SSAO is only supported in the Forward+ rendering method, not Mobile or Compatibility.
</member>
<member name="ssao_horizon" type="float" setter="set_ssao_horizon" getter="get_ssao_horizon" default="0.06">
The threshold for considering whether a given point on a surface is occluded or not represented as an angle from the horizon mapped into the [code]0.0-1.0[/code] range. A value of [code]1.0[/code] results in no occlusion.
@@ -251,6 +255,7 @@
</member>
<member name="ssil_enabled" type="bool" setter="set_ssil_enabled" getter="is_ssil_enabled" default="false">
If [code]true[/code], the screen-space indirect lighting effect is enabled. Screen space indirect lighting is a form of indirect lighting that allows diffuse light to bounce between nearby objects. Screen-space indirect lighting works very similarly to screen-space ambient occlusion, in that it only affects a limited range. It is intended to be used along with a form of proper global illumination like SDFGI or [VoxelGI]. Screen-space indirect lighting is not affected by individual light's [member Light3D.light_indirect_energy].
+ [b]Note:[/b] SSIL is only supported in the Forward+ rendering method, not Mobile or Compatibility.
</member>
<member name="ssil_intensity" type="float" setter="set_ssil_intensity" getter="get_ssil_intensity" default="1.0">
The brightness multiplier for the screen-space indirect lighting effect. A higher value will result in brighter light.
@@ -269,6 +274,7 @@
</member>
<member name="ssr_enabled" type="bool" setter="set_ssr_enabled" getter="is_ssr_enabled" default="false">
If [code]true[/code], screen-space reflections are enabled. Screen-space reflections are more accurate than reflections from [VoxelGI]s or [ReflectionProbe]s, but are slower and can't reflect surfaces occluded by others.
+ [b]Note:[/b] SSR is only supported in the Forward+ rendering method, not Mobile or Compatibility.
</member>
<member name="ssr_fade_in" type="float" setter="set_ssr_fade_in" getter="get_ssr_fade_in" default="0.15">
The fade-in distance for screen-space reflections. Affects the area from the reflected material to the screen-space reflection). Only positive values are valid (negative values will be clamped to [code]0.0[/code]).
@@ -314,7 +320,7 @@
</member>
<member name="volumetric_fog_enabled" type="bool" setter="set_volumetric_fog_enabled" getter="is_volumetric_fog_enabled" default="false">
Enables the volumetric fog effect. Volumetric fog uses a screen-aligned froxel buffer to calculate accurate volumetric scattering in the short to medium range. Volumetric fog interacts with [FogVolume]s and lights to calculate localized and global fog. Volumetric fog uses a PBR single-scattering model based on extinction, scattering, and emission which it exposes to users as density, albedo, and emission.
- [b]Note:[/b] Volumetric fog is only available in the forward plus renderer. It is not available in the mobile renderer or the compatibility renderer.
+ [b]Note:[/b] Volumetric fog is only supported in the Forward+ rendering method, not Mobile or Compatibility.
</member>
<member name="volumetric_fog_gi_inject" type="float" setter="set_volumetric_fog_gi_inject" getter="get_volumetric_fog_gi_inject" default="1.0">
Scales the strength of Global Illumination used in the volumetric fog's albedo color. A value of [code]0.0[/code] means that Global Illumination will not impact the volumetric fog. [member volumetric_fog_gi_inject] has a small performance cost when set above [code]0.0[/code].
diff --git a/doc/classes/FileAccess.xml b/doc/classes/FileAccess.xml
index 687a64b8ff..526f7c22e6 100644
--- a/doc/classes/FileAccess.xml
+++ b/doc/classes/FileAccess.xml
@@ -33,7 +33,7 @@
[/csharp]
[/codeblocks]
In the example above, the file will be saved in the user data folder as specified in the [url=$DOCS_URL/tutorials/io/data_paths.html]Data paths[/url] documentation.
- There is no method to close a file in order to free it from use. Instead, [FileAccess] will close when it's freed, which happens when it goes out of scope or when it gets assigned with [code]null[/code]. In C# the reference must be disposed after we are done using it, this can be done with the [code]using[/code] statement or calling the [code]Dispose[/code] method directly.
+ [FileAccess] will close when it's freed, which happens when it goes out of scope or when it gets assigned with [code]null[/code]. In C# the reference must be disposed after we are done using it, this can be done with the [code]using[/code] statement or calling the [code]Dispose[/code] method directly.
[codeblocks]
[gdscript]
var file = FileAccess.open("res://something") # File is opened and locked for use.
@@ -52,6 +52,13 @@
<link title="3D Voxel Demo">https://godotengine.org/asset-library/asset/676</link>
</tutorials>
<methods>
+ <method name="close">
+ <return type="void" />
+ <description>
+ Closes the currently opened file and prevents subsequent read/write operations. Use flush to persist the data to disk without closing the file.
+ [b]Note:[/b] [FileAccess] will automatically close when it's freed, which happens when it goes out of scope or when it gets assigned with [code]null[/code]. In C# the reference must be disposed after we are done using it, this can be done with the [code]using[/code] statement or calling the [code]Dispose[/code] method directly.
+ </description>
+ </method>
<method name="eof_reached" qualifiers="const">
<return type="bool" />
<description>
@@ -249,6 +256,7 @@
<param index="0" name="allow_objects" type="bool" default="false" />
<description>
Returns the next [Variant] value from the file. If [param allow_objects] is [code]true[/code], decoding objects is allowed.
+ Internally, this uses the same decoding mechanism as the [method @GlobalScope.bytes_to_var] method.
[b]Warning:[/b] Deserialized objects can contain code which gets executed. Do not use this option if the serialized object comes from untrusted sources to avoid potential security threats such as remote code execution.
</description>
</method>
@@ -447,6 +455,7 @@
<param index="1" name="full_objects" type="bool" default="false" />
<description>
Stores any Variant value in the file. If [param full_objects] is [code]true[/code], encoding objects is allowed (and can potentially include code).
+ Internally, this uses the same encoding mechanism as the [method @GlobalScope.var_to_bytes] method.
[b]Note:[/b] Not all properties are included. Only properties that are configured with the [constant PROPERTY_USAGE_STORAGE] flag set will be serialized. You can add a new usage flag to a property by overriding the [method Object._get_property_list] method in your class. You can also check how property usage is configured by calling [method Object._get_property_list]. See [enum PropertyUsageFlags] for the possible usage flags.
</description>
</method>
diff --git a/doc/classes/Font.xml b/doc/classes/Font.xml
index 761e75339a..2f1c68c322 100644
--- a/doc/classes/Font.xml
+++ b/doc/classes/Font.xml
@@ -238,7 +238,7 @@
<param index="5" name="direction" type="int" enum="TextServer.Direction" default="0" />
<param index="6" name="orientation" type="int" enum="TextServer.Orientation" default="0" />
<description>
- Returns the size of a bounding box of a single-line string, taking kerning and advance into account. See also [method get_multiline_string_size] and [method draw_string].
+ Returns the size of a bounding box of a single-line string, taking kerning, advance and subpixel positioning into account. See also [method get_multiline_string_size] and [method draw_string].
For example, to get the string size as displayed by a single-line Label, use:
[codeblocks]
[gdscript]
@@ -249,6 +249,7 @@
Vector2 stringSize = label.GetThemeFont("font").GetStringSize(label.Text, HorizontalAlignment.Left, -1, label.GetThemeFontSize("font_size"));
[/csharp]
[/codeblocks]
+ [b]Note:[/b] Since kerning, advance and subpixel positioning are taken into account by [method get_string_size], using separate [method get_string_size] calls on substrings of a string then adding the results together will return a different result compared to using a single [method get_string_size] call on the full string.
[b]Note:[/b] Real height of the string is context-dependent and can be significantly different from the value returned by [method get_height].
</description>
</method>
diff --git a/doc/classes/FontVariation.xml b/doc/classes/FontVariation.xml
index 5bc2606adb..11286e46a4 100644
--- a/doc/classes/FontVariation.xml
+++ b/doc/classes/FontVariation.xml
@@ -49,7 +49,7 @@
Extra spacing at the bottom of the line in pixels.
</member>
<member name="spacing_glyph" type="int" setter="set_spacing" getter="get_spacing" default="0">
- Extra spacing between graphical glyphs
+ Extra spacing between graphical glyphs.
</member>
<member name="spacing_space" type="int" setter="set_spacing" getter="get_spacing" default="0">
Extra width of the space glyphs.
diff --git a/doc/classes/Light2D.xml b/doc/classes/Light2D.xml
index 062d532464..9f1b1af60d 100644
--- a/doc/classes/Light2D.xml
+++ b/doc/classes/Light2D.xml
@@ -41,7 +41,8 @@
The Light2D's energy value. The larger the value, the stronger the light.
</member>
<member name="range_item_cull_mask" type="int" setter="set_item_cull_mask" getter="get_item_cull_mask" default="1">
- The layer mask. Only objects with a matching mask will be affected by the Light2D.
+ The layer mask. Only objects with a matching [member CanvasItem.light_mask] will be affected by the Light2D. See also [member shadow_item_cull_mask], which affects which objects can cast shadows.
+ [b]Note:[/b] [member range_item_cull_mask] is ignored by [DirectionalLight2D], which will always light a 2D node regardless of the 2D node's [member CanvasItem.light_mask].
</member>
<member name="range_layer_max" type="int" setter="set_layer_range_max" getter="get_layer_range_max" default="0">
Maximum layer value of objects that are affected by the Light2D.
@@ -68,7 +69,7 @@
Smoothing value for shadows. Higher values will result in softer shadows, at the cost of visible streaks that can appear in shadow rendering. [member shadow_filter_smooth] only has an effect if [member shadow_filter] is [constant SHADOW_FILTER_PCF5] or [constant SHADOW_FILTER_PCF13].
</member>
<member name="shadow_item_cull_mask" type="int" setter="set_item_shadow_cull_mask" getter="get_item_shadow_cull_mask" default="1">
- The shadow mask. Used with [LightOccluder2D] to cast shadows. Only occluders with a matching light mask will cast shadows.
+ The shadow mask. Used with [LightOccluder2D] to cast shadows. Only occluders with a matching [member CanvasItem.light_mask] will cast shadows. See also [member range_item_cull_mask], which affects which objects can [i]receive[/i] the light.
</member>
</members>
<constants>
diff --git a/doc/classes/Light3D.xml b/doc/classes/Light3D.xml
index 95c39d535e..2a0b2da46c 100644
--- a/doc/classes/Light3D.xml
+++ b/doc/classes/Light3D.xml
@@ -54,8 +54,9 @@
If [code]true[/code], the light only appears in the editor and will not be visible at runtime.
</member>
<member name="light_angular_distance" type="float" setter="set_param" getter="get_param" default="0.0">
- The light's angular size in degrees. Increasing this will make shadows softer at greater distances. Only available for [DirectionalLight3D]s. For reference, the Sun from the Earth is approximately [code]0.5[/code].
+ The light's angular size in degrees. Increasing this will make shadows softer at greater distances (also called percentage-closer soft shadows, or PCSS). Only available for [DirectionalLight3D]s. For reference, the Sun from the Earth is approximately [code]0.5[/code]. Increasing this value above [code]0.0[/code] for lights with shadows enabled will have a noticeable performance cost due to PCSS.
[b]Note:[/b] [member light_angular_distance] is not affected by [member Node3D.scale] (the light's scale or its parent's scale).
+ [b]Note:[/b] PCSS for directional lights is only supported in the Forward+ rendering method, not Mobile or Compatibility.
</member>
<member name="light_bake_mode" type="int" setter="set_bake_mode" getter="get_bake_mode" enum="Light3D.BakeMode" default="2">
The light's bake mode. This will affect the global illumination techniques that have an effect on the light's rendering. See [enum BakeMode].
@@ -89,10 +90,12 @@
<member name="light_projector" type="Texture2D" setter="set_projector" getter="get_projector">
[Texture2D] projected by light. [member shadow_enabled] must be on for the projector to work. Light projectors make the light appear as if it is shining through a colored but transparent object, almost like light shining through stained-glass.
[b]Note:[/b] Unlike [BaseMaterial3D] whose filter mode can be adjusted on a per-material basis, the filter mode for light projector textures is set globally with [member ProjectSettings.rendering/textures/light_projectors/filter].
+ [b]Note:[/b] Light projector textures are only supported in the Forward+ and Mobile rendering methods, not Compatibility.
</member>
<member name="light_size" type="float" setter="set_param" getter="get_param" default="0.0">
- The size of the light in Godot units. Only available for [OmniLight3D]s and [SpotLight3D]s. Increasing this value will make the light fade out slower and shadows appear blurrier. This can be used to simulate area lights to an extent.
+ The size of the light in Godot units. Only available for [OmniLight3D]s and [SpotLight3D]s. Increasing this value will make the light fade out slower and shadows appear blurrier (also called percentage-closer soft shadows, or PCSS). This can be used to simulate area lights to an extent. Increasing this value above [code]0.0[/code] for lights with shadows enabled will have a noticeable performance cost due to PCSS.
[b]Note:[/b] [member light_size] is not affected by [member Node3D.scale] (the light's scale or its parent's scale).
+ [b]Note:[/b] PCSS for positional lights is only supported in the Forward+ and Mobile rendering methods, not Compatibility.
</member>
<member name="light_specular" type="float" setter="set_param" getter="get_param" default="0.5">
The intensity of the specular blob in objects affected by the light. At [code]0[/code], the light becomes a pure diffuse light. When not baking emission, this can be used to avoid unrealistic reflections when placing lights above an emissive surface.
diff --git a/doc/classes/Marshalls.xml b/doc/classes/Marshalls.xml
index 1eeb0be7ce..e350f3212f 100644
--- a/doc/classes/Marshalls.xml
+++ b/doc/classes/Marshalls.xml
@@ -29,6 +29,7 @@
<param index="1" name="allow_objects" type="bool" default="false" />
<description>
Returns a decoded [Variant] corresponding to the Base64-encoded string [param base64_str]. If [param allow_objects] is [code]true[/code], decoding objects is allowed.
+ Internally, this uses the same decoding mechanism as the [method @GlobalScope.bytes_to_var] method.
[b]Warning:[/b] Deserialized objects can contain code which gets executed. Do not use this option if the serialized object comes from untrusted sources to avoid potential security threats such as remote code execution.
</description>
</method>
@@ -52,6 +53,7 @@
<param index="1" name="full_objects" type="bool" default="false" />
<description>
Returns a Base64-encoded string of the [Variant] [param variant]. If [param full_objects] is [code]true[/code], encoding objects is allowed (and can potentially include code).
+ Internally, this uses the same encoding mechanism as the [method @GlobalScope.var_to_bytes] method.
</description>
</method>
</methods>
diff --git a/doc/classes/NavigationAgent2D.xml b/doc/classes/NavigationAgent2D.xml
index 92fd8bcc6a..c6d03fb6d8 100644
--- a/doc/classes/NavigationAgent2D.xml
+++ b/doc/classes/NavigationAgent2D.xml
@@ -171,6 +171,8 @@
- [code]type[/code]: Always [constant NavigationPathQueryResult2D.PATH_SEGMENT_TYPE_LINK].
- [code]rid[/code]: The [RID] of the link.
- [code]owner[/code]: The object which manages the link (usually [NavigationLink2D]).
+ - [code]link_entry_position[/code]: If [code]owner[/code] is available and the owner is a [NavigationLink2D], it will contain the global position of the link's point the agent is entering.
+ - [code]link_exit_position[/code]: If [code]owner[/code] is available and the owner is a [NavigationLink2D], it will contain the global position of the link's point which the agent is exiting.
</description>
</signal>
<signal name="navigation_finished">
diff --git a/doc/classes/NavigationAgent3D.xml b/doc/classes/NavigationAgent3D.xml
index 0ed11bc477..294fe49408 100644
--- a/doc/classes/NavigationAgent3D.xml
+++ b/doc/classes/NavigationAgent3D.xml
@@ -174,6 +174,8 @@
- [code]type[/code]: Always [constant NavigationPathQueryResult3D.PATH_SEGMENT_TYPE_LINK].
- [code]rid[/code]: The [RID] of the link.
- [code]owner[/code]: The object which manages the link (usually [NavigationLink3D]).
+ - [code]link_entry_position[/code]: If [code]owner[/code] is available and the owner is a [NavigationLink2D], it will contain the global position of the link's point the agent is entering.
+ - [code]link_exit_position[/code]: If [code]owner[/code] is available and the owner is a [NavigationLink2D], it will contain the global position of the link's point which the agent is exiting.
</description>
</signal>
<signal name="navigation_finished">
diff --git a/doc/classes/NavigationLink2D.xml b/doc/classes/NavigationLink2D.xml
index b3f4367675..3f5b1fb184 100644
--- a/doc/classes/NavigationLink2D.xml
+++ b/doc/classes/NavigationLink2D.xml
@@ -10,6 +10,18 @@
<link title="Using NavigationLinks">$DOCS_URL/tutorials/navigation/navigation_using_navigationlinks.html</link>
</tutorials>
<methods>
+ <method name="get_global_end_position" qualifiers="const">
+ <return type="Vector2" />
+ <description>
+ Returns the [member end_position] that is relative to the link as a global position.
+ </description>
+ </method>
+ <method name="get_global_start_position" qualifiers="const">
+ <return type="Vector2" />
+ <description>
+ Returns the [member start_position] that is relative to the link as a global position.
+ </description>
+ </method>
<method name="get_navigation_layer_value" qualifiers="const">
<return type="bool" />
<param index="0" name="layer_number" type="int" />
@@ -17,6 +29,20 @@
Returns whether or not the specified layer of the [member navigation_layers] bitmask is enabled, given a [code]layer_number[/code] between 1 and 32.
</description>
</method>
+ <method name="set_global_end_position">
+ <return type="void" />
+ <param index="0" name="position" type="Vector2" />
+ <description>
+ Sets the [member end_position] that is relative to the link from a global [param position].
+ </description>
+ </method>
+ <method name="set_global_start_position">
+ <return type="void" />
+ <param index="0" name="position" type="Vector2" />
+ <description>
+ Sets the [member start_position] that is relative to the link from a global [param position].
+ </description>
+ </method>
<method name="set_navigation_layer_value">
<return type="void" />
<param index="0" name="layer_number" type="int" />
diff --git a/doc/classes/NavigationLink3D.xml b/doc/classes/NavigationLink3D.xml
index 4dff226042..4081426dcd 100644
--- a/doc/classes/NavigationLink3D.xml
+++ b/doc/classes/NavigationLink3D.xml
@@ -10,6 +10,18 @@
<link title="Using NavigationLinks">$DOCS_URL/tutorials/navigation/navigation_using_navigationlinks.html</link>
</tutorials>
<methods>
+ <method name="get_global_end_position" qualifiers="const">
+ <return type="Vector3" />
+ <description>
+ Returns the [member end_position] that is relative to the link as a global position.
+ </description>
+ </method>
+ <method name="get_global_start_position" qualifiers="const">
+ <return type="Vector3" />
+ <description>
+ Returns the [member start_position] that is relative to the link as a global position.
+ </description>
+ </method>
<method name="get_navigation_layer_value" qualifiers="const">
<return type="bool" />
<param index="0" name="layer_number" type="int" />
@@ -17,6 +29,20 @@
Returns whether or not the specified layer of the [member navigation_layers] bitmask is enabled, given a [code]layer_number[/code] between 1 and 32.
</description>
</method>
+ <method name="set_global_end_position">
+ <return type="void" />
+ <param index="0" name="position" type="Vector3" />
+ <description>
+ Sets the [member end_position] that is relative to the link from a global [param position].
+ </description>
+ </method>
+ <method name="set_global_start_position">
+ <return type="void" />
+ <param index="0" name="position" type="Vector3" />
+ <description>
+ Sets the [member start_position] that is relative to the link from a global [param position].
+ </description>
+ </method>
<method name="set_navigation_layer_value">
<return type="void" />
<param index="0" name="layer_number" type="int" />
diff --git a/doc/classes/NavigationServer2D.xml b/doc/classes/NavigationServer2D.xml
index 7270a19b4d..103de8eddb 100644
--- a/doc/classes/NavigationServer2D.xml
+++ b/doc/classes/NavigationServer2D.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="NavigationServer2D" inherits="Object" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
<brief_description>
- Server interface for low-level 2D navigation access
+ Server interface for low-level 2D navigation access.
</brief_description>
<description>
NavigationServer2D is the server responsible for all 2D navigation. It handles several objects, namely maps, regions and agents.
@@ -126,6 +126,12 @@
Destroys the given RID.
</description>
</method>
+ <method name="get_debug_enabled" qualifiers="const">
+ <return type="bool" />
+ <description>
+ Returns [code]true[/code] when the NavigationServer has debug enabled.
+ </description>
+ </method>
<method name="get_maps" qualifiers="const">
<return type="RID[]" />
<description>
@@ -520,6 +526,13 @@
Sets the [param travel_cost] for this [param region].
</description>
</method>
+ <method name="set_debug_enabled">
+ <return type="void" />
+ <param index="0" name="enabled" type="bool" />
+ <description>
+ If [code]true[/code] enables debug mode on the NavigationServer.
+ </description>
+ </method>
</methods>
<signals>
<signal name="map_changed">
diff --git a/doc/classes/NavigationServer3D.xml b/doc/classes/NavigationServer3D.xml
index 340821d41e..0d8cb78ff9 100644
--- a/doc/classes/NavigationServer3D.xml
+++ b/doc/classes/NavigationServer3D.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="NavigationServer3D" inherits="Object" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
<brief_description>
- Server interface for low-level 3D navigation access
+ Server interface for low-level 3D navigation access.
</brief_description>
<description>
NavigationServer3D is the server responsible for all 3D navigation. It handles several objects, namely maps, regions and agents.
@@ -126,6 +126,12 @@
Destroys the given RID.
</description>
</method>
+ <method name="get_debug_enabled" qualifiers="const">
+ <return type="bool" />
+ <description>
+ Returns [code]true[/code] when the NavigationServer has debug enabled.
+ </description>
+ </method>
<method name="get_maps" qualifiers="const">
<return type="RID[]" />
<description>
@@ -422,15 +428,6 @@
Sets the map up direction.
</description>
</method>
- <method name="process">
- <return type="void" />
- <param index="0" name="delta_time" type="float" />
- <description>
- Process the collision avoidance agents.
- The result of this process is needed by the physics server, so this must be called in the main thread.
- [b]Note:[/b] This function is not thread safe.
- </description>
- </method>
<method name="query_path" qualifiers="const">
<return type="void" />
<param index="0" name="parameters" type="NavigationPathQueryParameters3D" />
@@ -584,6 +581,13 @@
Control activation of this server.
</description>
</method>
+ <method name="set_debug_enabled">
+ <return type="void" />
+ <param index="0" name="enabled" type="bool" />
+ <description>
+ If [code]true[/code] enables debug mode on the NavigationServer.
+ </description>
+ </method>
</methods>
<signals>
<signal name="map_changed">
diff --git a/doc/classes/NinePatchRect.xml b/doc/classes/NinePatchRect.xml
index 1592718c4b..4b406385e1 100644
--- a/doc/classes/NinePatchRect.xml
+++ b/doc/classes/NinePatchRect.xml
@@ -68,11 +68,9 @@
</constant>
<constant name="AXIS_STRETCH_MODE_TILE" value="1" enum="AxisStretchMode">
Repeats the center texture across the NinePatchRect. This won't cause any visible distortion. The texture must be seamless for this to work without displaying artifacts between edges.
- [b]Note:[/b] Only supported when using the Vulkan renderer. When using the OpenGL renderer, this will behave like [constant AXIS_STRETCH_MODE_STRETCH].
</constant>
<constant name="AXIS_STRETCH_MODE_TILE_FIT" value="2" enum="AxisStretchMode">
Repeats the center texture across the NinePatchRect, but will also stretch the texture to make sure each tile is visible in full. This may cause the texture to be distorted, but less than [constant AXIS_STRETCH_MODE_STRETCH]. The texture must be seamless for this to work without displaying artifacts between edges.
- [b]Note:[/b] Only supported when using the Vulkan renderer. When using the OpenGL renderer, this will behave like [constant AXIS_STRETCH_MODE_STRETCH].
</constant>
</constants>
</class>
diff --git a/doc/classes/Node3D.xml b/doc/classes/Node3D.xml
index 1aa71113e9..c199c1aae6 100644
--- a/doc/classes/Node3D.xml
+++ b/doc/classes/Node3D.xml
@@ -4,7 +4,7 @@
Most basic 3D game object, parent of all 3D-related nodes.
</brief_description>
<description>
- Most basic 3D game object, with a 3D [Transform3D] and visibility settings. All other 3D game objects inherit from Node3D. Use [Node3D] as a parent node to move, scale, rotate and show/hide children in a 3D project.
+ Most basic 3D game object, with a [Transform3D] and visibility settings. All other 3D game objects inherit from Node3D. Use [Node3D] as a parent node to move, scale, rotate and show/hide children in a 3D project.
Affine operations (rotate, scale, translate) happen in parent's local coordinate system, unless the [Node3D] object is set as top-level. Affine operations in this coordinate system correspond to direct affine operations on the [Node3D]'s transform. The word local below refers to this coordinate system. The coordinate system that is attached to the [Node3D] object itself is referred to as object-local coordinate system.
[b]Note:[/b] Unless otherwise specified, all methods that have angle parameters must have angles specified as [i]radians[/i]. To convert degrees to radians, use [method @GlobalScope.deg_to_rad].
</description>
diff --git a/doc/classes/Object.xml b/doc/classes/Object.xml
index ab7ae82875..226a1948e1 100644
--- a/doc/classes/Object.xml
+++ b/doc/classes/Object.xml
@@ -345,7 +345,7 @@
node.Callv(Node3D.MethodName.Rotate, new Godot.Collections.Array { new Vector3(1f, 0f, 0f), 1.571f });
[/csharp]
[/codeblocks]
- [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
+ [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.
</description>
</method>
<method name="can_translate_messages" qualifiers="const">
diff --git a/doc/classes/OmniLight3D.xml b/doc/classes/OmniLight3D.xml
index c0e10574c8..7c5b9aff46 100644
--- a/doc/classes/OmniLight3D.xml
+++ b/doc/classes/OmniLight3D.xml
@@ -5,6 +5,7 @@
</brief_description>
<description>
An Omnidirectional light is a type of [Light3D] that emits light in all directions. The light is attenuated by distance and this attenuation can be configured by changing its energy, radius, and attenuation parameters.
+ [b]Note:[/b] When using the Mobile rendering method, only 8 omni lights can be displayed on each mesh resource. Attempting to display more than 8 omni lights on a single mesh resource will result in omni lights flickering in and out as the camera moves. When using the Compatibility rendering method, only 8 omni lights can be displayed on each mesh resource by default, but this can be increased by adjusting [member ProjectSettings.rendering/limits/opengl/max_lights_per_object].
[b]Note:[/b] When using the Mobile or Compatibility rendering methods, omni lights will only correctly affect meshes whose visibility AABB intersects with the light's AABB. If using a shader to deform the mesh in a way that makes it go outside its AABB, [member GeometryInstance3D.extra_cull_margin] must be increased on the mesh. Otherwise, the light may not be visible on the mesh.
</description>
<tutorials>
@@ -12,7 +13,8 @@
</tutorials>
<members>
<member name="omni_attenuation" type="float" setter="set_param" getter="get_param" default="1.0">
- The light's attenuation (drop-off) curve. A number of presets are available in the [b]Inspector[/b] by right-clicking the curve.
+ The light's attenuation (drop-off) curve. A number of presets are available in the [b]Inspector[/b] by right-clicking the curve. Zero and negative values are allowed but can produce unusual effects.
+ [b]Note:[/b] Very high [member omni_attenuation] values (typically above 10) can impact performance negatively if the light is made to use a larger [member omni_range] to compensate. This is because culling opportunities will become less common and shading costs will be increased (as the light will cover more pixels on screen while resulting in the same amount of brightness). To improve performance, use the lowest [member omni_attenuation] value possible for the visuals you're trying to achieve.
</member>
<member name="omni_range" type="float" setter="set_param" getter="get_param" default="5.0">
The light's radius. Note that the effectively lit area may appear to be smaller depending on the [member omni_attenuation] in use. No matter the [member omni_attenuation] in use, the light will never reach anything outside this radius.
diff --git a/doc/classes/PacketPeer.xml b/doc/classes/PacketPeer.xml
index ab2bc34672..5dd9c5c9f9 100644
--- a/doc/classes/PacketPeer.xml
+++ b/doc/classes/PacketPeer.xml
@@ -33,6 +33,7 @@
<param index="0" name="allow_objects" type="bool" default="false" />
<description>
Gets a Variant. If [param allow_objects] is [code]true[/code], decoding objects is allowed.
+ Internally, this uses the same decoding mechanism as the [method @GlobalScope.bytes_to_var] method.
[b]Warning:[/b] Deserialized objects can contain code which gets executed. Do not use this option if the serialized object comes from untrusted sources to avoid potential security threats such as remote code execution.
</description>
</method>
@@ -49,6 +50,7 @@
<param index="1" name="full_objects" type="bool" default="false" />
<description>
Sends a [Variant] as a packet. If [param full_objects] is [code]true[/code], encoding objects is allowed (and can potentially include code).
+ Internally, this uses the same encoding mechanism as the [method @GlobalScope.var_to_bytes] method.
</description>
</method>
</methods>
diff --git a/doc/classes/PhysicsDirectSpaceState3D.xml b/doc/classes/PhysicsDirectSpaceState3D.xml
index cc1cf8a323..f7bc74d9ad 100644
--- a/doc/classes/PhysicsDirectSpaceState3D.xml
+++ b/doc/classes/PhysicsDirectSpaceState3D.xml
@@ -21,7 +21,7 @@
</description>
</method>
<method name="collide_shape">
- <return type="PackedVector2Array[]" />
+ <return type="PackedVector3Array[]" />
<param index="0" name="parameters" type="PhysicsShapeQueryParameters3D" />
<param index="1" name="max_results" type="int" default="32" />
<description>
diff --git a/doc/classes/PhysicsServer2D.xml b/doc/classes/PhysicsServer2D.xml
index c3387cf6bd..1fbe77b64b 100644
--- a/doc/classes/PhysicsServer2D.xml
+++ b/doc/classes/PhysicsServer2D.xml
@@ -4,7 +4,14 @@
Server interface for low-level 2D physics access.
</brief_description>
<description>
- PhysicsServer2D is the server responsible for all 2D physics. It can create many kinds of physics objects, but does not insert them on the node tree.
+ PhysicsServer2D is the server responsible for all 2D physics. It can directly create and manipulate all physics objects:
+ - A [i]space[/i] is a self-contained world for a physics simulation. It contains bodies, areas, and joints. Its state can be queried for collision and intersection information, and several parameters of the simulation can be modified.
+ - A [i]shape[/i] is a geometric figure such as a circle, a rectangle, a capsule, or a polygon. It can be used for collision detection by adding it to a body/area, possibly with an extra transformation relative to the body/area's origin. Bodies/areas can have multiple (transformed) shapes added to them, and a single shape can be added to bodies/areas multiple times with different local transformations.
+ - A [i]body[/i] is a physical object which can be in static, kinematic, or rigid mode. Its state (such as position and velocity) can be queried and updated. A force integration callback can be set to customize the body's physics.
+ - An [i]area[/i] is a region in space which can be used to detect bodies and areas entering and exiting it. A body monitoring callback can be set to report entering/exiting body shapes, and similarly an area monitoring callback can be set. Gravity and damping can be overridden within the area by setting area parameters.
+ - A [i]joint[/i] is a constraint, either between two bodies or on one body relative to a point. Parameters such as the joint bias and the rest length of a spring joint can be adjusted.
+ Physics objects in the physics server may be created and manipulated independently; they do not have to be tied to nodes in the scene tree.
+ [b]Note:[/b] All the physics nodes use the physics server internally. Adding a physics node to the scene tree will cause a corresponding physics object to be created in the physics server. A rigid body node registers a callback that updates the node's transform with the transform of the respective body object in the physics server (every physics update). An area node registers a callback to inform the area node about overlaps with the respective area object in the physics server. The raycast node queries the direct state of the relevant space in the physics server.
</description>
<tutorials>
</tutorials>
@@ -16,7 +23,7 @@
<param index="2" name="transform" type="Transform2D" default="Transform2D(1, 0, 0, 1, 0, 0)" />
<param index="3" name="disabled" type="bool" default="false" />
<description>
- Adds a shape to the area, along with a transform matrix. Shapes are usually referenced by their index, so you should track which shape has a given index.
+ Adds a shape to the area, with the given local transform. The shape (together with its [param transform] and [param disabled] properties) is added to an array of shapes, and the shapes of an area are usually referenced by their index in this array.
</description>
</method>
<method name="area_attach_canvas_instance_id">
@@ -24,6 +31,7 @@
<param index="0" name="area" type="RID" />
<param index="1" name="id" type="int" />
<description>
+ Attaches the [code]ObjectID[/code] of a canvas to the area. Use [method Object.get_instance_id] to get the [code]ObjectID[/code] of a [CanvasLayer].
</description>
</method>
<method name="area_attach_object_instance_id">
@@ -31,47 +39,48 @@
<param index="0" name="area" type="RID" />
<param index="1" name="id" type="int" />
<description>
- Assigns the area to a descendant of [Object], so it can exist in the node tree.
+ Attaches the [code]ObjectID[/code] of an [Object] to the area. Use [method Object.get_instance_id] to get the [code]ObjectID[/code] of a [CollisionObject2D].
</description>
</method>
<method name="area_clear_shapes">
<return type="void" />
<param index="0" name="area" type="RID" />
<description>
- Removes all shapes from an area. It does not delete the shapes, so they can be reassigned later.
+ Removes all shapes from the area. This does not delete the shapes themselves, so they can continue to be used elsewhere or added back later.
</description>
</method>
<method name="area_create">
<return type="RID" />
<description>
- Creates an [Area2D]. After creating an [Area2D] with this method, assign it to a space using [method area_set_space] to use the created [Area2D] in the physics world.
+ Creates a 2D area object in the physics server, and returns the [RID] that identifies it. Use [method area_add_shape] to add shapes to it, use [method area_set_transform] to set its transform, and use [method area_set_space] to add the area to a space.
</description>
</method>
<method name="area_get_canvas_instance_id" qualifiers="const">
<return type="int" />
<param index="0" name="area" type="RID" />
<description>
+ Returns the [code]ObjectID[/code] of the canvas attached to the area. Use [method @GlobalScope.instance_from_id] to retrieve a [CanvasLayer] from a nonzero [code]ObjectID[/code].
</description>
</method>
<method name="area_get_collision_layer" qualifiers="const">
<return type="int" />
<param index="0" name="area" type="RID" />
<description>
- Returns the physics layer or layers an area belongs to.
+ Returns the physics layer or layers the area belongs to, as a bitmask.
</description>
</method>
<method name="area_get_collision_mask" qualifiers="const">
<return type="int" />
<param index="0" name="area" type="RID" />
<description>
- Returns the physics layer or layers an area can contact with.
+ Returns the physics layer or layers the area can contact with, as a bitmask.
</description>
</method>
<method name="area_get_object_instance_id" qualifiers="const">
<return type="int" />
<param index="0" name="area" type="RID" />
<description>
- Gets the instance ID of the object the area is assigned to.
+ Returns the [code]ObjectID[/code] attached to the area. Use [method @GlobalScope.instance_from_id] to retrieve an [Object] from a nonzero [code]ObjectID[/code].
</description>
</method>
<method name="area_get_param" qualifiers="const">
@@ -79,7 +88,7 @@
<param index="0" name="area" type="RID" />
<param index="1" name="param" type="int" enum="PhysicsServer2D.AreaParameter" />
<description>
- Returns an area parameter value. See [enum AreaParameter] for a list of available parameters.
+ Returns the value of the given area parameter. See [enum AreaParameter] for the list of available parameters.
</description>
</method>
<method name="area_get_shape" qualifiers="const">
@@ -87,14 +96,14 @@
<param index="0" name="area" type="RID" />
<param index="1" name="shape_idx" type="int" />
<description>
- Returns the [RID] of the nth shape of an area.
+ Returns the [RID] of the shape with the given index in the area's array of shapes.
</description>
</method>
<method name="area_get_shape_count" qualifiers="const">
<return type="int" />
<param index="0" name="area" type="RID" />
<description>
- Returns the number of shapes assigned to an area.
+ Returns the number of shapes added to the area.
</description>
</method>
<method name="area_get_shape_transform" qualifiers="const">
@@ -102,21 +111,21 @@
<param index="0" name="area" type="RID" />
<param index="1" name="shape_idx" type="int" />
<description>
- Returns the transform matrix of a shape within an area.
+ Returns the local transform matrix of the shape with the given index in the area's array of shapes.
</description>
</method>
<method name="area_get_space" qualifiers="const">
<return type="RID" />
<param index="0" name="area" type="RID" />
<description>
- Returns the space assigned to the area.
+ Returns the [RID] of the space assigned to the area. Returns [code]RID()[/code] if no space is assigned.
</description>
</method>
<method name="area_get_transform" qualifiers="const">
<return type="Transform2D" />
<param index="0" name="area" type="RID" />
<description>
- Returns the transform matrix for an area.
+ Returns the transform matrix of the area.
</description>
</method>
<method name="area_remove_shape">
@@ -124,7 +133,7 @@
<param index="0" name="area" type="RID" />
<param index="1" name="shape_idx" type="int" />
<description>
- Removes a shape from an area. It does not delete the shape, so it can be reassigned later.
+ Removes the shape with the given index from the area's array of shapes. The shape itself is not deleted, so it can continue to be used elsewhere or added back later. As a result of this operation, the area's shapes which used to have indices higher than [param shape_idx] will have their index decreased by one.
</description>
</method>
<method name="area_set_area_monitor_callback">
@@ -132,6 +141,13 @@
<param index="0" name="area" type="RID" />
<param index="1" name="callback" type="Callable" />
<description>
+ Sets the area's area monitor callback. This callback will be called when any other (shape of an) area enters or exits (a shape of) the given area, and must take the following five parameters:
+ 1. an integer [code]status[/code]: either [constant AREA_BODY_ADDED] or [constant AREA_BODY_REMOVED] depending on whether the other area's shape entered or exited the area,
+ 2. an [RID] [code]area_rid[/code]: the [RID] of the other area that entered or exited the area,
+ 3. an integer [code]instance_id[/code]: the [code]ObjectID[/code] attached to the other area,
+ 4. an integer [code]area_shape_idx[/code]: the index of the shape of the other area that entered or exited the area,
+ 5. an integer [code]self_shape_idx[/code]: the index of the shape of the area where the other area entered or exited.
+ By counting (or keeping track of) the shapes that enter and exit, it can be determined if an area (with all its shapes) is entering for the first time or exiting for the last time.
</description>
</method>
<method name="area_set_collision_layer">
@@ -139,7 +155,7 @@
<param index="0" name="area" type="RID" />
<param index="1" name="layer" type="int" />
<description>
- Assigns the area to one or many physics layers.
+ Assigns the area to one or many physics layers, via a bitmask.
</description>
</method>
<method name="area_set_collision_mask">
@@ -147,7 +163,7 @@
<param index="0" name="area" type="RID" />
<param index="1" name="mask" type="int" />
<description>
- Sets which physics layers the area will monitor.
+ Sets which physics layers the area will monitor, via a bitmask.
</description>
</method>
<method name="area_set_monitor_callback">
@@ -155,12 +171,13 @@
<param index="0" name="area" type="RID" />
<param index="1" name="callback" type="Callable" />
<description>
- Sets the function to call when any body/area enters or exits the area. This callback will be called for any object interacting with the area, and takes five parameters:
- 1: [constant AREA_BODY_ADDED] or [constant AREA_BODY_REMOVED], depending on whether the object entered or exited the area.
- 2: [RID] of the object that entered/exited the area.
- 3: Instance ID of the object that entered/exited the area.
- 4: The shape index of the object that entered/exited the area.
- 5: The shape index of the area where the object entered/exited.
+ Sets the area's body monitor callback. This callback will be called when any other (shape of a) body enters or exits (a shape of) the given area, and must take the following five parameters:
+ 1. an integer [code]status[/code]: either [constant AREA_BODY_ADDED] or [constant AREA_BODY_REMOVED] depending on whether the other body shape entered or exited the area,
+ 2. an [RID] [code]body_rid[/code]: the [RID] of the body that entered or exited the area,
+ 3. an integer [code]instance_id[/code]: the [code]ObjectID[/code] attached to the body,
+ 4. an integer [code]body_shape_idx[/code]: the index of the shape of the body that entered or exited the area,
+ 5. an integer [code]self_shape_idx[/code]: the index of the shape of the area where the body entered or exited.
+ By counting (or keeping track of) the shapes that enter and exit, it can be determined if a body (with all its shapes) is entering for the first time or exiting for the last time.
</description>
</method>
<method name="area_set_monitorable">
@@ -168,6 +185,7 @@
<param index="0" name="area" type="RID" />
<param index="1" name="monitorable" type="bool" />
<description>
+ Sets whether the area is monitorable or not. If [param monitorable] is [code]true[/code], the area monitoring callback of other areas will be called when this area enters or exits them.
</description>
</method>
<method name="area_set_param">
@@ -176,7 +194,7 @@
<param index="1" name="param" type="int" enum="PhysicsServer2D.AreaParameter" />
<param index="2" name="value" type="Variant" />
<description>
- Sets the value for an area parameter. See [enum AreaParameter] for a list of available parameters.
+ Sets the value of the given area parameter. See [enum AreaParameter] for the list of available parameters.
</description>
</method>
<method name="area_set_shape">
@@ -185,7 +203,7 @@
<param index="1" name="shape_idx" type="int" />
<param index="2" name="shape" type="RID" />
<description>
- Substitutes a given area shape by another. The old shape is selected by its index, the new one by its [RID].
+ Replaces the area's shape at the given index by another shape, while not affecting the [code]transform[/code] and [code]disabled[/code] properties at the same index.
</description>
</method>
<method name="area_set_shape_disabled">
@@ -194,7 +212,7 @@
<param index="1" name="shape_idx" type="int" />
<param index="2" name="disabled" type="bool" />
<description>
- Disables a given shape in an area.
+ Sets the disabled property of the area's shape with the given index. If [param disabled] is [code]true[/code], then the shape will not detect any other shapes entering or exiting it.
</description>
</method>
<method name="area_set_shape_transform">
@@ -203,7 +221,7 @@
<param index="1" name="shape_idx" type="int" />
<param index="2" name="transform" type="Transform2D" />
<description>
- Sets the transform matrix for an area shape.
+ Sets the local transform matrix of the area's shape with the given index.
</description>
</method>
<method name="area_set_space">
@@ -211,7 +229,8 @@
<param index="0" name="area" type="RID" />
<param index="1" name="space" type="RID" />
<description>
- Assigns a space to the area.
+ Adds the area to the given space, after removing the area from the previously assigned space (if any).
+ [b]Note:[/b] To remove an area from a space without immediately adding it back elsewhere, use [code]PhysicsServer2D.area_set_space(area, RID())[/code].
</description>
</method>
<method name="area_set_transform">
@@ -219,7 +238,7 @@
<param index="0" name="area" type="RID" />
<param index="1" name="transform" type="Transform2D" />
<description>
- Sets the transform matrix for an area.
+ Sets the transform matrix of the area.
</description>
</method>
<method name="body_add_collision_exception">
@@ -227,7 +246,7 @@
<param index="0" name="body" type="RID" />
<param index="1" name="excepted_body" type="RID" />
<description>
- Adds a body to the list of bodies exempt from collisions.
+ Adds [param excepted_body] to the body's list of collision exceptions, so that collisions with it are ignored.
</description>
</method>
<method name="body_add_constant_central_force">
@@ -235,7 +254,7 @@
<param index="0" name="body" type="RID" />
<param index="1" name="force" type="Vector2" />
<description>
- Adds a constant directional force without affecting rotation that keeps being applied over time until cleared with [code]body_set_constant_force(body, Vector2(0, 0))[/code].
+ Adds a constant directional force to the body. The force does not affect rotation. The force remains applied over time until cleared with [code]PhysicsServer2D.body_set_constant_force(body, Vector2(0, 0))[/code].
This is equivalent to using [method body_add_constant_force] at the body's center of mass.
</description>
</method>
@@ -245,7 +264,7 @@
<param index="1" name="force" type="Vector2" />
<param index="2" name="position" type="Vector2" default="Vector2(0, 0)" />
<description>
- Adds a constant positioned force to the body that keeps being applied over time until cleared with [code]body_set_constant_force(body, Vector2(0, 0))[/code].
+ Adds a constant positioned force to the body. The force can affect rotation if [param position] is different from the body's center of mass. The force remains applied over time until cleared with [code]PhysicsServer2D.body_set_constant_force(body, Vector2(0, 0))[/code].
[param position] is the offset from the body origin in global coordinates.
</description>
</method>
@@ -254,7 +273,7 @@
<param index="0" name="body" type="RID" />
<param index="1" name="torque" type="float" />
<description>
- Adds a constant rotational force without affecting position that keeps being applied over time until cleared with [code]body_set_constant_torque(body, 0)[/code].
+ Adds a constant rotational force to the body. The force does not affect position. The force remains applied over time until cleared with [code]PhysicsServer2D.body_set_constant_torque(body, 0)[/code].
</description>
</method>
<method name="body_add_shape">
@@ -264,7 +283,7 @@
<param index="2" name="transform" type="Transform2D" default="Transform2D(1, 0, 0, 1, 0, 0)" />
<param index="3" name="disabled" type="bool" default="false" />
<description>
- Adds a shape to the body, along with a transform matrix. Shapes are usually referenced by their index, so you should track which shape has a given index.
+ Adds a shape to the area, with the given local transform. The shape (together with its [param transform] and [param disabled] properties) is added to an array of shapes, and the shapes of a body are usually referenced by their index in this array.
</description>
</method>
<method name="body_apply_central_force">
@@ -272,7 +291,7 @@
<param index="0" name="body" type="RID" />
<param index="1" name="force" type="Vector2" />
<description>
- Applies a directional force without affecting rotation. A force is time dependent and meant to be applied every physics update.
+ Applies a directional force to the body, at the body's center of mass. The force does not affect rotation. A force is time dependent and meant to be applied every physics update.
This is equivalent to using [method body_apply_force] at the body's center of mass.
</description>
</method>
@@ -281,7 +300,7 @@
<param index="0" name="body" type="RID" />
<param index="1" name="impulse" type="Vector2" />
<description>
- Applies a directional impulse without affecting rotation.
+ Applies a directional impulse to the body, at the body's center of mass. The impulse does not affect rotation.
An impulse is time-independent! Applying an impulse every frame would result in a framerate-dependent force. For this reason, it should only be used when simulating one-time impacts (use the "_force" functions otherwise).
This is equivalent to using [method body_apply_impulse] at the body's center of mass.
</description>
@@ -292,7 +311,7 @@
<param index="1" name="force" type="Vector2" />
<param index="2" name="position" type="Vector2" default="Vector2(0, 0)" />
<description>
- Applies a positioned force to the body. A force is time dependent and meant to be applied every physics update.
+ Applies a positioned force to the body. The force can affect rotation if [param position] is different from the body's center of mass. A force is time dependent and meant to be applied every physics update.
[param position] is the offset from the body origin in global coordinates.
</description>
</method>
@@ -302,7 +321,7 @@
<param index="1" name="impulse" type="Vector2" />
<param index="2" name="position" type="Vector2" default="Vector2(0, 0)" />
<description>
- Applies a positioned impulse to the body.
+ Applies a positioned impulse to the body. The impulse can affect rotation if [param position] is different from the body's center of mass.
An impulse is time-independent! Applying an impulse every frame would result in a framerate-dependent force. For this reason, it should only be used when simulating one-time impacts (use the "_force" functions otherwise).
[param position] is the offset from the body origin in global coordinates.
</description>
@@ -312,7 +331,7 @@
<param index="0" name="body" type="RID" />
<param index="1" name="torque" type="float" />
<description>
- Applies a rotational force without affecting position. A force is time dependent and meant to be applied every physics update.
+ Applies a rotational force to the body. The force does not affect position. A force is time dependent and meant to be applied every physics update.
</description>
</method>
<method name="body_apply_torque_impulse">
@@ -320,7 +339,7 @@
<param index="0" name="body" type="RID" />
<param index="1" name="impulse" type="float" />
<description>
- Applies a rotational impulse to the body without affecting the position.
+ Applies a rotational impulse to the body. The impulse does not affect position.
An impulse is time-independent! Applying an impulse every frame would result in a framerate-dependent force. For this reason, it should only be used when simulating one-time impacts (use the "_force" functions otherwise).
</description>
</method>
@@ -329,6 +348,7 @@
<param index="0" name="body" type="RID" />
<param index="1" name="id" type="int" />
<description>
+ Attaches the [code]ObjectID[/code] of a canvas to the body. Use [method Object.get_instance_id] to get the [code]ObjectID[/code] of a [CanvasLayer].
</description>
</method>
<method name="body_attach_object_instance_id">
@@ -336,54 +356,55 @@
<param index="0" name="body" type="RID" />
<param index="1" name="id" type="int" />
<description>
- Assigns the area to a descendant of [Object], so it can exist in the node tree.
+ Attaches the [code]ObjectID[/code] of an [Object] to the body. Use [method Object.get_instance_id] to get the [code]ObjectID[/code] of a [CollisionObject2D].
</description>
</method>
<method name="body_clear_shapes">
<return type="void" />
<param index="0" name="body" type="RID" />
<description>
- Removes all shapes from a body.
+ Removes all shapes from the body. This does not delete the shapes themselves, so they can continue to be used elsewhere or added back later.
</description>
</method>
<method name="body_create">
<return type="RID" />
<description>
- Creates a physics body.
+ Creates a 2D body object in the physics server, and returns the [RID] that identifies it. Use [method body_add_shape] to add shapes to it, use [method body_set_state] to set its transform, and use [method body_set_space] to add the body to a space.
</description>
</method>
<method name="body_get_canvas_instance_id" qualifiers="const">
<return type="int" />
<param index="0" name="body" type="RID" />
<description>
+ Returns the [code]ObjectID[/code] of the canvas attached to the body. Use [method @GlobalScope.instance_from_id] to retrieve a [CanvasLayer] from a nonzero [code]ObjectID[/code].
</description>
</method>
<method name="body_get_collision_layer" qualifiers="const">
<return type="int" />
<param index="0" name="body" type="RID" />
<description>
- Returns the physics layer or layers a body belongs to.
+ Returns the physics layer or layers the body belongs to, as a bitmask.
</description>
</method>
<method name="body_get_collision_mask" qualifiers="const">
<return type="int" />
<param index="0" name="body" type="RID" />
<description>
- Returns the physics layer or layers a body can collide with.
+ Returns the physics layer or layers the body can collide with, as a bitmask.
</description>
</method>
<method name="body_get_collision_priority" qualifiers="const">
<return type="float" />
<param index="0" name="body" type="RID" />
<description>
- Returns the body's collision priority.
+ Returns the body's collision priority. This is used in the depenetration phase of [method body_test_motion]. The higher the priority is, the lower the penetration into the body will be.
</description>
</method>
<method name="body_get_constant_force" qualifiers="const">
<return type="Vector2" />
<param index="0" name="body" type="RID" />
<description>
- Returns the body's total constant positional forces applied during each physics update.
+ Returns the body's total constant positional force applied during each physics update.
See [method body_add_constant_force] and [method body_add_constant_central_force].
</description>
</method>
@@ -391,7 +412,7 @@
<return type="float" />
<param index="0" name="body" type="RID" />
<description>
- Returns the body's total constant rotational forces applied during each physics update.
+ Returns the body's total constant rotational force applied during each physics update.
See [method body_add_constant_torque].
</description>
</method>
@@ -399,35 +420,35 @@
<return type="int" enum="PhysicsServer2D.CCDMode" />
<param index="0" name="body" type="RID" />
<description>
- Returns the continuous collision detection mode.
+ Returns the body's continuous collision detection mode (see [enum CCDMode]).
</description>
</method>
<method name="body_get_direct_state">
<return type="PhysicsDirectBodyState2D" />
<param index="0" name="body" type="RID" />
<description>
- Returns the [PhysicsDirectBodyState2D] of the body. Returns [code]null[/code] if the body is destroyed or removed from the physics space.
+ Returns the [PhysicsDirectBodyState2D] of the body. Returns [code]null[/code] if the body is destroyed or not assigned to a space.
</description>
</method>
<method name="body_get_max_contacts_reported" qualifiers="const">
<return type="int" />
<param index="0" name="body" type="RID" />
<description>
- Returns the maximum contacts that can be reported. See [method body_set_max_contacts_reported].
+ Returns the maximum number of contacts that the body can report. See [method body_set_max_contacts_reported].
</description>
</method>
<method name="body_get_mode" qualifiers="const">
<return type="int" enum="PhysicsServer2D.BodyMode" />
<param index="0" name="body" type="RID" />
<description>
- Returns the body mode.
+ Returns the body's mode (see [enum BodyMode]).
</description>
</method>
<method name="body_get_object_instance_id" qualifiers="const">
<return type="int" />
<param index="0" name="body" type="RID" />
<description>
- Gets the instance ID of the object the area is assigned to.
+ Returns the [code]ObjectID[/code] attached to the body. Use [method @GlobalScope.instance_from_id] to retrieve an [Object] from a nonzero [code]ObjectID[/code].
</description>
</method>
<method name="body_get_param" qualifiers="const">
@@ -435,7 +456,7 @@
<param index="0" name="body" type="RID" />
<param index="1" name="param" type="int" enum="PhysicsServer2D.BodyParameter" />
<description>
- Returns the value of a body parameter. See [enum BodyParameter] for a list of available parameters.
+ Returns the value of the given body parameter. See [enum BodyParameter] for the list of available parameters.
</description>
</method>
<method name="body_get_shape" qualifiers="const">
@@ -443,14 +464,14 @@
<param index="0" name="body" type="RID" />
<param index="1" name="shape_idx" type="int" />
<description>
- Returns the [RID] of the nth shape of a body.
+ Returns the [RID] of the shape with the given index in the body's array of shapes.
</description>
</method>
<method name="body_get_shape_count" qualifiers="const">
<return type="int" />
<param index="0" name="body" type="RID" />
<description>
- Returns the number of shapes assigned to a body.
+ Returns the number of shapes added to the body.
</description>
</method>
<method name="body_get_shape_transform" qualifiers="const">
@@ -458,14 +479,14 @@
<param index="0" name="body" type="RID" />
<param index="1" name="shape_idx" type="int" />
<description>
- Returns the transform matrix of a body shape.
+ Returns the local transform matrix of the shape with the given index in the area's array of shapes.
</description>
</method>
<method name="body_get_space" qualifiers="const">
<return type="RID" />
<param index="0" name="body" type="RID" />
<description>
- Returns the [RID] of the space assigned to a body.
+ Returns the [RID] of the space assigned to the body. Returns [code]RID()[/code] if no space is assigned.
</description>
</method>
<method name="body_get_state" qualifiers="const">
@@ -473,14 +494,14 @@
<param index="0" name="body" type="RID" />
<param index="1" name="state" type="int" enum="PhysicsServer2D.BodyState" />
<description>
- Returns a body state.
+ Returns the value of the given state of the body. See [enum BodyState] for the list of available states.
</description>
</method>
<method name="body_is_omitting_force_integration" qualifiers="const">
<return type="bool" />
<param index="0" name="body" type="RID" />
<description>
- Returns whether a body uses a callback function to calculate its own physics (see [method body_set_force_integration_callback]).
+ Returns [code]true[/code] if the body uses a callback function to calculate its own physics (see [method body_set_force_integration_callback]).
</description>
</method>
<method name="body_remove_collision_exception">
@@ -488,7 +509,7 @@
<param index="0" name="body" type="RID" />
<param index="1" name="excepted_body" type="RID" />
<description>
- Removes a body from the list of bodies exempt from collisions.
+ Removes [param excepted_body] from the body's list of collision exceptions, so that collisions with it are no longer ignored.
</description>
</method>
<method name="body_remove_shape">
@@ -496,14 +517,14 @@
<param index="0" name="body" type="RID" />
<param index="1" name="shape_idx" type="int" />
<description>
- Removes a shape from a body. The shape is not deleted, so it can be reused afterwards.
+ Removes the shape with the given index from the body's array of shapes. The shape itself is not deleted, so it can continue to be used elsewhere or added back later. As a result of this operation, the body's shapes which used to have indices higher than [param shape_idx] will have their index decreased by one.
</description>
</method>
<method name="body_reset_mass_properties">
<return type="void" />
<param index="0" name="body" type="RID" />
<description>
- Restores the default inertia and center of mass based on shapes to cancel any custom values previously set using [method body_set_param].
+ Restores the default inertia and center of mass of the body based on its shapes. This undoes any custom values previously set using [method body_set_param].
</description>
</method>
<method name="body_set_axis_velocity">
@@ -511,7 +532,7 @@
<param index="0" name="body" type="RID" />
<param index="1" name="axis_velocity" type="Vector2" />
<description>
- Sets an axis velocity. The velocity in the given vector axis will be set as the given vector length. This is useful for jumping behavior.
+ Modifies the body's linear velocity so that its projection to the axis [code]axis_velocity.normalized()[/code] is exactly [code]axis_velocity.length()[/code]. This is useful for jumping behavior.
</description>
</method>
<method name="body_set_collision_layer">
@@ -519,7 +540,7 @@
<param index="0" name="body" type="RID" />
<param index="1" name="layer" type="int" />
<description>
- Sets the physics layer or layers a body belongs to.
+ Sets the physics layer or layers the body belongs to, via a bitmask.
</description>
</method>
<method name="body_set_collision_mask">
@@ -527,7 +548,7 @@
<param index="0" name="body" type="RID" />
<param index="1" name="mask" type="int" />
<description>
- Sets the physics layer or layers a body can collide with.
+ Sets the physics layer or layers the body can collide with, via a bitmask.
</description>
</method>
<method name="body_set_collision_priority">
@@ -535,7 +556,7 @@
<param index="0" name="body" type="RID" />
<param index="1" name="priority" type="float" />
<description>
- Sets the body's collision priority.
+ Sets the body's collision priority. This is used in the depenetration phase of [method body_test_motion]. The higher the priority is, the lower the penetration into the body will be.
</description>
</method>
<method name="body_set_constant_force">
@@ -543,7 +564,7 @@
<param index="0" name="body" type="RID" />
<param index="1" name="force" type="Vector2" />
<description>
- Sets the body's total constant positional forces applied during each physics update.
+ Sets the body's total constant positional force applied during each physics update.
See [method body_add_constant_force] and [method body_add_constant_central_force].
</description>
</method>
@@ -552,7 +573,7 @@
<param index="0" name="body" type="RID" />
<param index="1" name="torque" type="float" />
<description>
- Sets the body's total constant rotational forces applied during each physics update.
+ Sets the body's total constant rotational force applied during each physics update.
See [method body_add_constant_torque].
</description>
</method>
@@ -562,7 +583,7 @@
<param index="1" name="mode" type="int" enum="PhysicsServer2D.CCDMode" />
<description>
Sets the continuous collision detection mode using one of the [enum CCDMode] constants.
- Continuous collision detection tries to predict where a moving body will collide, instead of moving it and correcting its movement if it collided.
+ Continuous collision detection tries to predict where a moving body would collide in between physics updates, instead of moving it and correcting its movement if it collided.
</description>
</method>
<method name="body_set_force_integration_callback">
@@ -571,10 +592,11 @@
<param index="1" name="callable" type="Callable" />
<param index="2" name="userdata" type="Variant" default="null" />
<description>
- Sets the function used to calculate physics for an object, if that object allows it (see [method body_set_omit_force_integration]).
- The force integration function takes 2 arguments:
- [code]state:[/code] [PhysicsDirectBodyState2D] used to retrieve and modify the body's state.
- [code]userdata:[/code] Optional user data, if it was passed when calling [code]body_set_force_integration_callback[/code].
+ Sets the function used to calculate physics for the body, if that body allows it (see [method body_set_omit_force_integration]).
+ The force integration function takes the following two parameters:
+ 1. a [PhysicsDirectBodyState2D] [code]state[/code]: used to retrieve and modify the body's state,
+ 2. a [Variant] [code]userdata[/code]: optional user data.
+ [b]Note:[/b] This callback is currently not called in Godot Physics.
</description>
</method>
<method name="body_set_max_contacts_reported">
@@ -582,7 +604,7 @@
<param index="0" name="body" type="RID" />
<param index="1" name="amount" type="int" />
<description>
- Sets the maximum contacts to report. Bodies can keep a log of the contacts with other bodies. This is enabled by setting the maximum number of contacts reported to a number greater than 0.
+ Sets the maximum number of contacts that the body can report. If [param amount] is greater than zero, then the body will keep track of at most this many contacts with other bodies.
</description>
</method>
<method name="body_set_mode">
@@ -590,7 +612,7 @@
<param index="0" name="body" type="RID" />
<param index="1" name="mode" type="int" enum="PhysicsServer2D.BodyMode" />
<description>
- Sets the body mode using one of the [enum BodyMode] constants.
+ Sets the body's mode. See [enum BodyMode] for the list of available modes.
</description>
</method>
<method name="body_set_omit_force_integration">
@@ -598,7 +620,7 @@
<param index="0" name="body" type="RID" />
<param index="1" name="enable" type="bool" />
<description>
- Sets whether a body uses a callback function to calculate its own physics (see [method body_set_force_integration_callback]).
+ Sets whether the body uses a callback function to calculate its own physics (see [method body_set_force_integration_callback]).
</description>
</method>
<method name="body_set_param">
@@ -607,7 +629,7 @@
<param index="1" name="param" type="int" enum="PhysicsServer2D.BodyParameter" />
<param index="2" name="value" type="Variant" />
<description>
- Sets a body parameter. See [enum BodyParameter] for a list of available parameters.
+ Sets the value of the given body parameter. See [enum BodyParameter] for the list of available parameters.
</description>
</method>
<method name="body_set_shape">
@@ -616,7 +638,7 @@
<param index="1" name="shape_idx" type="int" />
<param index="2" name="shape" type="RID" />
<description>
- Substitutes a given body shape by another. The old shape is selected by its index, the new one by its [RID].
+ Replaces the body's shape at the given index by another shape, while not affecting the [code]transform[/code], [code]disabled[/code], and one-way collision properties at the same index.
</description>
</method>
<method name="body_set_shape_as_one_way_collision">
@@ -626,7 +648,7 @@
<param index="2" name="enable" type="bool" />
<param index="3" name="margin" type="float" />
<description>
- Enables one way collision on body if [param enable] is [code]true[/code].
+ Sets the one-way collision properties of the body's shape with the given index. If [param enable] is [code]true[/code], the one-way collision direction given by the shape's local upward axis [code]body_get_shape_transform(body, shape_idx).y[/code] will be used to ignore collisions with the shape in the opposite direction, and to ensure depenetration of kinematic bodies happens in this direction.
</description>
</method>
<method name="body_set_shape_disabled">
@@ -635,7 +657,7 @@
<param index="1" name="shape_idx" type="int" />
<param index="2" name="disabled" type="bool" />
<description>
- Disables shape in body if [param disabled] is [code]true[/code].
+ Sets the disabled property of the body's shape with the given index. If [param disabled] is [code]true[/code], then the shape will be ignored in all collision detection.
</description>
</method>
<method name="body_set_shape_transform">
@@ -644,7 +666,7 @@
<param index="1" name="shape_idx" type="int" />
<param index="2" name="transform" type="Transform2D" />
<description>
- Sets the transform matrix for a body shape.
+ Sets the local transform matrix of the body's shape with the given index.
</description>
</method>
<method name="body_set_space">
@@ -652,7 +674,10 @@
<param index="0" name="body" type="RID" />
<param index="1" name="space" type="RID" />
<description>
- Assigns a space to the body (see [method space_create]).
+ Adds the body to the given space, after removing the body from the previously assigned space (if any). If the body's mode is set to [constant BODY_MODE_RIGID], then adding the body to a space will have the following additional effects:
+ - If the parameter [constant BODY_PARAM_CENTER_OF_MASS] has never been set explicitly, then the value of that parameter will be recalculated based on the body's shapes.
+ - If the parameter [constant BODY_PARAM_INERTIA] is set to a value [code]&lt;= 0.0[/code], then the value of that parameter will be recalculated based on the body's shapes, mass, and center of mass.
+ [b]Note:[/b] To remove a body from a space without immediately adding it back elsewhere, use [code]PhysicsServer2D.body_set_space(body, RID())[/code].
</description>
</method>
<method name="body_set_state">
@@ -661,8 +686,8 @@
<param index="1" name="state" type="int" enum="PhysicsServer2D.BodyState" />
<param index="2" name="value" type="Variant" />
<description>
- Sets a body state using one of the [enum BodyState] constants.
- Note that the method doesn't take effect immediately. The state will change on the next physics frame.
+ Sets the value of a body's state. See [enum BodyState] for the list of available states.
+ [b]Note:[/b] The state change doesn't take effect immediately. The state will change on the next physics frame.
</description>
</method>
<method name="body_test_motion">
@@ -671,27 +696,31 @@
<param index="1" name="parameters" type="PhysicsTestMotionParameters2D" />
<param index="2" name="result" type="PhysicsTestMotionResult2D" default="null" />
<description>
- Returns [code]true[/code] if a collision would result from moving along a motion vector from a given point in space. [PhysicsTestMotionParameters2D] is passed to set motion parameters. [PhysicsTestMotionResult2D] can be passed to return additional information.
+ Returns [code]true[/code] if a collision would result from moving the body along a motion vector from a given point in space. See [PhysicsTestMotionParameters2D] for the available motion parameters. Optionally a [PhysicsTestMotionResult2D] object can be passed, which will be used to store the information about the resulting collision.
</description>
</method>
<method name="capsule_shape_create">
<return type="RID" />
<description>
+ Creates a 2D capsule shape in the physics server, and returns the [RID] that identifies it. Use [method shape_set_data] to set the capsule's height and radius.
</description>
</method>
<method name="circle_shape_create">
<return type="RID" />
<description>
+ Creates a 2D circle shape in the physics server, and returns the [RID] that identifies it. Use [method shape_set_data] to set the circle's radius.
</description>
</method>
<method name="concave_polygon_shape_create">
<return type="RID" />
<description>
+ Creates a 2D concave polygon shape in the physics server, and returns the [RID] that identifies it. Use [method shape_set_data] to set the concave polygon's segments.
</description>
</method>
<method name="convex_polygon_shape_create">
<return type="RID" />
<description>
+ Creates a 2D convex polygon shape in the physics server, and returns the [RID] that identifies it. Use [method shape_set_data] to set the convex polygon's points.
</description>
</method>
<method name="damped_spring_joint_get_param" qualifiers="const">
@@ -699,7 +728,7 @@
<param index="0" name="joint" type="RID" />
<param index="1" name="param" type="int" enum="PhysicsServer2D.DampedSpringParam" />
<description>
- Returns the value of a damped spring joint parameter. See [enum DampedSpringParam] for a list of available parameters.
+ Returns the value of the given damped spring joint parameter. See [enum DampedSpringParam] for the list of available parameters.
</description>
</method>
<method name="damped_spring_joint_set_param">
@@ -708,32 +737,34 @@
<param index="1" name="param" type="int" enum="PhysicsServer2D.DampedSpringParam" />
<param index="2" name="value" type="float" />
<description>
- Sets a damped spring joint parameter. See [enum DampedSpringParam] for a list of available parameters.
+ Sets the value of the given damped spring joint parameter. See [enum DampedSpringParam] for the list of available parameters.
</description>
</method>
<method name="free_rid">
<return type="void" />
<param index="0" name="rid" type="RID" />
<description>
- Destroys any of the objects created by PhysicsServer2D. If the [RID] passed is not one of the objects that can be created by PhysicsServer2D, an error will be sent to the console.
+ Destroys any of the objects created by PhysicsServer2D. If the [RID] passed is not one of the objects that can be created by PhysicsServer2D, an error will be printed to the console.
</description>
</method>
<method name="get_process_info">
<return type="int" />
<param index="0" name="process_info" type="int" enum="PhysicsServer2D.ProcessInfo" />
<description>
- Returns information about the current state of the 2D physics engine. See [enum ProcessInfo] for a list of available states.
+ Returns information about the current state of the 2D physics engine. See [enum ProcessInfo] for the list of available states.
</description>
</method>
<method name="joint_clear">
<return type="void" />
<param index="0" name="joint" type="RID" />
<description>
+ Destroys the joint with the given [RID], creates a new uninitialized joint, and makes the [RID] refer to this new joint.
</description>
</method>
<method name="joint_create">
<return type="RID" />
<description>
+ Creates a 2D joint in the physics server, and returns the [RID] that identifies it. To set the joint type, use [method joint_make_damped_spring], [method joint_make_groove] or [method joint_make_pin]. Use [method joint_set_param] to set generic joint parameters.
</description>
</method>
<method name="joint_disable_collisions_between_bodies">
@@ -749,14 +780,14 @@
<param index="0" name="joint" type="RID" />
<param index="1" name="param" type="int" enum="PhysicsServer2D.JointParam" />
<description>
- Returns the value of a joint parameter.
+ Returns the value of the given joint parameter. See [enum JointParam] for the list of available parameters.
</description>
</method>
<method name="joint_get_type" qualifiers="const">
<return type="int" enum="PhysicsServer2D.JointType" />
<param index="0" name="joint" type="RID" />
<description>
- Returns a joint's type (see [enum JointType]).
+ Returns the joint's type (see [enum JointType]).
</description>
</method>
<method name="joint_is_disabled_collisions_between_bodies" qualifiers="const">
@@ -774,6 +805,7 @@
<param index="3" name="body_a" type="RID" />
<param index="4" name="body_b" type="RID" />
<description>
+ Makes the joint a damped spring joint, attached at the point [param anchor_a] (given in global coordinates) on the body [param body_a] and at the point [param anchor_b] (given in global coordinates) on the body [param body_b]. To set the parameters which are specific to the damped spring, see [method damped_spring_joint_set_param].
</description>
</method>
<method name="joint_make_groove">
@@ -785,6 +817,7 @@
<param index="4" name="body_a" type="RID" />
<param index="5" name="body_b" type="RID" />
<description>
+ Makes the joint a groove joint.
</description>
</method>
<method name="joint_make_pin">
@@ -794,6 +827,7 @@
<param index="2" name="body_a" type="RID" />
<param index="3" name="body_b" type="RID" />
<description>
+ Makes the joint a pin joint. If [param body_b] is [code]RID()[/code], then [param body_a] is pinned to the point [param anchor] (given in global coordinates); otherwise, [param body_a] is pinned to [param body_b] at the point [param anchor] (given in global coordinates). To set the parameters which are specific to the pin joint, see [method pin_joint_set_param].
</description>
</method>
<method name="joint_set_param">
@@ -802,7 +836,7 @@
<param index="1" name="param" type="int" enum="PhysicsServer2D.JointParam" />
<param index="2" name="value" type="float" />
<description>
- Sets a joint parameter. See [enum JointParam] for a list of available parameters.
+ Sets the value of the given joint parameter. See [enum JointParam] for the list of available parameters.
</description>
</method>
<method name="pin_joint_get_param" qualifiers="const">
@@ -825,37 +859,40 @@
<method name="rectangle_shape_create">
<return type="RID" />
<description>
+ Creates a 2D rectangle shape in the physics server, and returns the [RID] that identifies it. Use [method shape_set_data] to set the rectangle's half-extents.
</description>
</method>
<method name="segment_shape_create">
<return type="RID" />
<description>
+ Creates a 2D segment shape in the physics server, and returns the [RID] that identifies it. Use [method shape_set_data] to set the segment's start and end points.
</description>
</method>
<method name="separation_ray_shape_create">
<return type="RID" />
<description>
+ Creates a 2D separation ray shape in the physics server, and returns the [RID] that identifies it. Use [method shape_set_data] to set the shape's [code]length[/code] and [code]slide_on_slope[/code] properties.
</description>
</method>
<method name="set_active">
<return type="void" />
<param index="0" name="active" type="bool" />
<description>
- Activates or deactivates the 2D physics engine.
+ Activates or deactivates the 2D physics server. If [param active] is [code]false[/code], then the physics server will not do anything in its physics step.
</description>
</method>
<method name="shape_get_data" qualifiers="const">
<return type="Variant" />
<param index="0" name="shape" type="RID" />
<description>
- Returns the shape data.
+ Returns the shape data that defines the configuration of the shape, such as the half-extents of a rectangle or the segments of a concave shape. See [method shape_set_data] for the precise format of this data in each case.
</description>
</method>
<method name="shape_get_type" qualifiers="const">
<return type="int" enum="PhysicsServer2D.ShapeType" />
<param index="0" name="shape" type="RID" />
<description>
- Returns a shape's type (see [enum ShapeType]).
+ Returns the shape's type (see [enum ShapeType]).
</description>
</method>
<method name="shape_set_data">
@@ -863,20 +900,29 @@
<param index="0" name="shape" type="RID" />
<param index="1" name="data" type="Variant" />
<description>
- Sets the shape data that defines its shape and size. The data to be passed depends on the kind of shape created [method shape_get_type].
+ Sets the shape data that defines the configuration of the shape. The [param data] to be passed depends on the shape's type (see [method shape_get_type]):
+ - [constant SHAPE_WORLD_BOUNDARY]: an array of length two containing a [Vector2] [code]normal[/code] direction and a [code]float[/code] distance [code]d[/code],
+ - [constant SHAPE_SEPARATION_RAY]: a dictionary containing the key [code]length[/code] with a [code]float[/code] value and the key [code]slide_on_slope[/code] with a [code]bool[/code] value,
+ - [constant SHAPE_SEGMENT]: a [Rect2] [code]rect[/code] containing the first point of the segment in [code]rect.position[/code] and the second point of the segment in [code]rect.size[/code],
+ - [constant SHAPE_CIRCLE]: a [code]float[/code] [code]radius[/code],
+ - [constant SHAPE_RECTANGLE]: a [Vector2] [code]half_extents[/code],
+ - [constant SHAPE_CAPSULE]: an array of length two (or a [Vector2]) containing a [code]float[/code] [code]height[/code] and a [code]float[/code] [code]radius[/code],
+ - [constant SHAPE_CONVEX_POLYGON]: either a [PackedVector2Array] of points defining a convex polygon in counterclockwise order (the clockwise outward normal of each segment formed by consecutive points is calculated internally), or a [PackedFloat32Array] of length divisible by four so that every 4-tuple of [code]float[/code]s contains the coordinates of a point followed by the coordinates of the clockwise outward normal vector to the segment between the current point and the next point,
+ - [constant SHAPE_CONCAVE_POLYGON]: a [PackedVector2Array] of length divisible by two (each pair of points forms one segment).
+ [b]Warning[/b]: In the case of [constant SHAPE_CONVEX_POLYGON], this method does not check if the points supplied actually form a convex polygon (unlike the [member CollisionPolygon2D.polygon] property).
</description>
</method>
<method name="space_create">
<return type="RID" />
<description>
- Creates a space. A space is a collection of parameters for the physics engine that can be assigned to an area or a body. It can be assigned to an area with [method area_set_space], or to a body with [method body_set_space].
+ Creates a 2D space in the physics server, and returns the [RID] that identifies it. A space contains bodies and areas, and controls the stepping of the physics simulation of the objects in it.
</description>
</method>
<method name="space_get_direct_state">
<return type="PhysicsDirectSpaceState2D" />
<param index="0" name="space" type="RID" />
<description>
- Returns the state of a space, a [PhysicsDirectSpaceState2D]. This object can be used to make collision/intersection queries.
+ Returns the state of a space, a [PhysicsDirectSpaceState2D]. This object can be used for collision/intersection queries.
</description>
</method>
<method name="space_get_param" qualifiers="const">
@@ -884,14 +930,14 @@
<param index="0" name="space" type="RID" />
<param index="1" name="param" type="int" enum="PhysicsServer2D.SpaceParameter" />
<description>
- Returns the value of a space parameter.
+ Returns the value of the given space parameter. See [enum SpaceParameter] for the list of available parameters.
</description>
</method>
<method name="space_is_active" qualifiers="const">
<return type="bool" />
<param index="0" name="space" type="RID" />
<description>
- Returns whether the space is active.
+ Returns [code]true[/code] if the space is active.
</description>
</method>
<method name="space_set_active">
@@ -899,7 +945,7 @@
<param index="0" name="space" type="RID" />
<param index="1" name="active" type="bool" />
<description>
- Marks a space as active. It will not have an effect, unless it is assigned to an area or body.
+ Activates or deactivates the space. If [param active] is [code]false[/code], then the physics server will not do anything with this space in its physics step.
</description>
</method>
<method name="space_set_param">
@@ -908,42 +954,43 @@
<param index="1" name="param" type="int" enum="PhysicsServer2D.SpaceParameter" />
<param index="2" name="value" type="float" />
<description>
- Sets the value for a space parameter. See [enum SpaceParameter] for a list of available parameters.
+ Sets the value of the given space parameter. See [enum SpaceParameter] for the list of available parameters.
</description>
</method>
<method name="world_boundary_shape_create">
<return type="RID" />
<description>
+ Creates a 2D world boundary shape in the physics server, and returns the [RID] that identifies it. Use [method shape_set_data] to set the shape's normal direction and distance properties.
</description>
</method>
</methods>
<constants>
<constant name="SPACE_PARAM_CONTACT_RECYCLE_RADIUS" value="0" enum="SpaceParameter">
- Constant to set/get the maximum distance a pair of bodies has to move before their collision status has to be recalculated.
+ Constant to set/get the maximum distance a pair of bodies has to move before their collision status has to be recalculated. The default value of this parameter is [member ProjectSettings.physics/2d/solver/contact_recycle_radius].
</constant>
<constant name="SPACE_PARAM_CONTACT_MAX_SEPARATION" value="1" enum="SpaceParameter">
- Constant to set/get the maximum distance a shape can be from another before they are considered separated and the contact is discarded.
+ Constant to set/get the maximum distance a shape can be from another before they are considered separated and the contact is discarded. The default value of this parameter is [member ProjectSettings.physics/2d/solver/contact_max_separation].
</constant>
<constant name="SPACE_PARAM_CONTACT_MAX_ALLOWED_PENETRATION" value="2" enum="SpaceParameter">
- Constant to set/get the maximum distance a shape can penetrate another shape before it is considered a collision.
+ Constant to set/get the maximum distance a shape can penetrate another shape before it is considered a collision. The default value of this parameter is [member ProjectSettings.physics/2d/solver/contact_max_allowed_penetration].
</constant>
<constant name="SPACE_PARAM_CONTACT_DEFAULT_BIAS" value="3" enum="SpaceParameter">
- Constant to set/get the default solver bias for all physics contacts. A solver bias is a factor controlling how much two objects "rebound", after overlapping, to avoid leaving them in that state because of numerical imprecision.
+ Constant to set/get the default solver bias for all physics contacts. A solver bias is a factor controlling how much two objects "rebound", after overlapping, to avoid leaving them in that state because of numerical imprecision. The default value of this parameter is [member ProjectSettings.physics/2d/solver/default_contact_bias].
</constant>
<constant name="SPACE_PARAM_BODY_LINEAR_VELOCITY_SLEEP_THRESHOLD" value="4" enum="SpaceParameter">
- Constant to set/get the threshold linear velocity of activity. A body marked as potentially inactive for both linear and angular velocity will be put to sleep after the time given.
+ Constant to set/get the threshold linear velocity of activity. A body marked as potentially inactive for both linear and angular velocity will be put to sleep after the time given. The default value of this parameter is [member ProjectSettings.physics/2d/sleep_threshold_linear].
</constant>
<constant name="SPACE_PARAM_BODY_ANGULAR_VELOCITY_SLEEP_THRESHOLD" value="5" enum="SpaceParameter">
- Constant to set/get the threshold angular velocity of activity. A body marked as potentially inactive for both linear and angular velocity will be put to sleep after the time given.
+ Constant to set/get the threshold angular velocity of activity. A body marked as potentially inactive for both linear and angular velocity will be put to sleep after the time given. The default value of this parameter is [member ProjectSettings.physics/2d/sleep_threshold_angular].
</constant>
<constant name="SPACE_PARAM_BODY_TIME_TO_SLEEP" value="6" enum="SpaceParameter">
- Constant to set/get the maximum time of activity. A body marked as potentially inactive for both linear and angular velocity will be put to sleep after this time.
+ Constant to set/get the maximum time of activity. A body marked as potentially inactive for both linear and angular velocity will be put to sleep after this time. The default value of this parameter is [member ProjectSettings.physics/2d/time_before_sleep].
</constant>
<constant name="SPACE_PARAM_CONSTRAINT_DEFAULT_BIAS" value="7" enum="SpaceParameter">
- Constant to set/get the default solver bias for all physics constraints. A solver bias is a factor controlling how much two objects "rebound", after violating a constraint, to avoid leaving them in that state because of numerical imprecision.
+ Constant to set/get the default solver bias for all physics constraints. A solver bias is a factor controlling how much two objects "rebound", after violating a constraint, to avoid leaving them in that state because of numerical imprecision. The default value of this parameter is [member ProjectSettings.physics/2d/solver/default_constraint_bias].
</constant>
<constant name="SPACE_PARAM_SOLVER_ITERATIONS" value="8" enum="SpaceParameter">
- Constant to set/get the number of solver iterations for all contacts and constraints. The greater the number of iterations, the more accurate the collisions will be. However, a greater number of iterations requires more CPU power, which can decrease performance.
+ Constant to set/get the number of solver iterations for all contacts and constraints. The greater the number of iterations, the more accurate the collisions will be. However, a greater number of iterations requires more CPU power, which can decrease performance. The default value of this parameter is [member ProjectSettings.physics/2d/solver/solver_iterations].
</constant>
<constant name="SHAPE_WORLD_BOUNDARY" value="0" enum="ShapeType">
This is the constant for creating world boundary shapes. A world boundary shape is an [i]infinite[/i] line with an origin point, and a normal. Thus, it can be used for front/behind checks.
@@ -964,7 +1011,7 @@
This is the constant for creating capsule shapes. A capsule shape is defined by a radius and a length. It can be used for intersections and inside/outside checks.
</constant>
<constant name="SHAPE_CONVEX_POLYGON" value="6" enum="ShapeType">
- This is the constant for creating convex polygon shapes. A polygon is defined by a list of points. It can be used for intersections and inside/outside checks. Unlike the [member CollisionPolygon2D.polygon] property, polygons modified with [method shape_set_data] do not verify that the points supplied form is a convex polygon.
+ This is the constant for creating convex polygon shapes. A polygon is defined by a list of points. It can be used for intersections and inside/outside checks.
</constant>
<constant name="SHAPE_CONCAVE_POLYGON" value="7" enum="ShapeType">
This is the constant for creating concave polygon shapes. A polygon is defined by a list of points. It can be used for intersections checks, but not for inside/outside checks.
@@ -973,35 +1020,35 @@
This constant is used internally by the engine. Any attempt to create this kind of shape results in an error.
</constant>
<constant name="AREA_PARAM_GRAVITY_OVERRIDE_MODE" value="0" enum="AreaParameter">
- Constant to set/get gravity override mode in an area. See [enum AreaSpaceOverrideMode] for possible values.
+ Constant to set/get gravity override mode in an area. See [enum AreaSpaceOverrideMode] for possible values. The default value of this parameter is [constant AREA_SPACE_OVERRIDE_DISABLED].
</constant>
<constant name="AREA_PARAM_GRAVITY" value="1" enum="AreaParameter">
- Constant to set/get gravity strength in an area.
+ Constant to set/get gravity strength in an area. The default value of this parameter is [code]9.80665[/code].
</constant>
<constant name="AREA_PARAM_GRAVITY_VECTOR" value="2" enum="AreaParameter">
- Constant to set/get gravity vector/center in an area.
+ Constant to set/get gravity vector/center in an area. The default value of this parameter is [code]Vector2(0, -1)[/code].
</constant>
<constant name="AREA_PARAM_GRAVITY_IS_POINT" value="3" enum="AreaParameter">
- Constant to set/get whether the gravity vector of an area is a direction, or a center point.
+ Constant to set/get whether the gravity vector of an area is a direction, or a center point. The default value of this parameter is [code]false[/code].
</constant>
<constant name="AREA_PARAM_GRAVITY_POINT_UNIT_DISTANCE" value="4" enum="AreaParameter">
Constant to set/get the distance at which the gravity strength is equal to the gravity controlled by [constant AREA_PARAM_GRAVITY]. For example, on a planet 100 pixels in radius with a surface gravity of 4.0 px/s², set the gravity to 4.0 and the unit distance to 100.0. The gravity will have falloff according to the inverse square law, so in the example, at 200 pixels from the center the gravity will be 1.0 px/s² (twice the distance, 1/4th the gravity), at 50 pixels it will be 16.0 px/s² (half the distance, 4x the gravity), and so on.
- The above is true only when the unit distance is a positive number. When the unit distance is set to 0.0, the gravity will be constant regardless of distance.
+ The above is true only when the unit distance is a positive number. When the unit distance is set to 0.0, the gravity will be constant regardless of distance. The default value of this parameter is [code]0.0[/code].
</constant>
<constant name="AREA_PARAM_LINEAR_DAMP_OVERRIDE_MODE" value="5" enum="AreaParameter">
- Constant to set/get linear damping override mode in an area. See [enum AreaSpaceOverrideMode] for possible values.
+ Constant to set/get linear damping override mode in an area. See [enum AreaSpaceOverrideMode] for possible values. The default value of this parameter is [constant AREA_SPACE_OVERRIDE_DISABLED].
</constant>
<constant name="AREA_PARAM_LINEAR_DAMP" value="6" enum="AreaParameter">
- Constant to set/get the linear damping factor of an area.
+ Constant to set/get the linear damping factor of an area. The default value of this parameter is [code]0.1[/code].
</constant>
<constant name="AREA_PARAM_ANGULAR_DAMP_OVERRIDE_MODE" value="7" enum="AreaParameter">
- Constant to set/get angular damping override mode in an area. See [enum AreaSpaceOverrideMode] for possible values.
+ Constant to set/get angular damping override mode in an area. See [enum AreaSpaceOverrideMode] for possible values. The default value of this parameter is [constant AREA_SPACE_OVERRIDE_DISABLED].
</constant>
<constant name="AREA_PARAM_ANGULAR_DAMP" value="8" enum="AreaParameter">
- Constant to set/get the angular damping factor of an area.
+ Constant to set/get the angular damping factor of an area. The default value of this parameter is [code]1.0[/code].
</constant>
<constant name="AREA_PARAM_PRIORITY" value="9" enum="AreaParameter">
- Constant to set/get the priority (order of processing) of an area.
+ Constant to set/get the priority (order of processing) of an area. The default value of this parameter is [code]0[/code].
</constant>
<constant name="AREA_SPACE_OVERRIDE_DISABLED" value="0" enum="AreaSpaceOverrideMode">
This area does not affect gravity/damp. These are generally areas that exist only to detect collisions, and objects entering or exiting them.
@@ -1031,34 +1078,36 @@
Constant for linear rigid bodies. In this mode, a body can not rotate, and only its linear velocity is affected by external forces.
</constant>
<constant name="BODY_PARAM_BOUNCE" value="0" enum="BodyParameter">
- Constant to set/get a body's bounce factor.
+ Constant to set/get a body's bounce factor. The default value of this parameter is [code]0.0[/code].
</constant>
<constant name="BODY_PARAM_FRICTION" value="1" enum="BodyParameter">
- Constant to set/get a body's friction.
+ Constant to set/get a body's friction. The default value of this parameter is [code]1.0[/code].
</constant>
<constant name="BODY_PARAM_MASS" value="2" enum="BodyParameter">
- Constant to set/get a body's mass.
+ Constant to set/get a body's mass. The default value of this parameter is [code]1.0[/code]. If the body's mode is set to [constant BODY_MODE_RIGID], then setting this parameter will have the following additional effects:
+ - If the parameter [constant BODY_PARAM_CENTER_OF_MASS] has never been set explicitly, then the value of that parameter will be recalculated based on the body's shapes.
+ - If the parameter [constant BODY_PARAM_INERTIA] is set to a value [code]&lt;= 0.0[/code], then the value of that parameter will be recalculated based on the body's shapes, mass, and center of mass.
</constant>
<constant name="BODY_PARAM_INERTIA" value="3" enum="BodyParameter">
- Constant to set/get a body's inertia.
+ Constant to set/get a body's inertia. The default value of this parameter is [code]0.0[/code]. If the body's inertia is set to a value [code]&lt;= 0.0[/code], then the inertia will be recalculated based on the body's shapes, mass, and center of mass.
</constant>
<constant name="BODY_PARAM_CENTER_OF_MASS" value="4" enum="BodyParameter">
- Constant to set/get a body's center of mass position in the body's local coordinate system.
+ Constant to set/get a body's center of mass position in the body's local coordinate system. The default value of this parameter is [code]Vector2(0,0)[/code]. If this parameter is never set explicitly, then it is recalculated based on the body's shapes when setting the parameter [constant BODY_PARAM_MASS] or when calling [method body_set_space].
</constant>
<constant name="BODY_PARAM_GRAVITY_SCALE" value="5" enum="BodyParameter">
- Constant to set/get a body's gravity multiplier.
+ Constant to set/get a body's gravity multiplier. The default value of this parameter is [code]1.0[/code].
</constant>
<constant name="BODY_PARAM_LINEAR_DAMP_MODE" value="6" enum="BodyParameter">
- Constant to set/get a body's linear damping mode. See [enum BodyDampMode] for possible values.
+ Constant to set/get a body's linear damping mode. See [enum BodyDampMode] for possible values. The default value of this parameter is [constant BODY_DAMP_MODE_COMBINE].
</constant>
<constant name="BODY_PARAM_ANGULAR_DAMP_MODE" value="7" enum="BodyParameter">
- Constant to set/get a body's angular damping mode. See [enum BodyDampMode] for possible values.
+ Constant to set/get a body's angular damping mode. See [enum BodyDampMode] for possible values. The default value of this parameter is [constant BODY_DAMP_MODE_COMBINE].
</constant>
<constant name="BODY_PARAM_LINEAR_DAMP" value="8" enum="BodyParameter">
- Constant to set/get a body's linear damping factor.
+ Constant to set/get a body's linear damping factor. The default value of this parameter is [code]0.0[/code].
</constant>
<constant name="BODY_PARAM_ANGULAR_DAMP" value="9" enum="BodyParameter">
- Constant to set/get a body's angular damping factor.
+ Constant to set/get a body's angular damping factor. The default value of this parameter is [code]0.0[/code].
</constant>
<constant name="BODY_PARAM_MAX" value="10" enum="BodyParameter">
Represents the size of the [enum BodyParameter] enum.
@@ -1097,24 +1146,31 @@
Represents the size of the [enum JointType] enum.
</constant>
<constant name="JOINT_PARAM_BIAS" value="0" enum="JointParam">
+ Constant to set/get how fast the joint pulls the bodies back to satisfy the joint constraint. The lower the value, the more the two bodies can pull on the joint. The default value of this parameter is [code]0.0[/code].
+ [b]Note:[/b] In Godot Physics, this parameter is only used for pin joints and groove joints.
</constant>
<constant name="JOINT_PARAM_MAX_BIAS" value="1" enum="JointParam">
+ Constant to set/get the maximum speed with which the joint can apply corrections. The default value of this parameter is [code]3.40282e+38[/code].
+ [b]Note:[/b] In Godot Physics, this parameter is only used for groove joints.
</constant>
<constant name="JOINT_PARAM_MAX_FORCE" value="2" enum="JointParam">
+ Constant to set/get the maximum force that the joint can use to act on the two bodies. The default value of this parameter is [code]3.40282e+38[/code].
+ [b]Note:[/b] In Godot Physics, this parameter is only used for groove joints.
</constant>
<constant name="PIN_JOINT_SOFTNESS" value="0" enum="PinJointParam">
+ Constant to set/get a how much the bond of the pin joint can flex. The default value of this parameter is [code]0.0[/code].
</constant>
<constant name="DAMPED_SPRING_REST_LENGTH" value="0" enum="DampedSpringParam">
- Sets the resting length of the spring joint. The joint will always try to go to back this length when pulled apart.
+ Sets the resting length of the spring joint. The joint will always try to go to back this length when pulled apart. The default value of this parameter is the distance between the joint's anchor points.
</constant>
<constant name="DAMPED_SPRING_STIFFNESS" value="1" enum="DampedSpringParam">
- Sets the stiffness of the spring joint. The joint applies a force equal to the stiffness times the distance from its resting length.
+ Sets the stiffness of the spring joint. The joint applies a force equal to the stiffness times the distance from its resting length. The default value of this parameter is [code]20.0[/code].
</constant>
<constant name="DAMPED_SPRING_DAMPING" value="2" enum="DampedSpringParam">
- Sets the damping ratio of the spring joint. A value of 0 indicates an undamped spring, while 1 causes the system to reach equilibrium as fast as possible (critical damping).
+ Sets the damping ratio of the spring joint. A value of 0 indicates an undamped spring, while 1 causes the system to reach equilibrium as fast as possible (critical damping). The default value of this parameter is [code]1.5[/code].
</constant>
<constant name="CCD_MODE_DISABLED" value="0" enum="CCDMode">
- Disables continuous collision detection. This is the fastest way to detect body collisions, but can miss small, fast-moving objects.
+ Disables continuous collision detection. This is the fastest way to detect body collisions, but it can miss small and/or fast-moving objects.
</constant>
<constant name="CCD_MODE_CAST_RAY" value="1" enum="CCDMode">
Enables continuous collision detection by raycasting. It is faster than shapecasting, but less precise.
diff --git a/doc/classes/PointLight2D.xml b/doc/classes/PointLight2D.xml
index 0c51a78e49..dd61082876 100644
--- a/doc/classes/PointLight2D.xml
+++ b/doc/classes/PointLight2D.xml
@@ -4,7 +4,7 @@
Positional 2D light source.
</brief_description>
<description>
- Casts light in a 2D environment. This light's shape is defined by a (usually grayscale) texture
+ Casts light in a 2D environment. This light's shape is defined by a (usually grayscale) texture.
</description>
<tutorials>
<link title="2D lights and shadows">$DOCS_URL/tutorials/2d/2d_lights_and_shadows.html</link>
diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml
index c30747eac1..3177780a26 100644
--- a/doc/classes/ProjectSettings.xml
+++ b/doc/classes/ProjectSettings.xml
@@ -474,9 +474,6 @@
<member name="debug/gdscript/warnings/static_called_on_instance" type="int" setter="" getter="" default="1">
When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when calling a static method from an instance of a class instead of from the class directly.
</member>
- <member name="debug/gdscript/warnings/treat_warnings_as_errors" type="bool" setter="" getter="" default="false">
- If [code]true[/code], all warnings will be reported as if they are errors.
- </member>
<member name="debug/gdscript/warnings/unassigned_variable" type="int" setter="" getter="" default="1">
When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when using a variable that wasn't previously assigned.
</member>
@@ -670,7 +667,7 @@
Main window initial position.
[code]0[/code] - "Absolute", [member display/window/size/initial_position] is used to set window position.
[code]1[/code] - "Primary Screen Center".
- [code]2[/code] - "Other Screen Center", [member display/window/size/initial_screen] is used to set window position.
+ [code]2[/code] - "Other Screen Center", [member display/window/size/initial_screen] is used to set the screen.
</member>
<member name="display/window/size/initial_screen" type="int" setter="" getter="" default="0">
Main window initial screen, this settings is used only if [member display/window/size/initial_position_type] is set to "Other Screen Center" ([code]2[/code]).
@@ -707,7 +704,8 @@
<member name="display/window/vsync/vsync_mode" type="int" setter="" getter="" default="1">
Sets the V-Sync mode for the main game window.
See [enum DisplayServer.VSyncMode] for possible values and how they affect the behavior of your application.
- Depending on the platform and used renderer, the engine will fall back to [code]Enabled[/code] if the desired mode is not supported.
+ Depending on the platform and used renderer, the engine will fall back to [b]Enabled[/b] if the desired mode is not supported.
+ [b]Note:[/b] V-Sync modes other than [b]Enabled[/b] are only supported in the Forward+ and Mobile rendering methods, not Compatibility.
[b]Note:[/b] This property is only read when the project starts. To change the V-Sync mode at runtime, call [method DisplayServer.window_set_vsync_mode] instead.
</member>
<member name="dotnet/project/assembly_name" type="String" setter="" getter="" default="&quot;&quot;">
@@ -806,7 +804,7 @@
Path to a custom [Font] resource to use as default for all GUI elements of the project.
</member>
<member name="gui/theme/default_font_antialiasing" type="int" setter="" getter="" default="1">
- Font anti-aliasing mode. See [member FontFile.antialiasing],
+ Font anti-aliasing mode. See [member FontFile.antialiasing].
</member>
<member name="gui/theme/default_font_generate_mipmaps" type="bool" setter="" getter="" default="false">
If set to [code]true[/code], the default font will have mipmaps generated. This prevents text from looking grainy when a [Control] is scaled down, or when a [Label3D] is viewed from a long distance (if [member Label3D.texture_filter] is set to a mode that displays mipmaps).
@@ -960,16 +958,16 @@
macOS specific override for the shortcut to delete a word.
</member>
<member name="input/ui_text_caret_add_above" type="Dictionary" setter="" getter="">
- Default [InputEventAction] to add an additional caret above every caret of a text
+ Default [InputEventAction] to add an additional caret above every caret of a text.
</member>
<member name="input/ui_text_caret_add_above.macos" type="Dictionary" setter="" getter="">
- macOS specific override for the shortcut to add a caret above every caret
+ macOS specific override for the shortcut to add a caret above every caret.
</member>
<member name="input/ui_text_caret_add_below" type="Dictionary" setter="" getter="">
- Default [InputEventAction] to add an additional caret below every caret of a text
+ Default [InputEventAction] to add an additional caret below every caret of a text.
</member>
<member name="input/ui_text_caret_add_below.macos" type="Dictionary" setter="" getter="">
- macOS specific override for the shortcut to add a caret below every caret
+ macOS specific override for the shortcut to add a caret below every caret.
</member>
<member name="input/ui_text_caret_document_end" type="Dictionary" setter="" getter="">
Default [InputEventAction] to move the text cursor the the end of the text.
@@ -1149,9 +1147,6 @@
<member name="input_devices/pointing/emulate_touch_from_mouse" type="bool" setter="" getter="" default="false">
If [code]true[/code], sends touch input events when clicking or dragging the mouse.
</member>
- <member name="input_devices/pointing/ios/touch_delay" type="float" setter="" getter="" default="0.15">
- Default delay for touch events. This only affects iOS devices.
- </member>
<member name="internationalization/locale/fallback" type="String" setter="" getter="" default="&quot;en&quot;">
The locale to fall back to if a translation isn't available in a given language. If left empty, [code]en[/code] (English) will be used.
</member>
@@ -1666,7 +1661,7 @@
Optional name for the 3D render layer 13. If left empty, the layer will display as "Layer 13".
</member>
<member name="layer_names/3d_render/layer_14" type="String" setter="" getter="" default="&quot;&quot;">
- Optional name for the 3D render layer 14. If left empty, the layer will display as "Layer 14"
+ Optional name for the 3D render layer 14. If left empty, the layer will display as "Layer 14".
</member>
<member name="layer_names/3d_render/layer_15" type="String" setter="" getter="" default="&quot;&quot;">
Optional name for the 3D render layer 15. If left empty, the layer will display as "Layer 15".
@@ -1934,13 +1929,16 @@
</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.
+ [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.
+ [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">
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 while rendering objects. Screen-space AA methods are typically faster than MSAA and will smooth out specular aliasing, but tend to make scenes appear blurry. The blurriness is partially counteracted by automatically using a negative mipmap LOD bias (see [member rendering/textures/default_filters/texture_mipmap_bias]).
Another way to combat specular aliasing is to enable [member rendering/anti_aliasing/screen_space_roughness_limiter/enabled].
+ [b]Note:[/b] Screen-space antialiasing is only supported in the Forward+ and Mobile rendering methods, not Compatibility.
</member>
<member name="rendering/anti_aliasing/quality/use_debanding" type="bool" setter="" getter="" default="false">
If [code]true[/code], uses a fast post-processing filter to make banding significantly less visible in 3D. 2D rendering is [i]not[/i] affected by debanding unless the [member Environment.background_mode] is [constant Environment.BG_CANVAS].
@@ -1949,11 +1947,14 @@
</member>
<member name="rendering/anti_aliasing/quality/use_taa" type="bool" setter="" getter="" default="false">
Enables Temporal Anti-Aliasing for the default screen [Viewport]. TAA works by jittering the camera and accumulating the images of the last rendered frames, motion vector rendering is used to account for camera and object motion. Enabling TAA can make the image blurrier, which is partially counteracted by automatically using a negative mipmap LOD bias (see [member rendering/textures/default_filters/texture_mipmap_bias]).
- [b]Note:[/b] The implementation is not complete yet, some visual instances such as particles and skinned meshes may show artifacts.
+ [b]Note:[/b] The implementation is not complete yet. Some visual instances such as particles and skinned meshes may show ghosting artifacts in motion.
+ [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">
</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.
</member>
<member name="rendering/anti_aliasing/screen_space_roughness_limiter/limit" type="float" setter="" getter="" default="0.18">
</member>
@@ -1971,7 +1972,7 @@
</member>
<member name="rendering/driver/depth_prepass/enable" type="bool" setter="" getter="" default="true">
If [code]true[/code], performs a previous depth pass before rendering 3D materials. This increases performance significantly in scenes with high overdraw, when complex materials and lighting are used. However, in scenes with few occluded surfaces, the depth prepass may reduce performance. If your game is viewed from a fixed angle that makes it easy to avoid overdraw (such as top-down or side-scrolling perspective), consider disabling the depth prepass to improve performance. This setting can be changed at run-time to optimize performance depending on the scene currently being viewed.
- [b]Note:[/b] Only supported when using the Vulkan Clustered backend or the OpenGL backend. When using Vulkan Mobile there is no depth prepass performed.
+ [b]Note:[/b] Depth prepass is only supported when using the Forward+ or Compatibility rendering method. When using the Mobile rendering method, there is no depth prepass performed.
</member>
<member name="rendering/driver/threads/thread_model" type="int" setter="" getter="" default="1">
Thread model for rendering. Rendering on a thread can vastly improve performance, but synchronizing to the main thread can cause a bit more jitter.
@@ -2177,12 +2178,15 @@
</member>
<member name="rendering/limits/opengl/max_lights_per_object" type="int" setter="" getter="" default="8">
Max number of omnilights and spotlights renderable per object. At the default value of 8, this means that each surface can be affected by up to 8 omnilights and 8 spotlights. This is further limited by hardware support and [member rendering/limits/opengl/max_renderable_lights]. Setting this low will slightly reduce memory usage, may decrease shader compile times, and may result in faster rendering on low-end, mobile, or web devices.
+ [b]Note:[/b] This setting is only effective when using the Compatibility rendering method, not Forward+ and Mobile.
</member>
<member name="rendering/limits/opengl/max_renderable_elements" type="int" setter="" getter="" default="65536">
Max number of elements renderable in a frame. If more elements than this are visible per frame, they will not be drawn. Keep in mind elements refer to mesh surfaces and not meshes themselves. Setting this low will slightly reduce memory usage and may decrease shader compile times, particularly on web. For most uses, the default value is suitable, but consider lowering as much as possible on web export.
+ [b]Note:[/b] This setting is only effective when using the Compatibility rendering method, not Forward+ and Mobile.
</member>
<member name="rendering/limits/opengl/max_renderable_lights" type="int" setter="" getter="" default="32">
Max number of positional lights renderable in a frame. If more lights than this number are used, they will be ignored. Setting this low will slightly reduce memory usage and may decrease shader compile times, particularly on web. For most uses, the default value is suitable, but consider lowering as much as possible on web export.
+ [b]Note:[/b] This setting is only effective when using the Compatibility rendering method, not Forward+ and Mobile.
</member>
<member name="rendering/limits/spatial_indexer/threaded_cull_minimum_instances" type="int" setter="" getter="" default="1000">
</member>
@@ -2274,7 +2278,8 @@
Determines how sharp the upscaled image will be when using the FSR upscaling mode. Sharpness halves with every whole number. Values go from 0.0 (sharpest) to 2.0. Values above 2.0 won't make a visible difference.
</member>
<member name="rendering/scaling_3d/mode" type="int" setter="" getter="" default="0">
- Sets the 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 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. On particularly low-end GPUs, the added cost of FSR may not be worth it (compared to using bilinear scaling with a slightly higher resolution scale to match performance).
+ [b]Note:[/b] FSR is only effective when using the Forward+ rendering method, not Mobile or Compatibility. If using an incompatible rendering method, FSR will fall back to bilinear scaling.
</member>
<member name="rendering/scaling_3d/scale" type="float" setter="" getter="" default="1.0">
Scales the 3D render buffer based on the viewport size uses an image filter specified in [member rendering/scaling_3d/mode] to scale the output image to the full viewport size. Values lower than [code]1.0[/code] can be used to speed up 3D rendering at the cost of quality (undersampling). Values greater than [code]1.0[/code] are only valid for bilinear mode and can be used to improve 3D rendering quality at a high performance cost (supersampling). See also [member rendering/anti_aliasing/quality/msaa_3d] for multi-sample antialiasing, which is significantly cheaper but only smooths the edges of polygons.
@@ -2298,9 +2303,11 @@
</member>
<member name="rendering/shading/overrides/force_vertex_shading" type="bool" setter="" getter="" default="false">
If [code]true[/code], forces vertex shading for all rendering. This can increase performance a lot, but also reduces quality immensely. Can be used to optimize performance on low-end mobile devices.
+ [b]Note:[/b] This setting currently has no effect, as vertex shading is not implemented yet.
</member>
<member name="rendering/shading/overrides/force_vertex_shading.mobile" type="bool" setter="" getter="" default="true">
Lower-end override for [member rendering/shading/overrides/force_vertex_shading] on mobile devices, due to performance concerns or driver support.
+ [b]Note:[/b] This setting currently has no effect, as vertex shading is not implemented yet.
</member>
<member name="rendering/textures/decals/filter" type="int" setter="" getter="" default="3">
The filtering quality to use for [Decal] nodes. When using one of the anisotropic filtering modes, the anisotropic filtering level is controlled by [member rendering/textures/default_filters/anisotropic_filtering_level].
@@ -2327,11 +2334,11 @@
<member name="rendering/textures/lossless_compression/force_png" type="bool" setter="" getter="" default="false">
If [code]true[/code], the texture importer will import lossless textures using the PNG format. Otherwise, it will default to using WebP.
</member>
- <member name="rendering/textures/vram_compression/import_etc2_astc" type="bool" setter="" getter="" default="false">
+ <member name="rendering/textures/vram_compression/import_etc2_astc" type="bool" setter="" getter="">
If [code]true[/code], the texture importer will import VRAM-compressed textures using the Ericsson Texture Compression 2 algorithm for lower quality textures and normalmaps and Adaptable Scalable Texture Compression algorithm for high quality textures (in 4x4 block size).
[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]).
</member>
- <member name="rendering/textures/vram_compression/import_s3tc_bptc" type="bool" setter="" getter="" default="true">
+ <member name="rendering/textures/vram_compression/import_s3tc_bptc" type="bool" setter="" getter="">
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.
[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]).
</member>
diff --git a/doc/classes/ReflectionProbe.xml b/doc/classes/ReflectionProbe.xml
index e912925cd2..cc48e0612b 100644
--- a/doc/classes/ReflectionProbe.xml
+++ b/doc/classes/ReflectionProbe.xml
@@ -7,6 +7,7 @@
Captures its surroundings as a cubemap, and stores versions of it with increasing levels of blur to simulate different material roughnesses.
The [ReflectionProbe] is used to create high-quality reflections at a low performance cost (when [member update_mode] is [constant UPDATE_ONCE]). [ReflectionProbe]s can be blended together and with the rest of the scene smoothly. [ReflectionProbe]s can also be combined with [VoxelGI], SDFGI ([member Environment.sdfgi_enabled]) and screen-space reflections ([member Environment.ssr_enabled]) to get more accurate reflections in specific areas. [ReflectionProbe]s render all objects within their [member cull_mask], so updating them can be quite expensive. It is best to update them once with the important static objects and then leave them as-is.
[b]Note:[/b] Unlike [VoxelGI] and SDFGI, [ReflectionProbe]s only source their environment from a [WorldEnvironment] node. If you specify an [Environment] resource within a [Camera3D] node, it will be ignored by the [ReflectionProbe]. This can lead to incorrect lighting within the [ReflectionProbe].
+ [b]Note:[/b] Reflection probes are only supported in the Forward+ and Mobile rendering methods, not Compatibility. When using the Mobile rendering method, only 8 reflection probes can be displayed on each mesh resource. Attempting to display more than 8 reflection probes on a single mesh resource will result in reflection probes flickering in and out as the camera moves.
[b]Note:[/b] When using the Mobile rendering method, reflection probes will only correctly affect meshes whose visibility AABB intersects with the reflection probe's AABB. If using a shader to deform the mesh in a way that makes it go outside its AABB, [member GeometryInstance3D.extra_cull_margin] must be increased on the mesh. Otherwise, the reflection probe may not be visible on the mesh.
</description>
<tutorials>
diff --git a/doc/classes/RenderingDevice.xml b/doc/classes/RenderingDevice.xml
index 82a2871949..64be8e6807 100644
--- a/doc/classes/RenderingDevice.xml
+++ b/doc/classes/RenderingDevice.xml
@@ -8,7 +8,7 @@
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.
[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] is not available when running in headless mode or when using the OpenGL renderer.
+ [b]Note:[/b] [RenderingDevice] is not available when running in headless mode or when using the Compatibility rendering method.
</description>
<tutorials>
</tutorials>
@@ -32,7 +32,10 @@
<method name="buffer_get_data">
<return type="PackedByteArray" />
<param index="0" name="buffer" type="RID" />
+ <param index="1" name="offset_bytes" type="int" default="0" />
+ <param index="2" name="size_bytes" type="int" default="0" />
<description>
+ 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.
</description>
</method>
<method name="buffer_update">
diff --git a/doc/classes/RichTextLabel.xml b/doc/classes/RichTextLabel.xml
index 49bb65b64d..5985af53fc 100644
--- a/doc/classes/RichTextLabel.xml
+++ b/doc/classes/RichTextLabel.xml
@@ -373,7 +373,7 @@
<return type="void" />
<param index="0" name="data" type="Variant" />
<description>
- Adds a [code][meta][/code] tag to the tag stack. Similar to the BBCode [code][url=something]{text}[/url][/code], but supports non-[String] metadata types.
+ Adds a meta tag to the tag stack. Similar to the BBCode [code][url=something]{text}[/url][/code], but supports non-[String] metadata types.
</description>
</method>
<method name="push_mono">
@@ -625,60 +625,6 @@
<constant name="LIST_DOTS" value="3" enum="ListType">
Each list item has a filled circle marker.
</constant>
- <constant name="ITEM_FRAME" value="0" enum="ItemType">
- </constant>
- <constant name="ITEM_TEXT" value="1" enum="ItemType">
- </constant>
- <constant name="ITEM_IMAGE" value="2" enum="ItemType">
- </constant>
- <constant name="ITEM_NEWLINE" value="3" enum="ItemType">
- </constant>
- <constant name="ITEM_FONT" value="4" enum="ItemType">
- </constant>
- <constant name="ITEM_FONT_SIZE" value="5" enum="ItemType">
- </constant>
- <constant name="ITEM_FONT_FEATURES" value="6" enum="ItemType">
- </constant>
- <constant name="ITEM_COLOR" value="7" enum="ItemType">
- </constant>
- <constant name="ITEM_OUTLINE_SIZE" value="8" enum="ItemType">
- </constant>
- <constant name="ITEM_OUTLINE_COLOR" value="9" enum="ItemType">
- </constant>
- <constant name="ITEM_UNDERLINE" value="10" enum="ItemType">
- </constant>
- <constant name="ITEM_STRIKETHROUGH" value="11" enum="ItemType">
- </constant>
- <constant name="ITEM_PARAGRAPH" value="12" enum="ItemType">
- </constant>
- <constant name="ITEM_INDENT" value="13" enum="ItemType">
- </constant>
- <constant name="ITEM_LIST" value="14" enum="ItemType">
- </constant>
- <constant name="ITEM_TABLE" value="15" enum="ItemType">
- </constant>
- <constant name="ITEM_FADE" value="16" enum="ItemType">
- </constant>
- <constant name="ITEM_SHAKE" value="17" enum="ItemType">
- </constant>
- <constant name="ITEM_WAVE" value="18" enum="ItemType">
- </constant>
- <constant name="ITEM_TORNADO" value="19" enum="ItemType">
- </constant>
- <constant name="ITEM_RAINBOW" value="20" enum="ItemType">
- </constant>
- <constant name="ITEM_BGCOLOR" value="21" enum="ItemType">
- </constant>
- <constant name="ITEM_FGCOLOR" value="22" enum="ItemType">
- </constant>
- <constant name="ITEM_META" value="23" enum="ItemType">
- </constant>
- <constant name="ITEM_HINT" value="24" enum="ItemType">
- </constant>
- <constant name="ITEM_DROPCAP" value="25" enum="ItemType">
- </constant>
- <constant name="ITEM_CUSTOMFX" value="26" enum="ItemType">
- </constant>
<constant name="MENU_COPY" value="0" enum="MenuItems">
Copies the selected text.
</constant>
diff --git a/doc/classes/RigidBody2D.xml b/doc/classes/RigidBody2D.xml
index 6e3535f14a..937d0910ec 100644
--- a/doc/classes/RigidBody2D.xml
+++ b/doc/classes/RigidBody2D.xml
@@ -176,6 +176,28 @@
<member name="inertia" type="float" setter="set_inertia" getter="get_inertia" default="0.0">
The body's moment of inertia. This is like mass, but for rotation: it determines how much torque it takes to rotate the body. The moment of inertia is usually computed automatically from the mass and the shapes, but this property allows you to set a custom value.
If set to [code]0[/code], inertia is automatically computed (default value).
+ [b]Note:[/b] This value does not change when inertia is automatically computed. Use [PhysicsServer2D] to get the computed inertia.
+ [codeblocks]
+ [gdscript]
+ @onready var ball = $Ball
+
+ func get_ball_inertia():
+ return 1.0 / PhysicsServer2D.body_get_direct_state(ball.get_rid()).inverse_inertia
+ [/gdscript]
+ [csharp]
+ private RigidBody2D _ball;
+
+ public override void _Ready()
+ {
+ _ball = GetNode&lt;RigidBody2D&gt;("Ball");
+ }
+
+ private float GetBallInertia()
+ {
+ return 1.0f / PhysicsServer2D.BodyGetDirectState(_ball.GetRid()).InverseInertia;
+ }
+ [/csharp]
+ [/codeblocks]
</member>
<member name="linear_damp" type="float" setter="set_linear_damp" getter="get_linear_damp" default="0.0">
Damps the body's movement. By default, the body will use the [b]Default Linear Damp[/b] in [b]Project &gt; Project Settings &gt; Physics &gt; 2d[/b] or any value override set by an [Area2D] the body is in. Depending on [member linear_damp_mode], you can set [member linear_damp] to be added to or to replace the body's damping value.
diff --git a/doc/classes/RigidBody3D.xml b/doc/classes/RigidBody3D.xml
index 148cdf96ee..a066254b4f 100644
--- a/doc/classes/RigidBody3D.xml
+++ b/doc/classes/RigidBody3D.xml
@@ -183,6 +183,28 @@
<member name="inertia" type="Vector3" setter="set_inertia" getter="get_inertia" default="Vector3(0, 0, 0)">
The body's moment of inertia. This is like mass, but for rotation: it determines how much torque it takes to rotate the body on each axis. The moment of inertia is usually computed automatically from the mass and the shapes, but this property allows you to set a custom value.
If set to [code]Vector3.ZERO[/code], inertia is automatically computed (default value).
+ [b]Note:[/b] This value does not change when inertia is automatically computed. Use [PhysicsServer3D] to get the computed inertia.
+ [codeblocks]
+ [gdscript]
+ @onready var ball = $Ball
+
+ func get_ball_inertia():
+ return PhysicsServer3D.body_get_direct_state(ball.get_rid()).inverse_inertia.inverse()
+ [/gdscript]
+ [csharp]
+ private RigidBody3D _ball;
+
+ public override void _Ready()
+ {
+ _ball = GetNode&lt;RigidBody3D&gt;("Ball");
+ }
+
+ private Vector3 GetBallInertia()
+ {
+ return PhysicsServer3D.BodyGetDirectState(_ball.GetRid()).InverseInertia.Inverse();
+ }
+ [/csharp]
+ [/codeblocks]
</member>
<member name="linear_damp" type="float" setter="set_linear_damp" getter="get_linear_damp" default="0.0">
Damps the body's movement. By default, the body will use the [b]Default Linear Damp[/b] in [b]Project &gt; Project Settings &gt; Physics &gt; 3d[/b] or any value override set by an [Area3D] the body is in. Depending on [member linear_damp_mode], you can set [member linear_damp] to be added to or to replace the body's damping value.
diff --git a/doc/classes/ScriptExtension.xml b/doc/classes/ScriptExtension.xml
index 045eadda41..61034f8e4a 100644
--- a/doc/classes/ScriptExtension.xml
+++ b/doc/classes/ScriptExtension.xml
@@ -32,6 +32,11 @@
<description>
</description>
</method>
+ <method name="_get_global_name" qualifiers="virtual const">
+ <return type="StringName" />
+ <description>
+ </description>
+ </method>
<method name="_get_instance_base_type" qualifiers="virtual const">
<return type="StringName" />
<description>
diff --git a/doc/classes/Skeleton3D.xml b/doc/classes/Skeleton3D.xml
index 70986ba06a..bdd3495798 100644
--- a/doc/classes/Skeleton3D.xml
+++ b/doc/classes/Skeleton3D.xml
@@ -240,7 +240,7 @@
<description>
Sets the global pose transform, [param pose], for the bone at [param bone_idx].
[param amount] is the interpolation strength that will be used when applying the pose, and [param persistent] determines if the applied pose will remain.
- [b]Note:[/b] The pose transform needs to be a global pose! To convert a world transform from a [Node3D] to a global bone pose, multiply the [method Transform3D.affine_inverse] of the node's [member Node3D.global_transform] by the desired world transform
+ [b]Note:[/b] The pose transform needs to be a global pose! To convert a world transform from a [Node3D] to a global bone pose, multiply the [method Transform3D.affine_inverse] of the node's [member Node3D.global_transform] by the desired world transform.
</description>
</method>
<method name="set_bone_name">
diff --git a/doc/classes/SpotLight3D.xml b/doc/classes/SpotLight3D.xml
index 9dff742748..3b32923872 100644
--- a/doc/classes/SpotLight3D.xml
+++ b/doc/classes/SpotLight3D.xml
@@ -5,6 +5,7 @@
</brief_description>
<description>
A Spotlight is a type of [Light3D] node that emits lights in a specific direction, in the shape of a cone. The light is attenuated through the distance. This attenuation can be configured by changing the energy, radius and attenuation parameters of [Light3D].
+ [b]Note:[/b] When using the Mobile rendering method, only 8 spot lights can be displayed on each mesh resource. Attempting to display more than 8 spot lights on a single mesh resource will result in spot lights flickering in and out as the camera moves. When using the Compatibility rendering method, only 8 spot lights can be displayed on each mesh resource by default, but this can be increased by adjusting [member ProjectSettings.rendering/limits/opengl/max_lights_per_object].
[b]Note:[/b] When using the Mobile or Compatibility rendering methods, spot lights will only correctly affect meshes whose visibility AABB intersects with the light's AABB. If using a shader to deform the mesh in a way that makes it go outside its AABB, [member GeometryInstance3D.extra_cull_margin] must be increased on the mesh. Otherwise, the light may not be visible on the mesh.
</description>
<tutorials>
@@ -19,10 +20,11 @@
[b]Note:[/b] [member spot_angle] is not affected by [member Node3D.scale] (the light's scale or its parent's scale).
</member>
<member name="spot_angle_attenuation" type="float" setter="set_param" getter="get_param" default="1.0">
- The spotlight's angular attenuation curve.
+ The spotlight's [i]angular[/i] attenuation curve. See also [member spot_attenuation].
</member>
<member name="spot_attenuation" type="float" setter="set_param" getter="get_param" default="1.0">
- The spotlight's light energy attenuation curve.
+ The spotlight's light energy (drop-off) attenuation curve. A number of presets are available in the [b]Inspector[/b] by right-clicking the curve. Zero and negative values are allowed but can produce unusual effects. See also [member spot_angle_attenuation].
+ [b]Note:[/b] Very high [member spot_attenuation] values (typically above 10) can impact performance negatively if the light is made to use a larger [member spot_range] to compensate. This is because culling opportunities will become less common and shading costs will be increased (as the light will cover more pixels on screen while resulting in the same amount of brightness). To improve performance, use the lowest [member spot_attenuation] value possible for the visuals you're trying to achieve.
</member>
<member name="spot_range" type="float" setter="set_param" getter="get_param" default="5.0">
The maximal range that can be reached by the spotlight. Note that the effectively lit area may appear to be smaller depending on the [member spot_attenuation] in use. No matter the [member spot_attenuation] in use, the light will never reach anything outside this range.
diff --git a/doc/classes/StreamPeer.xml b/doc/classes/StreamPeer.xml
index 969cbac57d..9a70690122 100644
--- a/doc/classes/StreamPeer.xml
+++ b/doc/classes/StreamPeer.xml
@@ -109,6 +109,7 @@
<param index="0" name="allow_objects" type="bool" default="false" />
<description>
Gets a Variant from the stream. If [param allow_objects] is [code]true[/code], decoding objects is allowed.
+ Internally, this uses the same decoding mechanism as the [method @GlobalScope.bytes_to_var] method.
[b]Warning:[/b] Deserialized objects can contain code which gets executed. Do not use this option if the serialized object comes from untrusted sources to avoid potential security threats such as remote code execution.
</description>
</method>
@@ -234,6 +235,7 @@
<param index="1" name="full_objects" type="bool" default="false" />
<description>
Puts a Variant into the stream. If [param full_objects] is [code]true[/code] encoding objects is allowed (and can potentially include code).
+ Internally, this uses the same encoding mechanism as the [method @GlobalScope.var_to_bytes] method.
</description>
</method>
</methods>
diff --git a/doc/classes/String.xml b/doc/classes/String.xml
index 792cd38741..8535dacda7 100644
--- a/doc/classes/String.xml
+++ b/doc/classes/String.xml
@@ -193,8 +193,8 @@
GD.Print("Team".Find("I")); // Prints -1
GD.Print("Potato".Find("t")); // Prints 2
- GD.print("Potato".Find("t", 3)); // Prints 4
- GD.print("Potato".Find("t", 5)); // Prints -1
+ GD.Print("Potato".Find("t", 3)); // Prints 4
+ GD.Print("Potato".Find("t", 5)); // Prints -1
[/csharp]
[/codeblocks]
[b]Note:[/b] If you just want to know whether the string contains [param what], use [method contains]. In GDScript, you may also use the [code]in[/code] operator.
@@ -230,6 +230,7 @@
print("User {id} is {name}.".format([["id", 42], ["name", "Godot"]]))
[/codeblock]
See also the [url=$DOCS_URL/tutorials/scripting/gdscript/gdscript_format_string.html]GDScript format string[/url] tutorial.
+ [b]Note:[/b] In C#, it's recommended to [url=https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated]interpolate strings with "$"[/url], instead.
</description>
</method>
<method name="get_base_dir" qualifiers="const">
@@ -480,7 +481,7 @@
var fruits = new string[] {"Apple", "Orange", "Pear", "Kiwi"};
// In C#, this method is static.
- GD.Print(string.Join(", ", fruits); // Prints "Apple, Orange, Pear, Kiwi"
+ GD.Print(string.Join(", ", fruits)); // Prints "Apple, Orange, Pear, Kiwi"
GD.Print(string.Join("---", fruits)); // Prints "Apple---Orange---Pear---Kiwi"
[/csharp]
[/codeblocks]
@@ -1047,8 +1048,7 @@
<return type="String" />
<param index="0" name="right" type="Variant" />
<description>
- Formats the [String], replacing the placeholders with one or more parameters.
- To pass multiple parameters, [param right] needs to be an [Array].
+ Formats the [String], replacing the placeholders with one or more parameters. To pass multiple parameters, [param right] needs to be an [Array].
[codeblock]
print("I caught %d fishes!" % 2) # Prints "I caught 2 fishes!"
@@ -1057,8 +1057,8 @@
var speed = 40.3485
print(my_message % [location, speed]) # Prints "Travelling to Deep Valley, at 40.35 km/h."
[/codeblock]
- In C#, there is no direct equivalent to this operator. Use the [method format] method, instead.
For more information, see the [url=$DOCS_URL/tutorials/scripting/gdscript/gdscript_format_string.html]GDScript format strings[/url] tutorial.
+ [b]Note:[/b] In C#, this operator is not available. Instead, see [url=https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated]how to interpolate strings with "$"[/url].
</description>
</operator>
<operator name="operator +">
@@ -1072,6 +1072,7 @@
<return type="String" />
<param index="0" name="right" type="StringName" />
<description>
+ Appends [param right] at the end of this [String], returning a [String]. This is also known as a string concatenation.
</description>
</operator>
<operator name="operator &lt;">
diff --git a/doc/classes/StringName.xml b/doc/classes/StringName.xml
index c103fb2287..96b958a5b9 100644
--- a/doc/classes/StringName.xml
+++ b/doc/classes/StringName.xml
@@ -5,7 +5,7 @@
</brief_description>
<description>
[StringName]s are immutable strings designed for general-purpose representation of unique names (also called "string interning"). [StringName] ensures that only one instance of a given name exists (so two [StringName]s with the same value are the same object). Comparing them is much faster than with regular [String]s, because only the pointers are compared, not the whole strings.
- You will usually just pass a [String] to methods expecting a [StringName] and it will be automatically converted, but you may occasionally want to construct a [StringName] ahead of time with [StringName] or, in GDScript, the literal syntax [code]&amp;"example"[/code].
+ You will usually just pass a [String] to methods expecting a [StringName] and it will be automatically converted, but you may occasionally want to construct a [StringName] ahead of time with the [StringName] constructor or, in GDScript, the literal syntax [code]&amp;"example"[/code].
See also [NodePath], which is a similar concept specifically designed to store pre-parsed node paths.
Some string methods have corresponding variations. Variations suffixed with [code]n[/code] ([method countn], [method findn], [method replacen], etc.) are [b]case-insensitive[/b] (they make no distinction between uppercase and lowercase letters). Method variations prefixed with [code]r[/code] ([method rfind], [method rsplit], etc.) are reversed, and start from the end of the string, instead of the beginning.
[b]Note:[/b] In a boolean context, a [StringName] will evaluate to [code]false[/code] if it is empty ([code]StringName("")[/code]). Otherwise, a [StringName] will always evaluate to [code]true[/code].
@@ -176,8 +176,8 @@
GD.Print("Team".Find("I")); // Prints -1
GD.Print("Potato".Find("t")); // Prints 2
- GD.print("Potato".Find("t", 3)); // Prints 4
- GD.print("Potato".Find("t", 5)); // Prints -1
+ GD.Print("Potato".Find("t", 3)); // Prints 4
+ GD.Print("Potato".Find("t", 5)); // Prints -1
[/csharp]
[/codeblocks]
[b]Note:[/b] If you just want to know whether the string contains [param what], use [method contains]. In GDScript, you may also use the [code]in[/code] operator.
@@ -213,6 +213,7 @@
print("User {id} is {name}.".format([["id", 42], ["name", "Godot"]]))
[/codeblock]
See also the [url=$DOCS_URL/tutorials/scripting/gdscript/gdscript_format_string.html]GDScript format string[/url] tutorial.
+ [b]Note:[/b] In C#, it's recommended to [url=https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated]interpolate strings with "$"[/url], instead.
</description>
</method>
<method name="get_base_dir" qualifiers="const">
@@ -455,7 +456,7 @@
var fruits = new string[] {"Apple", "Orange", "Pear", "Kiwi"};
// In C#, this method is static.
- GD.Print(string.Join(", ", fruits); // Prints "Apple, Orange, Pear, Kiwi"
+ GD.Print(string.Join(", ", fruits)); // Prints "Apple, Orange, Pear, Kiwi"
GD.Print(string.Join("---", fruits)); // Prints "Apple---Orange---Pear---Kiwi"
[/csharp]
[/codeblocks]
@@ -954,18 +955,23 @@
<return type="String" />
<param index="0" name="right" type="Variant" />
<description>
+ Formats the [StringName], replacing the placeholders with one or more parameters, returning a [String]. To pass multiple parameters, [param right] needs to be an [Array].
+ For more information, see the [url=$DOCS_URL/tutorials/scripting/gdscript/gdscript_format_string.html]GDScript format strings[/url] tutorial.
+ [b]Note:[/b] In C#, this operator is not available. Instead, see [url=https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated]how to interpolate strings with "$"[/url].
</description>
</operator>
<operator name="operator +">
<return type="String" />
<param index="0" name="right" type="String" />
<description>
+ Appends [param right] at the end of this [StringName], returning a [String]. This is also known as a string concatenation.
</description>
</operator>
<operator name="operator +">
<return type="String" />
<param index="0" name="right" type="StringName" />
<description>
+ Appends [param right] at the end of this [StringName], returning a [String]. This is also known as a string concatenation.
</description>
</operator>
<operator name="operator &lt;">
diff --git a/doc/classes/TextEdit.xml b/doc/classes/TextEdit.xml
index c309026aaa..be8c4c2485 100644
--- a/doc/classes/TextEdit.xml
+++ b/doc/classes/TextEdit.xml
@@ -436,7 +436,7 @@
<return type="int" />
<param index="0" name="position" type="Vector2i" />
<description>
- Returns the equivalent minimap line at [param position]
+ Returns the equivalent minimap line at [param position].
</description>
</method>
<method name="get_minimap_visible_lines" qualifiers="const">
@@ -483,7 +483,7 @@
<method name="get_saved_version" qualifiers="const">
<return type="int" />
<description>
- Returns the last tagged saved version from [method tag_saved_version]
+ Returns the last tagged saved version from [method tag_saved_version].
</description>
</method>
<method name="get_scroll_pos_for_line" qualifiers="const">
@@ -1054,7 +1054,7 @@
<return type="void" />
<param index="0" name="callback" type="Callable" />
<description>
- Provide custom tooltip text. The callback method must take the following args: [code]hovered_word: String[/code]
+ Provide custom tooltip text. The callback method must take the following args: [code]hovered_word: String[/code].
</description>
</method>
<method name="start_action">
diff --git a/doc/classes/TextureLayered.xml b/doc/classes/TextureLayered.xml
index 8f6dff7acf..7a0940edd4 100644
--- a/doc/classes/TextureLayered.xml
+++ b/doc/classes/TextureLayered.xml
@@ -8,7 +8,7 @@
Data is set on a per-layer basis. For [Texture2DArray]s, the layer specifies the array layer.
All images need to have the same width, height and number of mipmap levels.
A [TextureLayered] can be loaded with [method ResourceLoader.load].
- Internally, Godot maps these files to their respective counterparts in the target rendering driver (Vulkan, GLES3).
+ Internally, Godot maps these files to their respective counterparts in the target rendering driver (Vulkan, OpenGL3).
</description>
<tutorials>
</tutorials>
diff --git a/doc/classes/TextureRect.xml b/doc/classes/TextureRect.xml
index 460ffbbb80..3500a0ddf5 100644
--- a/doc/classes/TextureRect.xml
+++ b/doc/classes/TextureRect.xml
@@ -10,8 +10,9 @@
<link title="3D Voxel Demo">https://godotengine.org/asset-library/asset/676</link>
</tutorials>
<members>
- <member name="expand_mode" type="int" setter="set_expand_mode" getter="get_expand_mode" enum="TextureRect.ExpandMode" default="0">
+ <member name="expand_mode" type="int" setter="set_expand_mode" getter="get_expand_mode" enum="TextureRect.ExpandMode" default="0" is_experimental="true">
Defines how minimum size is determined based on the texture's size. See [enum ExpandMode] for options.
+ [b]Note:[/b] Using [constant EXPAND_FIT_WIDTH], [constant EXPAND_FIT_WIDTH_PROPORTIONAL], [constant EXPAND_FIT_HEIGHT] or [constant EXPAND_FIT_HEIGHT_PROPORTIONAL] may result in unstable behavior in some containers. This functionality is being re-evaluated and will change in the future.
</member>
<member name="flip_h" type="bool" setter="set_flip_h" getter="is_flipped_h" default="false">
If [code]true[/code], texture is flipped horizontally.
diff --git a/doc/classes/TileMap.xml b/doc/classes/TileMap.xml
index 5dedea50d0..413cf62f7d 100644
--- a/doc/classes/TileMap.xml
+++ b/doc/classes/TileMap.xml
@@ -168,6 +168,15 @@
Returns the number of layers in the TileMap.
</description>
</method>
+ <method name="get_navigation_map" qualifiers="const">
+ <return type="RID" />
+ <param index="0" name="layer" type="int" />
+ <description>
+ Returns the [NavigationServer2D] navigation map [RID] currently assigned to the specified TileMap [param layer].
+ By default the TileMap uses the default [World2D] navigation map for the first TileMap layer. For each additional TileMap layer a new navigation map is created for the additional layer.
+ In order to make [NavigationAgent2D] switch between TileMap layer navigation maps use [method NavigationAgent2D.set_navigation_map] with the navigation map received from [method get_navigation_map].
+ </description>
+ </method>
<method name="get_neighbor_cell" qualifiers="const">
<return type="Vector2i" />
<param index="0" name="coords" type="Vector2i" />
@@ -188,7 +197,7 @@
<return type="Vector2i[]" />
<param index="0" name="coords" type="Vector2i" />
<description>
- Returns the list of all neighbourings cells to the one at [param coords]
+ Returns the list of all neighbourings cells to the one at [param coords].
</description>
</method>
<method name="get_used_cells" qualifiers="const">
@@ -243,7 +252,7 @@
<param index="1" name="coords_in_pattern" type="Vector2i" />
<param index="2" name="pattern" type="TileMapPattern" />
<description>
- Returns for the given coordinate [param coords_in_pattern] in a [TileMapPattern] the corresponding cell coordinates if the pattern was pasted at the [param position_in_tilemap] coordinates (see [method set_pattern]). This mapping is required as in half-offset tile shapes, the mapping might not work by calculating [code]position_in_tile_map + coords_in_pattern[/code]
+ Returns for the given coordinate [param coords_in_pattern] in a [TileMapPattern] the corresponding cell coordinates if the pattern was pasted at the [param position_in_tilemap] coordinates (see [method set_pattern]). This mapping is required as in half-offset tile shapes, the mapping might not work by calculating [code]position_in_tile_map + coords_in_pattern[/code].
</description>
</method>
<method name="map_to_local" qualifiers="const">
@@ -366,6 +375,16 @@
If [code]layer[/code] is negative, the layers are accessed from the last one.
</description>
</method>
+ <method name="set_navigation_map">
+ <return type="void" />
+ <param index="0" name="layer" type="int" />
+ <param index="1" name="map" type="RID" />
+ <description>
+ Assigns a [NavigationServer2D] navigation map [RID] to the specified TileMap [param layer].
+ By default the TileMap uses the default [World2D] navigation map for the first TileMap layer. For each additional TileMap layer a new navigation map is created for the additional layer.
+ In order to make [NavigationAgent2D] switch between TileMap layer navigation maps use [method NavigationAgent2D.set_navigation_map] with the navigation map received from [method get_navigation_map].
+ </description>
+ </method>
<method name="set_pattern">
<return type="void" />
<param index="0" name="layer" type="int" />
diff --git a/doc/classes/VisibleOnScreenEnabler2D.xml b/doc/classes/VisibleOnScreenEnabler2D.xml
index 8590e9cc9f..68e510a6dc 100644
--- a/doc/classes/VisibleOnScreenEnabler2D.xml
+++ b/doc/classes/VisibleOnScreenEnabler2D.xml
@@ -24,7 +24,7 @@
Corresponds to [constant Node.PROCESS_MODE_ALWAYS].
</constant>
<constant name="ENABLE_MODE_WHEN_PAUSED" value="2" enum="EnableMode">
- Corresponds to [constant Node.PROCESS_MODE_WHEN_PAUSED.
+ Corresponds to [constant Node.PROCESS_MODE_WHEN_PAUSED].
</constant>
</constants>
</class>
diff --git a/doc/classes/VisibleOnScreenNotifier2D.xml b/doc/classes/VisibleOnScreenNotifier2D.xml
index 32cb191067..c6a7bd5690 100644
--- a/doc/classes/VisibleOnScreenNotifier2D.xml
+++ b/doc/classes/VisibleOnScreenNotifier2D.xml
@@ -6,6 +6,7 @@
<description>
The VisibleOnScreenNotifier2D detects when it is visible on the screen. It also notifies when its bounding rectangle enters or exits the screen or a viewport.
If you want nodes to be disabled automatically when they exit the screen, use [VisibleOnScreenEnabler2D] instead.
+ [b]Note:[/b] VisibleOnScreenNotifier2D uses the render culling code to determine whether it's visible on screen, which also means that its [member CanvasItem.visible] must be [code]true[/code] to work correctly.
</description>
<tutorials>
<link title="2D Dodge The Creeps Demo">https://godotengine.org/asset-library/asset/515</link>
diff --git a/doc/classes/VisibleOnScreenNotifier3D.xml b/doc/classes/VisibleOnScreenNotifier3D.xml
index 6dec09d03f..aecc3dd0d5 100644
--- a/doc/classes/VisibleOnScreenNotifier3D.xml
+++ b/doc/classes/VisibleOnScreenNotifier3D.xml
@@ -6,7 +6,7 @@
<description>
The VisibleOnScreenNotifier3D detects when it is visible on the screen. It also notifies when its bounding rectangle enters or exits the screen or a [Camera3D]'s view.
If you want nodes to be disabled automatically when they exit the screen, use [VisibleOnScreenEnabler3D] instead.
- [b]Note:[/b] VisibleOnScreenNotifier3D uses an approximate heuristic for performance reasons. It doesn't take walls and other occlusion into account. The heuristic is an implementation detail and may change in future versions. If you need precise visibility checking, use another method such as adding an [Area3D] node as a child of a [Camera3D] node and/or [method Vector3.dot].
+ [b]Note:[/b] VisibleOnScreenNotifier3D uses the render culling code to determine whether it's visible on screen, which also means that its [member Node3D.visible] must be [code]true[/code] to work correctly.
</description>
<tutorials>
</tutorials>
diff --git a/doc/classes/VoxelGI.xml b/doc/classes/VoxelGI.xml
index 4347c5845f..cc78426736 100644
--- a/doc/classes/VoxelGI.xml
+++ b/doc/classes/VoxelGI.xml
@@ -5,6 +5,7 @@
</brief_description>
<description>
[VoxelGI]s are used to provide high-quality real-time indirect light and reflections to scenes. They precompute the effect of objects that emit light and the effect of static geometry to simulate the behavior of complex light in real-time. [VoxelGI]s need to be baked before having a visible effect. However, once baked, dynamic objects will receive light from them. Furthermore, lights can be fully dynamic or baked.
+ [b]Note:[/b] [VoxelGI] is only supported in the Forward+ rendering method, not Mobile or Compatibility.
[b]Procedural generation:[/b] [VoxelGI] can be baked in an exported project, which makes it suitable for procedurally generated or user-built levels as long as all the geometry is generated in advance. For games where geometry is generated at any time during gameplay, SDFGI is more suitable (see [member Environment.sdfgi_enabled]).
[b]Performance:[/b] [VoxelGI] is relatively demanding on the GPU and is not suited to low-end hardware such as integrated graphics (consider [LightmapGI] instead). To improve performance, adjust [member ProjectSettings.rendering/global_illumination/voxel_gi/quality] and enable [member ProjectSettings.rendering/global_illumination/gi/use_half_resolution] in the Project Settings. To provide a fallback for low-end hardware, consider adding an option to disable [VoxelGI] in your project's options menus. A [VoxelGI] node can be disabled by hiding it.
[b]Note:[/b] Meshes should have sufficiently thick walls to avoid light leaks (avoid one-sided walls). For interior levels, enclose your level geometry in a sufficiently large box and bridge the loops to close the mesh. To further prevent light leaks, you can also strategically place temporary [MeshInstance3D] nodes with their [member GeometryInstance3D.gi_mode] set to [constant GeometryInstance3D.GI_MODE_STATIC]. These temporary nodes can then be hidden after baking the [VoxelGI] node.
diff --git a/doc/classes/Window.xml b/doc/classes/Window.xml
index 14e705a7e6..92050eaa34 100644
--- a/doc/classes/Window.xml
+++ b/doc/classes/Window.xml
@@ -358,6 +358,7 @@
<description>
Popups the [Window] at the center of the current screen, with optionally given minimum size.
If the [Window] is embedded, it will be centered in the parent [Viewport] instead.
+ [b]Note:[/b] Calling it with the default value of [param minsize] is equivalent to calling it with [member size].
</description>
</method>
<method name="popup_centered_clamped">
@@ -367,6 +368,7 @@
<description>
Popups the [Window] centered inside its parent [Window].
[code]fallback_ratio[/code] determines the maximum size of the [Window], in relation to its parent.
+ [b]Note:[/b] Calling it with the default value of [param minsize] is equivalent to calling it with [member size].
</description>
</method>
<method name="popup_centered_ratio">
diff --git a/doc/classes/XRInterface.xml b/doc/classes/XRInterface.xml
index db65ce62f2..cdada35970 100644
--- a/doc/classes/XRInterface.xml
+++ b/doc/classes/XRInterface.xml
@@ -210,7 +210,7 @@
This interface supports quad rendering (not yet supported by Godot).
</constant>
<constant name="XR_VR" value="8" enum="Capabilities">
- this interface supports VR.
+ This interface supports VR.
</constant>
<constant name="XR_AR" value="16" enum="Capabilities">
This interface supports AR (video background and real world tracking).
diff --git a/doc/translations/es.po b/doc/translations/es.po
index 5624cb8668..66093519c4 100644
--- a/doc/translations/es.po
+++ b/doc/translations/es.po
@@ -5,7 +5,7 @@
#
# 44pes Games <44pes.games@gmail.com>, 2020.
# Megamega53 <Christopher.Morales21@myhunter.cuny.edu>, 2020, 2021.
-# Javier Ocampos <xavier.ocampos@gmail.com>, 2020, 2021, 2022.
+# Javier Ocampos <xavier.ocampos@gmail.com>, 2020, 2021, 2022, 2023.
# Serk Lintur <serk.lintur@gmail.com>, 2020.
# Lambientan <pedrogtzr@protonmail.com>, 2020.
# paco <pacosoftfree@protonmail.com>, 2020, 2021.
@@ -40,12 +40,15 @@
# Victor Stancioiu <victorstancioiu@gmail.com>, 2022.
# yohanger <yohangerariel@gmail.com>, 2022.
# Mateo <mfdez920@gmail.com>, 2023.
+# Alan Arrecis <alan.arrecis@gmail.com>, 2023.
+# Fernando Sacó <saco.fernando@gmail.com>, 2023.
+# Damien Monasterios <monasterio13septiembre@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-01-12 06:06+0000\n"
-"Last-Translator: Mateo <mfdez920@gmail.com>\n"
+"PO-Revision-Date: 2023-02-10 14:12+0000\n"
+"Last-Translator: Damien Monasterios <monasterio13septiembre@gmail.com>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/"
"godot-class-reference/es/>\n"
"Language: es\n"
@@ -53,7 +56,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.15.1-dev\n"
+"X-Generator: Weblate 4.16-dev\n"
msgid "Description"
msgstr "Descripción"
@@ -64,11 +67,17 @@ msgstr "Tutoriales"
msgid "Properties"
msgstr "Propiedades"
+msgid "Constructors"
+msgstr "Constructores"
+
msgid "Methods"
msgstr "Métodos"
+msgid "Operators"
+msgstr "Operadores"
+
msgid "Theme Properties"
-msgstr "Propiedades del Theme"
+msgstr "Propiedades del Tema"
msgid "Signals"
msgstr "Señales"
@@ -82,9 +91,15 @@ msgstr "Constantes"
msgid "Property Descriptions"
msgstr "Descripciones de Propiedades"
+msgid "Constructor Descriptions"
+msgstr "Descripciones de Constructor"
+
msgid "Method Descriptions"
msgstr "Descripciones de Métodos"
+msgid "Operator Descriptions"
+msgstr "Descripciones de Operador"
+
msgid "Theme Property Descriptions"
msgstr "Descripciones de las propiedades del tema"
@@ -148,84 +163,155 @@ msgstr ""
msgid "Built-in GDScript functions."
msgstr "Funciones GDScript integradas."
-msgid "Converts from decibels to linear energy (audio)."
-msgstr "Convierte de decibeles a energía lineal (audio)."
-
msgid ""
-"Prints one or more arguments to strings in the best way possible to standard "
-"error line.\n"
-"[codeblock]\n"
-"printerr(\"prints to stderr\")\n"
-"[/codeblock]"
+"A list of GDScript-specific utility functions accessed in any script.\n"
+"For the list of the global functions and constants see [@GlobalScope]."
msgstr ""
-"Imprime uno o más argumentos a strings de la mejor manera posible a la línea "
-"de error estándar.\n"
-"[codeblock]\n"
-"printerr(\"Imprime a stderr\")\n"
-"[/codeblock]"
+"Una lista de funciones de utilidad de script específico GD accedidas en "
+"cualquier script.\n"
+"Para la lista de funciones globales y constantes ver [@GlobalScope]."
+
+msgid "GDScript exports"
+msgstr "Exportaciones de Scripts GD"
msgid ""
-"Prints one or more arguments to the console with a space between each "
-"argument.\n"
+"Returns a [Color] constructed from red ([param r8]), green ([param g8]), "
+"blue ([param b8]), and optionally alpha ([param a8]) integer channels, each "
+"divided by [code]255.0[/code] for their final value.\n"
"[codeblock]\n"
-"prints(\"A\", \"B\", \"C\") # Prints A B C\n"
+"var red = Color8(255, 0, 0) # Same as Color(1, 0, 0)\n"
+"var dark_blue = Color8(0, 0, 51) # Same as Color(0, 0, 0.2).\n"
+"var my_color = Color8(306, 255, 0, 102) # Same as Color(1.2, 1, 0, 0.4).\n"
"[/codeblock]"
msgstr ""
-"Imprime uno o más argumentos en la consola con un espacio entre cada "
-"argumento.\n"
+"Devuelve un [Color] construido desde rojo ([param r8]), verde ([param "
+"g8]), azul ([param b8]), y opcionalmente alfa ([param a8]) valores "
+"enteros, cada uno dividido por [code]255.0[/code] por su valor final.\n"
"[codeblock]\n"
-"prints(\"A\", \"B\", \"C\") # Imprime A B C\n"
+"var red = Color8(255, 0, 0) # Igual que Color(1, 0, 0)\n"
+"var dark_blue = Color8(0, 0, 51) # Igual que Color(0, 0, 0.2).\n"
+"var my_color = Color8(306, 255, 0, 102) # Igual que Color(1.2, 1, 0, 0.4).\n"
"[/codeblock]"
msgid ""
-"Prints one or more arguments to the console with a tab between each "
-"argument.\n"
+"Returns a single character (as a [String]) of the given Unicode code point "
+"(which is compatible with ASCII code).\n"
"[codeblock]\n"
-"printt(\"A\", \"B\", \"C\") # Prints A B C\n"
+"a = char(65) # a is \"A\"\n"
+"a = char(65 + 32) # a is \"a\"\n"
+"a = char(8364) # a is \"€\"\n"
"[/codeblock]"
msgstr ""
-"Imprime uno o más argumentos en la consola con un tabulador entre cada "
-"argumento.\n"
+"Devuelve un carácter como una cadena de tipo Unicode (el cual es compatible "
+"con el código ASCII).\n"
"[codeblock]\n"
-"printt(\"A\",\"B\",\"C\") # Imprime A\\tB\\tC\n"
+"a = char(65) # a es \"A\"\n"
+"a = char(65 + 32) # a es \"a\"\n"
+"a = char(8364) # a es \"€\"\n"
"[/codeblock]"
msgid ""
-"Pushes a warning message to Godot's built-in debugger and to the OS "
-"terminal.\n"
+"Returns an array with the given range. [method range] can be called in three "
+"ways:\n"
+"[code]range(n: int)[/code]: Starts from 0, increases by steps of 1, and "
+"stops [i]before[/i] [code]n[/code]. The argument [code]n[/code] is "
+"[b]exclusive[/b].\n"
+"[code]range(b: int, n: int)[/code]: Starts from [code]b[/code], increases by "
+"steps of 1, and stops [i]before[/i] [code]n[/code]. The arguments [code]b[/"
+"code] and [code]n[/code] are [b]inclusive[/b] and [b]exclusive[/b], "
+"respectively.\n"
+"[code]range(b: int, n: int, s: int)[/code]: Starts from [code]b[/code], "
+"increases/decreases by steps of [code]s[/code], and stops [i]before[/i] "
+"[code]n[/code]. The arguments [code]b[/code] and [code]n[/code] are "
+"[b]inclusive[/b] and [b]exclusive[/b], respectively. The argument [code]s[/"
+"code] [b]can[/b] be negative, but not [code]0[/code]. If [code]s[/code] is "
+"[code]0[/code], an error message is printed.\n"
+"[method range] converts all arguments to [int] before processing.\n"
+"[b]Note:[/b] Returns an empty array if no value meets the value constraint "
+"(e.g. [code]range(2, 5, -1)[/code] or [code]range(5, 5, 1)[/code]).\n"
+"Examples:\n"
"[codeblock]\n"
-"push_warning(\"test warning\") # Prints \"test warning\" to debugger and "
-"terminal as warning call\n"
-"[/codeblock]"
-msgstr ""
-"Envía un mensaje de aviso al depurador incorporado de Godot y al terminal "
-"del sistema operativo.\n"
+"print(range(4)) # Prints [0, 1, 2, 3]\n"
+"print(range(2, 5)) # Prints [2, 3, 4]\n"
+"print(range(0, 6, 2)) # Prints [0, 2, 4]\n"
+"print(range(4, 1, -1)) # Prints [4, 3, 2]\n"
+"[/codeblock]\n"
+"To iterate over an [Array] backwards, use:\n"
"[codeblock]\n"
-"push_warning(\"test warning) # Imprime \"test warning\" al depurador y a la "
-"terminal como una llamada de aviso.\n"
-"[/codeblock]"
-
-msgid ""
-"Returns a random unsigned 32-bit integer. Use remainder to obtain a random "
-"value in the interval [code][0, N - 1][/code] (where N is smaller than "
-"2^32).\n"
+"var array = [3, 6, 9]\n"
+"for i in range(array.size(), 0, -1):\n"
+" print(array[i - 1])\n"
+"[/codeblock]\n"
+"Output:\n"
+"[codeblock]\n"
+"9\n"
+"6\n"
+"3\n"
+"[/codeblock]\n"
+"To iterate over [float], convert them in the loop.\n"
+"[codeblock]\n"
+"for i in range (3, 0, -1):\n"
+" print(i / 10.0)\n"
+"[/codeblock]\n"
+"Output:\n"
"[codeblock]\n"
-"randi() # Returns random integer between 0 and 2^32 - 1\n"
-"randi() % 20 # Returns random integer between 0 and 19\n"
-"randi() % 100 # Returns random integer between 0 and 99\n"
-"randi() % 100 + 1 # Returns random integer between 1 and 100\n"
+"0.3\n"
+"0.2\n"
+"0.1\n"
"[/codeblock]"
msgstr ""
-"Devuelve un entero aleatorio sin signo de 32 bits. Utiliza el resto para "
-"obtener un valor aleatorio en el intervalo [code][0, N - 1][/code] (donde N "
-"es menor que 2^32).\n"
+"Devuelve un array con el rango dado. El método range puede ser invocado de "
+"tres maneras:\n"
+"[code]range(n: int)[/code]: Comienza desde 0, incrementa de 1 en 1, y para "
+"[i]antes de[/i] [code]n[/code]. El argumento [code]n[/code] es [b]exclusivo[/"
+"b].\n"
+"[code]range(b: int, n: int)[/code]: Comienza desde [code]b[/code], "
+"incrementa de 1 en 1, y para [i]antes de[/i] [code]n[/code]. Los argumentos "
+"[code]b[/code] y [code]n[/code] son [b]inclusivo[/b] y [b]exclusivo[/b], "
+"respectivamente.\n"
+"[code]range(b: int, n: int, s: int)[/code]: Comiensa desde [code]b[/code], "
+"incrementa o decrementa en pasos de [code]s[/code], y para [i]antes de[/i] "
+"[code]n[/code]. Los argumentos [code]b[/code] y [code]n[/code] son "
+"[b]inclusivo[/b] y [b]exclusivo[/b], respectivamente. El argumento [code]s[/"
+"code] [b]puede[/b] ser negativo, pero no [code]0[/code]. Si [code]s[/code] "
+"es [code]0[/code], se mostrará un mensaje de error.\n"
+"El método range convierte todos los argumentos a [int] antes de procesarse.\n"
+"[b]Note:[/b] Devuelve un array vacío si no encuentra el valor de control (v."
+"g. [code]range(2, 5, -1)[/code] o [code]range(5, 5, 1)[/code]).\n"
+"Ejemplos:\n"
"[codeblock]\n"
-"randi() # Devuelve un entero aleatorio entre 0 y 2^32 - 1.\n"
-"randi() % 20 # Devuelve un entero aleatorio entre 0 y 19.\n"
-"randi() % 100 # Devuelve un entero aleatorio entre 0 y 99.\n"
-"randi() % 100 + 1 # Devuelve un entero aleatoria entre 1 y 100\n"
+"print(range(4)) # Imprime [0, 1, 2, 3]\n"
+"print(range(2, 5)) # Imprime [2, 3, 4]\n"
+"print(range(0, 6, 2)) # Imprime [0, 2, 4]\n"
+"print(range(4, 1, -1)) # Imprime [4, 3, 2]\n"
+"[/codeblock]\n"
+"Para iterar un [Array] hacia atrás, utilice:\n"
+"[codeblock]\n"
+"var array = [3, 6, 9]\n"
+"for i in range(array.size(), 0, -1):\n"
+" print(array[i - 1])\n"
+"[/codeblock]\n"
+"Salida:\n"
+"[codeblock]\n"
+"9\n"
+"6\n"
+"3\n"
+"[/codeblock]\n"
+"Para iterar sobre [float], conviertelos en el bucle.\n"
+"[codeblock]\n"
+"for i in range (3, 0, -1):\n"
+" print(i / 10.0)\n"
+"[/codeblock]\n"
+"Salida:\n"
+"[codeblock]\n"
+"0.3\n"
+"0.2\n"
+"0.1\n"
"[/codeblock]"
+msgid "Converts from decibels to linear energy (audio)."
+msgstr "Convierte de decibeles a energía lineal (audio)."
+
msgid "The [AudioServer] singleton."
msgstr "El singleton [AudioServer]."
@@ -1311,31 +1397,15 @@ msgstr "Si [code]true[/code], la textura se voltea horizontalmente."
msgid "If [code]true[/code], texture is flipped vertically."
msgstr "Si [code]true[/code], la textura se voltea verticalmente."
-msgid "The displayed animation frame's index."
-msgstr "El índice del cuadro de animación mostrado."
-
msgid "The texture's drawing offset."
msgstr "El desplazamiento al dibujar de la textura."
-msgid "Emitted when [member frame] changed."
-msgstr "Emitido cuando [member frame] cambió."
-
msgid ""
"2D sprite node in 3D world, that can use multiple 2D textures for animation."
msgstr ""
"Nodo de sprites 2D en el mundo 3D, que puede usar múltiples texturas 2D para "
"la animación."
-msgid ""
-"The current animation from the [code]frames[/code] resource. If this value "
-"changes, the [code]frame[/code] counter is reset."
-msgstr ""
-"La animación actual del recurso [code]frames[/code]. Si este valor cambia, "
-"el contador [code]frame[/code] se reinicia."
-
-msgid "The [SpriteFrames] resource containing the animation(s)."
-msgstr "El recurso [SpriteFrames] que contiene la(s) animación(es)."
-
msgid "Proxy texture for simple frame-based animations."
msgstr "Textura de conexión para animaciones simples basadas en fotogramas."
@@ -1537,14 +1607,7 @@ msgstr ""
"en su lugar."
msgid "AnimationTree"
-msgstr "AnimationTree"
-
-msgid ""
-"Adds an input to the node. This is only useful for nodes created for use in "
-"an [AnimationNodeBlendTree]."
-msgstr ""
-"Añade una entrada al nodo. Esto sólo es útil para los nodos creados para su "
-"uso en un [AnimationNodeBlendTree]."
+msgstr "Ãrbol de Animación"
msgid ""
"Blend another animation node (in case this node contains children animation "
@@ -1582,17 +1645,6 @@ msgstr "Añade o elimina una ruta para el filtro."
msgid "If [code]true[/code], filtering is enabled."
msgstr "Si [code]true[/code], el filtrado está activado."
-msgid ""
-"Emitted by nodes that inherit from this class and that have an internal tree "
-"when one of their nodes changes. The nodes that emit this signal are "
-"[AnimationNodeBlendSpace1D], [AnimationNodeBlendSpace2D], "
-"[AnimationNodeStateMachine], and [AnimationNodeBlendTree]."
-msgstr ""
-"Emitidos por nodos que heredan de esta clase y que tienen un árbol interno "
-"cuando uno de sus nodos cambia. Los nodos que emiten esta señal son "
-"[AnimationNodeBlendSpace1D], [AnimationNodeBlendSpace2D], "
-"[AnimationNodeStateMachine], y [AnimationNodeBlendTree]."
-
msgid "Do not use filtering."
msgstr "No utilice el filtrado."
@@ -1734,6 +1786,13 @@ msgid "Returns the number of points on the blend axis."
msgstr "Devuelve el número de puntos en el eje de la mezcla."
msgid ""
+"Controls the interpolation between animations. See [enum BlendMode] "
+"constants."
+msgstr ""
+"Controla la interpolación entre las animaciones. Ver las constantes de [enum "
+"BlendMode]."
+
+msgid ""
"The blend space's axis's upper limit for the points' position. See [method "
"add_blend_point]."
msgstr ""
@@ -1755,6 +1814,23 @@ msgstr ""
msgid "Label of the virtual axis of the blend space."
msgstr "Etiqueta del eje virtual del espacio de mezcla."
+msgid "The interpolation between animations is linear."
+msgstr "La interpolación entre las animaciones es lineal."
+
+msgid ""
+"The blend space plays the animation of the node the blending position is "
+"closest to. Useful for frame-by-frame 2D animations."
+msgstr ""
+"El espacio de mezcla reproduce la animación del nodo más cercano a la "
+"posición de mezcla. Es útil para las animaciones 2D fotograma a fotograma."
+
+msgid ""
+"Similar to [constant BLEND_MODE_DISCRETE], but starts the new animation at "
+"the last animation's playback position."
+msgstr ""
+"Similar a [constant BLEND_MODE_DISCRETE], pero inicia la nueva animación en "
+"la posición de reproducción de la última animación."
+
msgid ""
"Blends linearly between three [AnimationNode] of any type placed in a 2D "
"space."
@@ -1795,13 +1871,6 @@ msgstr ""
"add_blend_point] y [method remove_blend_point]."
msgid ""
-"Controls the interpolation between animations. See [enum BlendMode] "
-"constants."
-msgstr ""
-"Controla la interpolación entre las animaciones. Ver las constantes de [enum "
-"BlendMode]."
-
-msgid ""
"The blend space's X and Y axes' upper limit for the points' position. See "
"[method add_blend_point]."
msgstr ""
@@ -1831,23 +1900,6 @@ msgstr ""
"Emitida cada vez que los triángulos del espacio de mezcla se crean, se "
"eliminan, o cuando uno de sus vértices cambia de posición."
-msgid "The interpolation between animations is linear."
-msgstr "La interpolación entre las animaciones es lineal."
-
-msgid ""
-"The blend space plays the animation of the node the blending position is "
-"closest to. Useful for frame-by-frame 2D animations."
-msgstr ""
-"El espacio de mezcla reproduce la animación del nodo más cercano a la "
-"posición de mezcla. Es útil para las animaciones 2D fotograma a fotograma."
-
-msgid ""
-"Similar to [constant BLEND_MODE_DISCRETE], but starts the new animation at "
-"the last animation's playback position."
-msgstr ""
-"Similar a [constant BLEND_MODE_DISCRETE], pero inicia la nueva animación en "
-"la posición de reproducción de la última animación."
-
msgid "[AnimationTree] node resource that contains many blend type nodes."
msgstr ""
"[AnimationTree] es un recurso de nodos que contiene muchos nodos de tipo "
@@ -2078,20 +2130,6 @@ msgid "Clears all queued, unplayed animations."
msgstr "Limpia todas las colas, animaciones no reproducidas."
msgid ""
-"Gets the actual playing speed of current animation or 0 if not playing. This "
-"speed is the [member playback_speed] property multiplied by "
-"[code]custom_speed[/code] argument specified when calling the [method play] "
-"method."
-msgstr ""
-"Obtiene la velocidad de ejecucion de la animacion actual o 0 sino esta "
-"siendo reproducida. Esta velocidad es la propiedad [member playback_speed] "
-"multiplicada por el argumento [code]custom_speed[/code] especificado cuando "
-"se llama al metodo [method play]."
-
-msgid "Returns [code]true[/code] if playing an animation."
-msgstr "Devuelve [code]true[/code] si se esta reproduciendo una animación."
-
-msgid ""
"Queues an animation for playback once the current one is done.\n"
"[b]Note:[/b] If a looped animation is currently playing, the queued "
"animation will never play unless the looped animation is stopped somehow."
@@ -2215,13 +2253,6 @@ msgstr ""
"Si [code]true[/code], el área del bus de audio sobrescribe el bus de audio "
"por defecto."
-msgid ""
-"The falloff factor for point gravity. The greater the value, the faster "
-"gravity decreases with distance."
-msgstr ""
-"El factor de caída para la gravedad puntual. Cuanto mayor es el valor, más "
-"rápido disminuye la gravedad con la distancia."
-
msgid "If [code]true[/code], other monitoring areas can detect this area."
msgstr ""
"Si [code]true[/code], otras áreas de monitoreo pueden detectar esta área."
@@ -3147,11 +3178,6 @@ msgstr ""
"Devuelve la [AudioEffectInstance] asignada al bus dado y los indices de "
"efecto (y opcionalmente el canal)."
-msgid "Returns the names of all audio devices detected on the system."
-msgstr ""
-"Devuelve los nombres de todos los dispositivos de audio detectados en el "
-"sistema."
-
msgid "Returns the sample rate at the output of the [AudioServer]."
msgstr "Devuelve la frecuencia de muestreo a la salida del [AudioServer]."
@@ -3300,15 +3326,9 @@ msgstr ""
"Devuelve el objeto [AudioStreamPlayback] asociado a este "
"[AudioStreamPlayer2D]."
-msgid "Dampens audio over distance with this as an exponent."
-msgstr "Amortigua el audio a distancia con esto como exponente."
-
msgid "Maximum distance from which audio is still hearable."
msgstr "Distancia máxima desde la que se puede oír el audio."
-msgid "Base volume without dampening."
-msgstr "Volumen de la base sin amortiguar."
-
msgid ""
"Returns the [AudioStreamPlayback] object associated with this "
"[AudioStreamPlayer3D]."
@@ -3325,25 +3345,6 @@ msgstr ""
"cuadrática, logarítmica, o no ser afectado por la distancia, desactivando "
"efectivamente la atenuación."
-msgid "The angle in which the audio reaches cameras undampened."
-msgstr "El ángulo en el que el audio llega a las cámaras sin amortiguar."
-
-msgid ""
-"If [code]true[/code], the audio should be dampened according to the "
-"direction of the sound."
-msgstr ""
-"Si [code]true[/code], el audio debe ser amortiguado de acuerdo a la "
-"dirección del sonido."
-
-msgid "Linear dampening of loudness according to distance."
-msgstr "Amortiguación lineal de la sonido según la distancia."
-
-msgid "Squared dampening of loudness according to distance."
-msgstr "Amortiguación cuadrada del sonido según la distancia."
-
-msgid "Logarithmic dampening of loudness according to distance."
-msgstr "Amortiguación logarítmica del sonido según la distancia."
-
msgid "Disables doppler tracking."
msgstr "Desactiva el rastreo doppler."
@@ -6158,13 +6159,6 @@ msgstr ""
"lo que hace cada una."
msgid ""
-"The size of the node's bounding rectangle, in pixels. [Container] nodes "
-"update this property automatically."
-msgstr ""
-"El tamaño del rectángulo delimitador del nodo, en píxeles. Los nodos "
-"[Container] actualizan esta propiedad automáticamente."
-
-msgid ""
"Tells the parent [Container] nodes how they should resize and place the node "
"on the X axis. Use one of the [enum SizeFlags] constants to change the "
"flags. See the constants to learn what each does."
@@ -6720,7 +6714,7 @@ msgid "Particles are drawn in order of remaining lifetime."
msgstr "Las partículas se dibujan en orden según el tiempo de vida restante."
msgid "Represents the size of the [enum Parameter] enum."
-msgstr "Representa el tamaño del enum [enum Parameter]."
+msgstr "Representa el tamaño del enumerado [enum Parameter]."
msgid "Present for consistency with 3D particle nodes, not used in 2D."
msgstr ""
@@ -8756,6 +8750,11 @@ msgstr ""
"Devuelve el ascenso de la fuente (número de píxeles por encima de la línea "
"de base)."
+msgid "Returns the font descent (number of pixels below the baseline)."
+msgstr ""
+"Devuelve el descenso de la fuente (número de píxeles por debajo de la línea "
+"de base)."
+
msgid "A script implemented in the GDScript programming language."
msgstr "Un guión implementado en el lenguaje de programación GDScript."
@@ -8841,13 +8840,6 @@ msgstr ""
"La mínima rotación en dirección positiva para soltarse y girar alrededor del "
"eje X."
-msgid ""
-"The amount of rotational damping across the Y axis. The lower, the more "
-"dampening occurs."
-msgstr ""
-"La cantidad de amortiguación rotacional a través del eje Y. Cuanto más bajo, "
-"más amortiguación se produce."
-
msgid "If [code]true[/code], rotation across the Y axis is limited."
msgstr "Si [code]true[/code], la rotación a través del eje Y está limitada."
@@ -8887,13 +8879,6 @@ msgstr ""
"La mínima rotación en dirección positiva para soltarse y girar alrededor del "
"eje Y."
-msgid ""
-"The amount of rotational damping across the Z axis. The lower, the more "
-"dampening occurs."
-msgstr ""
-"La cantidad de amortiguación rotacional a través del eje Z. Cuanto más bajo, "
-"más amortiguación se produce."
-
msgid "If [code]true[/code], rotation across the Z axis is limited."
msgstr "Si [code]true[/code], la rotación a través del eje Z está limitada."
@@ -9149,13 +9134,6 @@ msgid "The speed of all rotations across the axes."
msgstr "La velocidad de todas las rotaciones a través de los ejes."
msgid ""
-"The amount of rotational damping across the axes. The lower, the more "
-"dampening occurs."
-msgstr ""
-"La cantidad de amortiguación rotacional a través de los ejes. Cuanto más "
-"bajo, más amortiguación se produce."
-
-msgid ""
"The amount of rotational restitution across the axes. The lower, the more "
"restitution occurs."
msgstr ""
@@ -10130,7 +10108,7 @@ msgstr ""
"parciales a un recurso."
msgid "Represents the size of the [enum Method] enum."
-msgstr "Representa el tamaño del enum [enum Method]."
+msgstr "Representa el tamaño del enumerado [enum Method]."
msgid "Status: Disconnected from the server."
msgstr "Estado: Desconectado del servidor."
@@ -11897,8 +11875,8 @@ msgstr ""
msgid ""
"Invalid ID constant. Returned if [constant RESOLVER_MAX_QUERIES] is exceeded."
msgstr ""
-"Constante de identificación inválida. Devuelta si se supera la constant "
-"[constant RESOLVER_MAX_QUERIES]."
+"Identificador de constante inválida. Devuelta si se supera el valor de la "
+"constante RESOLVER_MAX_QUERIES"
msgid "Address type: None."
msgstr "Tipo de dirección: Ninguna."
@@ -13826,32 +13804,19 @@ msgid ""
"will not be visible in the scene tree, though it will be visible in the "
"2D/3D view."
msgstr ""
-"Añade un nodo infantil. Los nodos pueden tener cualquier número de niños, "
-"pero cada niño debe tener un nombre único. Los nodos hijos se eliminan "
-"automáticamente cuando se elimina el nodo padre, por lo que una escena "
-"entera puede ser eliminada eliminando su nodo superior.\n"
-"Si [code]legible_unique_name[/code] es [code]true[/code], el nodo hijo "
-"tendrá un nombre legible para los humanos basado en el nombre del nodo que "
-"se instale en lugar de su tipo.\n"
-"[b]Nota:[/b] Si el nodo hijo ya tiene un padre, la función fallará. Use "
-"[method remove_child] primero para eliminar el nodo de su padre actual. Por "
-"ejemplo:\n"
-"[codeblock]\n"
-"if child_node.get_parent():\n"
-" child_node.get_parent().remove_child(child_node)\n"
-"add_child(child_node)\n"
-"[/codeblock]\n"
-"Si necesita que el nodo hijo se añada debajo de un nodo específico en la "
-"lista de hijos, use [method add_sibling] en lugar de este método.\n"
-"[b]Nota:[/b] Si quieres que un hijo sea perseguido en un [PackedScene], "
-"debes establecer [member owner] además de llamar a [method add_child]. Esto "
-"es típicamente relevante para los scripts de la herramienta [url=https://"
-"godot.readthedocs.io/es/latest/tutorials/misc/running_code_in_the_editor."
-"html]tool[/url] y para los plugins de edición [/url] de [url=https://godot."
-"readthedocs.io/es/latest/tutorials/plugins/editor/index.html]. Si se llama a "
-"[method add_child] sin establecer [member owner], el [Node] recién agregado "
-"no será visible en el árbol de la escena, aunque sí lo será en la vista "
-"2D/3D."
+"El nodo propietario. Un nodo puede tener cualquier otro nodo como "
+"propietario (tanto como es un padre válido, abuelo, etc. ascendiendo en el "
+"árbol). Cuando se guarda un nodo utilizando PackedScene, todos los nodos que "
+"posee se guardarán con él. Esto permite la creación de complejos árboles de "
+"Escena, con instanciación y subinstanciación.\n"
+"[b]Nota:[/b] Si quieres que un hijo sea persistido a una PackedScene, debes "
+"establecer [member_owner] además de llamar al método add_child. Esto es "
+"típicamente relevante para [url=$DOCS_URL/tutorials/plugins/"
+"running_code_in_the_editor.html]tool scripts[/url] y [url=$DOCS_URL/"
+"tutorials/plugins/editor/index.html]editor plugins[/url]\n"
+"Si el método add_child es llamado sin configuración de miembro propietario, "
+"el nodo nuevo añadido no será visible en el árbol de escena, aunque será "
+"visible en la vista 2D/3D"
msgid ""
"The node's priority in the execution order of the enabled processing "
@@ -14410,24 +14375,6 @@ msgstr ""
"la depuración)."
msgid ""
-"Returns [code]true[/code] if the Godot binary used to run the project is a "
-"[i]debug[/i] export template, or when running in the editor.\n"
-"Returns [code]false[/code] if the Godot binary used to run the project is a "
-"[i]release[/i] export template.\n"
-"To check whether the Godot binary used to run the project is an export "
-"template (debug or release), use [code]OS.has_feature(\"standalone\")[/code] "
-"instead."
-msgstr ""
-"Devuelve [code]true[/code] si el binario Godot utilizado para ejecutar el "
-"proyecto es una plantilla de exportación [i]debug[/i], o cuando se ejecuta "
-"en el editor.\n"
-"Devuelve [code]false[/code] si el binario de Godot utilizado para ejecutar "
-"el proyecto es una plantilla de exportación [i]release[/i].\n"
-"Para comprobar si el binario Godot utilizado para ejecutar el proyecto es "
-"una plantilla de exportación (depuración o liberación), utiliza en su lugar "
-"[code]OS.has_feature(\"standalone\")[/code]."
-
-msgid ""
"At the moment this function is only used by [code]AudioDriverOpenSL[/code] "
"to request permission for [code]RECORD_AUDIO[/code] on Android."
msgstr ""
@@ -15638,23 +15585,6 @@ msgstr ""
"Constante para establecer/obtener si el vector de gravedad de un área es una "
"dirección, o un punto central."
-msgid ""
-"Constant to set/get the falloff factor for point gravity of an area. The "
-"greater this value is, the faster the strength of gravity decreases with the "
-"square of distance."
-msgstr ""
-"Constante para fijar/obtener el factor de caída para el punto de gravedad de "
-"un área. Cuanto mayor es este valor, más rápido disminuye la fuerza de "
-"gravedad con el cuadrado de la distancia."
-
-msgid ""
-"This constant was used to set/get the falloff factor for point gravity. It "
-"has been superseded by [constant AREA_PARAM_GRAVITY_DISTANCE_SCALE]."
-msgstr ""
-"Esta constante se usó para fijar/obtener el factor de caída para la gravedad "
-"puntual. Ha sido reemplazada por [constant "
-"AREA_PARAM_GRAVITY_DISTANCE_SCALE]."
-
msgid "Constant to set/get the priority (order of processing) of an area."
msgstr ""
"Constante para establecer/obtener la prioridad (orden de procesamiento) de "
@@ -15715,14 +15645,6 @@ msgid "Constant to set/get a body's gravity multiplier."
msgstr ""
"Constante para fijar/obtener el multiplicador de gravedad de un cuerpo."
-msgid "Constant to set/get a body's linear dampening factor."
-msgstr ""
-"Constante para fijar/obtener el factor de amortiguación lineal de un cuerpo."
-
-msgid "Constant to set/get a body's angular dampening factor."
-msgstr ""
-"Constante para fijar/obtener el factor de amortiguación angular de un cuerpo."
-
msgid "Represents the size of the [enum BodyParameter] enum."
msgstr "Representa el tamaño del enum [enum BodyParameter]."
@@ -17995,13 +17917,6 @@ msgstr ""
"ReflectionProbe.enable_shadows]."
msgid ""
-"Sets the size of the area that the reflection probe will capture. Equivalent "
-"to [member ReflectionProbe.extents]."
-msgstr ""
-"Establece el tamaño del área que la sonda de reflexión capturará. "
-"Equivalente a [member ReflectionProbe.extents]."
-
-msgid ""
"Sets the intensity of the reflection probe. Intensity modulates the strength "
"of the reflection. Equivalent to [member ReflectionProbe.intensity]."
msgstr ""
@@ -18108,12 +18023,6 @@ msgstr ""
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 ""
-"If [code]true[/code], rendering of a viewport's environment is disabled."
-msgstr ""
-"Si [code]true[/code], se desactiva la renderización del entorno de un "
-"viewport."
-
msgid "Sets the viewport's global transformation matrix."
msgstr "Establece la matriz de transformación global del Viewport."
@@ -18795,19 +18704,6 @@ msgstr ""
"install_effect]."
msgid ""
-"If [code]true[/code], the label's height will be automatically updated to "
-"fit its content.\n"
-"[b]Note:[/b] This property is used as a workaround to fix issues with "
-"[RichTextLabel] in [Container]s, but it's unreliable in some cases and will "
-"be removed in future versions."
-msgstr ""
-"Si [code]true[/code], la altura de la etiqueta se actualizará "
-"automáticamente para que se ajuste a su contenido.\n"
-"[b]Nota:[/b] Esta propiedad se utiliza como solución provisional para "
-"solucionar los problemas con [RichTextLabel] en los [Container]s, pero no es "
-"fiable en algunos casos y se eliminará en futuras versiones."
-
-msgid ""
"If [code]true[/code], the label underlines meta tags such as [code][url]"
"{text}[/url][/code]."
msgstr ""
@@ -20187,15 +20083,6 @@ msgstr ""
msgid "Modulates the color of the texture when this style box is drawn."
msgstr "Modula el color de la textura cuando se dibuja este cuadro de estilo."
-msgid ""
-"Species a sub-region of the texture to use.\n"
-"This is equivalent to first wrapping the texture in an [AtlasTexture] with "
-"the same region."
-msgstr ""
-"Especifica una sub-región de la textura a utilizar.\n"
-"Esto equivale a envolver primero la textura en un [AtlasTexture] con la "
-"misma región."
-
msgid "The texture to use when drawing this style box."
msgstr "La textura a usar al dibujar este cuadro de estilo."
@@ -20361,15 +20248,6 @@ msgid "Sets [Material] to be used by the [Mesh] you are constructing."
msgstr ""
"Establece [Material] para ser usado por la [Mesh] que estás construyendo."
-msgid ""
-"Specifies whether the current vertex (if using only vertex arrays) or "
-"current index (if also using index arrays) should use smooth normals for "
-"normal calculation."
-msgstr ""
-"Especifica si el vértice actual (si se utilizan sólo arrays de vértices) o "
-"el índice actual (si también se utilizan arrays de índices) debe utilizar "
-"normales suaves para el cálculo normal."
-
msgid "Adds a new tab."
msgstr "Añade una nueva pestaña."
@@ -20605,14 +20483,6 @@ msgid "Returns [code]true[/code] if an \"undo\" action is available."
msgstr ""
"Devuelve [code]true[/code] si se dispone de una acción de \"deshacer\"."
-msgid ""
-"Triggers a right-click menu action by the specified index. See [enum "
-"MenuItems] for a list of available indexes."
-msgstr ""
-"Desencadena una acción de menú con el botón derecho del ratón por el índice "
-"especificado. Véase [enum MenuItems] para una lista de los índices "
-"disponibles."
-
msgid "Perform redo operation."
msgstr "Realiza la operación de rehacer."
@@ -20718,11 +20588,6 @@ msgstr ""
msgid "Sets the [StyleBox] of this [TextEdit]."
msgstr "Establece el [StyleBox] de este [TextEdit]."
-msgid "Returns the font descent (number of pixels below the baseline)."
-msgstr ""
-"Devuelve el descenso de la fuente (número de píxeles por debajo de la línea "
-"de base)."
-
msgid "Disables font hinting (smoother but less crisp)."
msgstr "Desactiva la indicación de la fuente (más suave pero menos nítida)."
@@ -21440,23 +21305,10 @@ msgstr ""
"Se emite cuando se hace clic en una celda con la [constant TreeItem."
"CELL_MODE_CUSTOM] para ser editada."
-msgid "Emitted when an item's label is double-clicked."
-msgstr "Se emite cuando se hace doble clic en la etiqueta de un artículo."
-
msgid "Emitted when an item is collapsed by a click on the folding arrow."
msgstr ""
"Se emite cuando un objeto se colapsa por un clic en la flecha de plegado."
-msgid ""
-"Emitted when a custom button is pressed (i.e. in a [constant TreeItem."
-"CELL_MODE_CUSTOM] mode cell)."
-msgstr ""
-"Se emite cuando se pulsa un botón personalizado (es decir, en una celda de "
-"modo [constant TreeItem.CELL_MODE_CUSTOM])."
-
-msgid "Emitted when an item's icon is double-clicked."
-msgstr "Se emite cuando se hace doble clic en el icono de un elemento."
-
msgid "Emitted when an item is edited."
msgstr "Emitido cuando se edita un artículo."
@@ -22606,14 +22458,6 @@ msgstr "Se emite cuando termina la reproducción."
msgid "[VideoStream] resource for Ogg Theora videos."
msgstr "[VideoStream] recurso para los videos de Ogg Theora."
-msgid "Returns the Ogg Theora video file handled by this [VideoStreamTheora]."
-msgstr ""
-"Devuelve el archivo de vídeo de Ogg Theora manejado por este "
-"[VideoStreamTheora]."
-
-msgid "Returns the total transform of the viewport."
-msgstr "Devuelve la transformada total de la vista."
-
msgid "Returns the visible rectangle in global screen coordinates."
msgstr "Devuelve el RID del viewport del [VisualServer]."
@@ -22852,7 +22696,7 @@ msgid "A shader for light calculations."
msgstr "Un shader para cálculos de luz."
msgid "Represents the size of the [enum Type] enum."
-msgstr "Representa el tamaño del enum [enum Type]."
+msgstr "Representa el tamaño del enumerado [enum Type]."
msgid "Base class for nodes in a visual shader graph."
msgstr "Clase base para nodos en un gráfico de shader visual."
diff --git a/doc/translations/fr.po b/doc/translations/fr.po
index a634b2005b..eef490fe13 100644
--- a/doc/translations/fr.po
+++ b/doc/translations/fr.po
@@ -184,80 +184,6 @@ msgstr "Génération de nombres aléatoires"
msgid "Converts from decibels to linear energy (audio)."
msgstr "Convertit les décibels en énergie linéaire (audio)."
-msgid ""
-"Prints one or more arguments to strings in the best way possible to standard "
-"error line.\n"
-"[codeblock]\n"
-"printerr(\"prints to stderr\")\n"
-"[/codeblock]"
-msgstr ""
-"Affiche un ou plusieurs arguments pour les chaînes de caractères de la "
-"meilleure façon possible sur la ligne d'erreur.\n"
-"[codeblock]\n"
-"printerr(\"prints to stderr\")\n"
-"[/codeblock]"
-
-msgid ""
-"Prints one or more arguments to the console with a space between each "
-"argument.\n"
-"[codeblock]\n"
-"prints(\"A\", \"B\", \"C\") # Prints A B C\n"
-"[/codeblock]"
-msgstr ""
-"Affiche un ou plusieurs argument dans la console intercalé d'un espace.\n"
-"[codeblock]\n"
-"prints(\"A\", \"B\", \"C\") # Prints A B C\n"
-"[/codeblock]"
-
-msgid ""
-"Prints one or more arguments to the console with a tab between each "
-"argument.\n"
-"[codeblock]\n"
-"printt(\"A\", \"B\", \"C\") # Prints A B C\n"
-"[/codeblock]"
-msgstr ""
-"Affiche un ou plusieurs arguments dans la console intercalé de tabulations "
-"entre chaque.\n"
-"[codeblock]\n"
-"printt(\"A\", \"B\", \"C\") # Prints A B C\n"
-"[/codeblock]"
-
-msgid ""
-"Pushes a warning message to Godot's built-in debugger and to the OS "
-"terminal.\n"
-"[codeblock]\n"
-"push_warning(\"test warning\") # Prints \"test warning\" to debugger and "
-"terminal as warning call\n"
-"[/codeblock]"
-msgstr ""
-"Renvoie un message d'alerte dans le déboguer de Godot et dans le terminal de "
-"l'OS.\n"
-"[codeblock]\n"
-"push_warning(\"test warning\") # Prints \"test warning\" to debugger and "
-"terminal as warning call\n"
-"[/codeblock]"
-
-msgid ""
-"Returns a random unsigned 32-bit integer. Use remainder to obtain a random "
-"value in the interval [code][0, N - 1][/code] (where N is smaller than "
-"2^32).\n"
-"[codeblock]\n"
-"randi() # Returns random integer between 0 and 2^32 - 1\n"
-"randi() % 20 # Returns random integer between 0 and 19\n"
-"randi() % 100 # Returns random integer between 0 and 99\n"
-"randi() % 100 + 1 # Returns random integer between 1 and 100\n"
-"[/codeblock]"
-msgstr ""
-"Retourne un nombre entier positive aléatoire de 32 bits. Utilisez "
-"l'opérateur modulo pour obtenir une valeur aléatoire dans l'intervalle [code]"
-"[0, N - 1][/code] (où N est plus petit que 2^32).\n"
-"[codeblock]\n"
-"randi() # Retourne un nombre entier aléatoire entre 0 et 2^32 - 1\n"
-"randi() % 20 # Retourne un nombre entier aléatoire entre 0 et 19\n"
-"randi() % 100 # Retourne un nombre entier aléatoire entre 0 et 99\n"
-"randi() % 100 + 1 # Retourne un nombre entier aléatoire entre 1 et 100\n"
-"[/codeblock]"
-
msgid "The [AudioServer] singleton."
msgstr "Le singleton [AudioServer]."
@@ -1532,13 +1458,6 @@ msgstr "Animation Sprite 2D"
msgid "2D Dodge The Creeps Demo"
msgstr "Démo 2D « Dodge The Creeps »"
-msgid ""
-"The current animation from the [member frames] resource. If this value "
-"changes, the [code]frame[/code] counter is reset."
-msgstr ""
-"L'animation actuelle de la ressource [member frames]. Si cette valeur "
-"change, le compteur [code]frame[/code] est remis à zéro."
-
msgid "If [code]true[/code], texture will be centered."
msgstr "Si [code]true[/code], la texture sera centrée."
@@ -1548,8 +1467,8 @@ msgstr "Si [code]true[/code], la texture est inversée horizontalement."
msgid "If [code]true[/code], texture is flipped vertically."
msgstr "Si [code]vrai[/code], la texture est inversée verticalement."
-msgid "The displayed animation frame's index."
-msgstr "L'index de l'image d'animation affichée."
+msgid "The texture's drawing offset."
+msgstr "Le décalage du dessin de la texture."
msgid ""
"The [SpriteFrames] resource containing the animation(s). Allows you the "
@@ -1560,12 +1479,6 @@ msgstr ""
"charger, modifier, effacer, rendre unique et sauvegarder les états de la "
"ressource [SpriteFrames]."
-msgid "The texture's drawing offset."
-msgstr "Le décalage du dessin de la texture."
-
-msgid "Emitted when [member frame] changed."
-msgstr "Émis lorsque [member frame] modifié."
-
msgid ""
"2D sprite node in 3D world, that can use multiple 2D textures for animation."
msgstr ""
@@ -1575,16 +1488,6 @@ msgstr ""
msgid "2D Sprite animation (also applies to 3D)"
msgstr "L'animation des sprites 2D (et aussi 3D)"
-msgid ""
-"The current animation from the [code]frames[/code] resource. If this value "
-"changes, the [code]frame[/code] counter is reset."
-msgstr ""
-"L'animation actuelle de la ressource [code]frames[/code]. S'il y a un "
-"changement dans la valeur, le compteur [code]frame[/code] est remis à zéro."
-
-msgid "The [SpriteFrames] resource containing the animation(s)."
-msgstr "La ressource [SpriteFrames] qui contient l'animation."
-
msgid "Proxy texture for simple frame-based animations."
msgstr "Texture procuration pour des animations simples basés sur les trames."
@@ -1819,13 +1722,6 @@ msgstr ""
"[code]nom : nœud[/code]."
msgid ""
-"Adds an input to the node. This is only useful for nodes created for use in "
-"an [AnimationNodeBlendTree]."
-msgstr ""
-"Ajoute une entrée pour le nœud. Ceci est utile uniquement pour des nœuds "
-"crées pour l'usage dans un [AnimationNodeBlendTree]."
-
-msgid ""
"Blend another animation node (in case this node contains children animation "
"nodes). This function is only useful if you inherit from [AnimationRootNode] "
"instead, else editors will not display your node for addition."
@@ -1872,17 +1768,6 @@ msgstr ""
msgid "If [code]true[/code], filtering is enabled."
msgstr "Si [code]true[/code], le filtrage est activé."
-msgid ""
-"Emitted by nodes that inherit from this class and that have an internal tree "
-"when one of their nodes changes. The nodes that emit this signal are "
-"[AnimationNodeBlendSpace1D], [AnimationNodeBlendSpace2D], "
-"[AnimationNodeStateMachine], and [AnimationNodeBlendTree]."
-msgstr ""
-"Émis par les nœuds qui héritent de cette classe ayant un arbre interne quand "
-"un de leurs nœuds change. Les nœuds émettant ce signal sont des "
-"[AnimationNodeBlendSpace1D], [AnimationNodeBlendSpace2D], "
-"[AnimationNodeStateMachine], et [AnimationNodeBlendTree]."
-
msgid "Do not use filtering."
msgstr "Ne pas utiliser de filtrage."
@@ -2028,6 +1913,13 @@ msgid "Returns the number of points on the blend axis."
msgstr "Renvoie le nombre de points sur l'axe de mélange."
msgid ""
+"Controls the interpolation between animations. See [enum BlendMode] "
+"constants."
+msgstr ""
+"Contrôle l'interpolation entre animations. Voir les constantes [enum "
+"BlendMode]."
+
+msgid ""
"The blend space's axis's upper limit for the points' position. See [method "
"add_blend_point]."
msgstr ""
@@ -2047,6 +1939,23 @@ msgstr "Incrément de position (snap) quand un point est déplacé sur l'axe."
msgid "Label of the virtual axis of the blend space."
msgstr "Étiquette de l'axe virtuel de l'espace blend."
+msgid "The interpolation between animations is linear."
+msgstr "L'interpolation entre les animations est linéaire."
+
+msgid ""
+"The blend space plays the animation of the node the blending position is "
+"closest to. Useful for frame-by-frame 2D animations."
+msgstr ""
+"L'espace de mélange joue l'animation du nœud la position de mélange le plus "
+"proche. Utilisable pour les animations 2D trame par trame."
+
+msgid ""
+"Similar to [constant BLEND_MODE_DISCRETE], but starts the new animation at "
+"the last animation's playback position."
+msgstr ""
+"Semblable à [constant BLEND_MODE_DISCRETE], mais commence la nouvelle "
+"animation à la dernière position de lecture de l'animation suivante."
+
msgid ""
"Blends linearly between three [AnimationNode] of any type placed in a 2D "
"space."
@@ -2088,13 +1997,6 @@ msgstr ""
"add_blend_point] et [method remove_blend_point]."
msgid ""
-"Controls the interpolation between animations. See [enum BlendMode] "
-"constants."
-msgstr ""
-"Contrôle l'interpolation entre animations. Voir les constantes [enum "
-"BlendMode]."
-
-msgid ""
"The blend space's X and Y axes' upper limit for the points' position. See "
"[method add_blend_point]."
msgstr ""
@@ -2125,23 +2027,6 @@ msgstr ""
"Émis à chaque création, suppression de triangles ou changement de position "
"de l'un de leurs sommets dans le blend space."
-msgid "The interpolation between animations is linear."
-msgstr "L'interpolation entre les animations est linéaire."
-
-msgid ""
-"The blend space plays the animation of the node the blending position is "
-"closest to. Useful for frame-by-frame 2D animations."
-msgstr ""
-"L'espace de mélange joue l'animation du nœud la position de mélange le plus "
-"proche. Utilisable pour les animations 2D trame par trame."
-
-msgid ""
-"Similar to [constant BLEND_MODE_DISCRETE], but starts the new animation at "
-"the last animation's playback position."
-msgstr ""
-"Semblable à [constant BLEND_MODE_DISCRETE], mais commence la nouvelle "
-"animation à la dernière position de lecture de l'animation suivante."
-
msgid ""
"This node may contain a sub-tree of any other blend type nodes, such as "
"[AnimationNodeTransition], [AnimationNodeBlend2], [AnimationNodeBlend3], "
@@ -2376,20 +2261,6 @@ msgid "Clears all queued, unplayed animations."
msgstr "Efface toutes les animations en file d’attente et non joués."
msgid ""
-"Gets the actual playing speed of current animation or 0 if not playing. This "
-"speed is the [member playback_speed] property multiplied by "
-"[code]custom_speed[/code] argument specified when calling the [method play] "
-"method."
-msgstr ""
-"Retourne la vitesse réelle de lecture de l'animation actuelle ou 0 si n'est "
-"pas jouée. Cette vitesse est la propriété [member playback_speed] multipliée "
-"par l'argument [code]custom_speed[/code] spécifié lors de l'appel de la "
-"méthode [method play]."
-
-msgid "Returns [code]true[/code] if playing an animation."
-msgstr "Retourne [code]true[/code] lors de la lecture d'une animation."
-
-msgid ""
"Queues an animation for playback once the current one is done.\n"
"[b]Note:[/b] If a looped animation is currently playing, the queued "
"animation will never play unless the looped animation is stopped somehow."
@@ -3552,9 +3423,6 @@ msgstr ""
"Retourne le [AudioEffectInstance] assigné au bus et aux indices de l'effet "
"donnés (et le canal en option)."
-msgid "Returns the names of all audio devices detected on the system."
-msgstr "Retourne les noms de tous les appareils audio détectés sur le système."
-
msgid "Returns the sample rate at the output of the [AudioServer]."
msgstr "Retourne le débit de sortie du [AudioServer]."
@@ -3590,22 +3458,6 @@ msgstr ""
msgid "Number of available audio buses."
msgstr "Nombre de bus audio disponibles."
-msgid ""
-"Name of the current device for audio output (see [method get_device_list]). "
-"On systems with multiple audio outputs (such as analog, USB and HDMI audio), "
-"this can be used to select the audio output device. The value "
-"[code]\"Default\"[/code] will play audio on the system-wide default audio "
-"output. If an invalid device name is set, the value will be reverted back to "
-"[code]\"Default\"[/code]."
-msgstr ""
-"Le nom du périphérique actuel pour la sortie audio (voir [method "
-"get_device_list)]. Sur les systèmes avec plusieurs sorties audio (tels que "
-"l'analogique, l'USB et l'audio par HDMI), cela peut être utilisé pour "
-"sélectionner le périphérique de sortie de l'audio. La valeur "
-"[code]\"Default\"[/code] jouera l'audio sur la sortie audio par défaut au "
-"niveau du système. Si un nom de périphérique invalide est défini, la valeur "
-"[code]\"Default\"[/code] sera retournée."
-
msgid "Emitted when the [AudioBusLayout] changes."
msgstr "Émis lorsque le [AudioBusLayout] change."
@@ -3790,15 +3642,9 @@ msgstr ""
"une zone \"eau\" de sorte que les sons joués dans l'eau sont redirigés par "
"un bus audio pour les faire sonner comme ils étaient joués sous l'eau."
-msgid "Dampens audio over distance with this as an exponent."
-msgstr "Atténue l'audio avec la distance avec cette valeur comme exposant."
-
msgid "Maximum distance from which audio is still hearable."
msgstr "Distance maximale à laquelle cette piste audio peut être entendue."
-msgid "Base volume without dampening."
-msgstr "Volume de base sans amortissement."
-
msgid "Plays positional sound in 3D space."
msgstr "Joue un son localisé dans un espace 3D."
@@ -3809,16 +3655,6 @@ msgstr ""
"Retourne l'objet [AudioStreamPlayback] associé avec ce [AudioStreamPlayer3D]."
msgid ""
-"Dampens audio using a low-pass filter above this frequency, in Hz. To "
-"disable the dampening effect entirely, set this to [code]20500[/code] as "
-"this frequency is above the human hearing limit."
-msgstr ""
-"Amortit l'audio en utilisant un filtre passe-bas au-dessus de la fréquence "
-"spécifiée, en Hz. Pour désactiver entièrement l'effet d'amortissement, "
-"définissez la fréquence à [code]20500[/code] car cette fréquence est "
-"supérieure à la limite de l'audition humaine."
-
-msgid ""
"Decides if audio should get quieter with distance linearly, quadratically, "
"logarithmically, or not be affected by distance, effectively disabling "
"attenuation."
@@ -3834,16 +3670,6 @@ msgstr ""
"Si [code]true[/code], la lecture commence dès que le AudioStreamPlayer3D est "
"ajouté à la scène."
-msgid "The angle in which the audio reaches cameras undampened."
-msgstr "L'angle auquel la piste audio atteint les caméras sans atténuation."
-
-msgid ""
-"If [code]true[/code], the audio should be dampened according to the "
-"direction of the sound."
-msgstr ""
-"Si [code]true[/code], le piste audia devrait être atténuée par rapport à la "
-"direction du son."
-
msgid "Sets the absolute maximum of the soundlevel, in decibels."
msgstr "Définit le maximum absolu du niveau sonore, en décibels."
@@ -3864,20 +3690,6 @@ msgstr ""
"Le facteur pour l'effet d'atténuation. Des valeurs plus élevées rendent le "
"son audible sur une distance plus grande."
-msgid "The base sound level unaffected by dampening, in decibels."
-msgstr "Le niveau sonore de base non affecté par l'amortissement, en décibels."
-
-msgid "Linear dampening of loudness according to distance."
-msgstr "Atténuation linéaire de l'intensité sonore en fonction de la distance."
-
-msgid "Squared dampening of loudness according to distance."
-msgstr ""
-"Atténuation quadratique de l'intensité sonore en fonction de la distance."
-
-msgid "Logarithmic dampening of loudness according to distance."
-msgstr ""
-"Atténuation logarithmique de l'intensité sonore en fonction de la distance."
-
msgid "Disables doppler tracking."
msgstr "Désactive le suivi doppler."
@@ -6759,13 +6571,6 @@ msgstr ""
"le rôle de chacun."
msgid ""
-"The size of the node's bounding rectangle, in pixels. [Container] nodes "
-"update this property automatically."
-msgstr ""
-"La taille du rectangle englobant du nœud, en pixels. Les nœuds [Container] "
-"mettent à jour cette propriété automatiquement."
-
-msgid ""
"Tells the parent [Container] nodes how they should resize and place the node "
"on the X axis. Use one of the [enum SizeFlags] constants to change the "
"flags. See the constants to learn what each does."
@@ -13252,17 +13057,6 @@ msgstr ""
"déjà le propriétaire du mutex."
msgid ""
-"Tries locking this [Mutex], but does not block. Returns [constant OK] on "
-"success, [constant ERR_BUSY] otherwise.\n"
-"[b]Note:[/b] This function returns [constant OK] if the thread already has "
-"ownership of the mutex."
-msgstr ""
-"Essaie de verrouiller ce [Mutex], mais ne le bloque pas. Retourne [constant "
-"OK] en cas de succès, [constant ERR_BUSY] sinon.\n"
-"[b]Note :[/b] Cette fonction retourne [constant OK] si le fil d'exécution "
-"est déjà associé à ce mutex."
-
-msgid ""
"Unlocks this [Mutex], leaving it to other threads.\n"
"[b]Note:[/b] If a thread called [method lock] or [method try_lock] multiple "
"times while already having ownership of the mutex, it must also call [method "
@@ -13275,35 +13069,6 @@ msgstr ""
"déverrouiller correctement."
msgid ""
-"Returns this agent's current path from start to finish in global "
-"coordinates. The path only updates when the target location is changed or "
-"the agent requires a repath. The path array is not intended to be used in "
-"direct path movement as the agent has its own internal path logic that would "
-"get corrupted by changing the path array manually. Use the intended [method "
-"get_next_location] once every physics frame to receive the next path point "
-"for the agents movement as this function also updates the internal path "
-"logic."
-msgstr ""
-"Retourne le chemin actuel de l'agent du début jusqu'à la fin, dans les "
-"coordonnées globales. Le chemin ne met à jour que lorsque l'emplacement de "
-"la cible est modifié ou que l'agent demande un re-calcul du chemin. Le "
-"réseau de chemin n'est pas destiné à être utilisé dans le mouvement de "
-"chemin direct car l'agent a sa propre logique de chemin interne qui serait "
-"corrompu en changeant le réseau de chemin manuellement. Utilisez la [method "
-"get_next_location] voulue une fois chaque trame de physique pour recevoir le "
-"point de chemin suivant pour le mouvement des agents car cette fonction met "
-"également à jour la logique du chemin interne."
-
-msgid ""
-"Returns the reachable final location in global coordinates. This can change "
-"if the navigation path is altered in any way. Because of this, it would be "
-"best to check this each frame."
-msgstr ""
-"Retourne l'emplacement final accessible dans les coordonnées globales. Cela "
-"peut changer si le chemin de navigation est modifié de quelque manière que "
-"ce soit. Pour cette raison, il serait préférable de vérifier chaque trame."
-
-msgid ""
"Returns the [RID] of the navigation map for this NavigationAgent node. This "
"function returns always the map set on the NavigationAgent node and not the "
"map of the abstract agent on the NavigationServer. If the agent map is "
@@ -13322,20 +13087,6 @@ msgstr ""
"NavigationServer."
msgid ""
-"Returns the next location in global coordinates that can be moved to, making "
-"sure that there are no static objects in the way. If the agent does not have "
-"a navigation path, it will return the position of the agent's parent. The "
-"use of this function once every physics frame is required to update the "
-"internal path logic of the NavigationAgent."
-msgstr ""
-"Retourne l'emplacement suivant dans les coordonnées globales qui peuvent "
-"être déplacées, en s'assurant qu'il n'y a pas d'objets statiques dans le "
-"chemin. Si l'agent n'a pas de chemin de navigation, il retourne la position "
-"du parent de l'agent. L'utilisation de cette fonction une fois chaque trame "
-"physique est nécessaire pour mettre à jour la logique de chemin interne de "
-"la NavigationAgent."
-
-msgid ""
"Sets the [RID] of the navigation map this NavigationAgent node should use "
"and also updates the [code]agent[/code] on the NavigationServer."
msgstr ""
@@ -13380,15 +13131,6 @@ msgstr ""
"à jour de la trame physique."
msgid ""
-"The maximum distance the agent is allowed away from the ideal path to the "
-"final location. This can happen due to trying to avoid collisions. When the "
-"maximum distance is exceeded, it recalculates the ideal path."
-msgstr ""
-"La distance maximale de l'agent est permise loin du chemin idéal jusqu'à "
-"l'emplacement final. Cela peut arriver en essayant d'éviter les collisions. "
-"Lorsque la distance maximale est dépassée, cela recalcule le chemin idéal."
-
-msgid ""
"The distance threshold before the final target point is considered to be "
"reached. This will allow an agent to not have to hit the point of the final "
"target exactly, but only the area. If this value is set to low the "
@@ -13403,9 +13145,6 @@ msgstr ""
"chemin parce qu'il va constamment mal estimer la distance jusqu'au point "
"suivant à chaque mise à jour de la trame physique."
-msgid "Notifies when the final location is reached."
-msgstr "Notifie quand l'emplacement final est atteint."
-
msgid ""
"The NavigationAgent height offset is subtracted from the y-axis value of any "
"vector path position for this NavigationAgent. The NavigationAgent height "
@@ -15558,16 +15297,6 @@ msgstr ""
"La constante pour définir/obtenir le facteur de multiplication de la gravité "
"du corps."
-msgid "Constant to set/get a body's linear dampening factor."
-msgstr ""
-"La constante pour définir/obtenir la facteur d'amortissement linéaire du "
-"corps."
-
-msgid "Constant to set/get a body's angular dampening factor."
-msgstr ""
-"La constante pour définir/obtenir la facteur d'amortissement de rotation du "
-"corps."
-
msgid "Represents the size of the [enum BodyParameter] enum."
msgstr "Représente la taille de l'énumération [enum BodyParameter]."
@@ -17464,12 +17193,6 @@ 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 ""
-"If [code]true[/code], rendering of a viewport's environment is disabled."
-msgstr ""
-"Si [code]true[/code], le rendu de l'environnement de cette fenêtre "
-"d'affichage est désactivé."
-
msgid "Sets the viewport's global transformation matrix."
msgstr ""
"Définit la matrice de transformation globale de la fenêtre d'affichage."
@@ -18179,15 +17902,6 @@ msgstr "Position du deuxième point du segment."
msgid "A synchronization semaphore."
msgstr "Un sémaphore de synchronisation."
-msgid ""
-"Like [method wait], but won't block, so if the value is zero, fails "
-"immediately and returns [constant ERR_BUSY]. If non-zero, it returns "
-"[constant OK] to report success."
-msgstr ""
-"Comme [method wait], mais ne bloque pas, donc si la valeur est zéro, ça "
-"échoue immédiatement et retourne [constant ERR_BUSY]. Si non zéro, ça "
-"retourne [constant OK] pour signaler un succès."
-
msgid "The ray's length."
msgstr "La longueur du rayon."
@@ -19047,15 +18761,6 @@ msgid "Modulates the color of the texture when this style box is drawn."
msgstr ""
"Module la couleur de la texture lorsque cette boîte de style est dessinée."
-msgid ""
-"Species a sub-region of the texture to use.\n"
-"This is equivalent to first wrapping the texture in an [AtlasTexture] with "
-"the same region."
-msgstr ""
-"Spécifié la sous-région de la texture à utiliser.\n"
-"C'est l'équivalent à d'abord mettre la texture dans un [AtlasTexture] avec "
-"la même région."
-
msgid "The texture to use when drawing this style box."
msgstr "La texture à utiliser pour l'affichage de cette boite de style."
@@ -19202,16 +18907,6 @@ msgstr ""
"utilisée."
msgid ""
-"Specifies whether the current vertex (if using only vertex arrays) or "
-"current index (if also using index arrays) should use smooth normals for "
-"normal calculation."
-msgstr ""
-"Spécifie si les sommets actuels (uniquement si seulement des tableaux de "
-"sommets sont utilisés) ou l'index courant (si des tableaux d'index sont "
-"également utilisés) devraient utiliser des normales lisses dans le calcul "
-"des normales."
-
-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."
@@ -19503,13 +19198,6 @@ msgstr "Retourne [code]true[/code] si une action « refaire » est disponible."
msgid "Returns [code]true[/code] if an \"undo\" action is available."
msgstr "Retourne [code]true[/code] si une action « annuler » est disponible."
-msgid ""
-"Triggers a right-click menu action by the specified index. See [enum "
-"MenuItems] for a list of available indexes."
-msgstr ""
-"Déclenche une action de menu de clic droit par l’index spécifié. Voir [enum "
-"MenuItems] pour une liste d’index disponibles."
-
msgid "Perform redo operation."
msgstr "Effectue une opération refaire."
@@ -20182,16 +19870,10 @@ msgstr ""
"Émis quand une cellule en mode [constant TreeItem.CELL_MODE_CUSTOM] a été "
"cliquée pour modifiée."
-msgid "Emitted when an item's label is double-clicked."
-msgstr "Émis quand la label d'un élément est double-cliqué."
-
msgid "Emitted when an item is collapsed by a click on the folding arrow."
msgstr ""
"Émis quand un élément est réduit via un clic sur le flèche de réduction."
-msgid "Emitted when an item's icon is double-clicked."
-msgstr "Émis quand l'icône d'un élément est double-cliqué."
-
msgid "Emitted when an item is edited."
msgstr "Émis lors de la modification d’un élément."
@@ -21152,18 +20834,6 @@ msgstr "Émis lorsque la lecture est terminée."
msgid "[VideoStream] resource for Ogg Theora videos."
msgstr "Ressource [VideoStream] pour les vidéos Ogg Theora."
-msgid "Returns the Ogg Theora video file handled by this [VideoStreamTheora]."
-msgstr "Retourne le fichier vidéo Ogg Theora géré par ce [VideoStreamTheora]."
-
-msgid ""
-"Sets the Ogg Theora video file that this [VideoStreamTheora] resource "
-"handles. The [code]file[/code] name should have the [code].ogv[/code] "
-"extension."
-msgstr ""
-"Définit le fichier vidéo Ogg Theora que cette ressource [VideoStreamTheora] "
-"supporte. Le nom de fichier [code]file[/code] doit avoir l'extension [code]."
-"ogv[/code]."
-
msgid ""
"Returns the first valid [World2D] for this viewport, searching the [member "
"world_2d] property of itself and any Viewport ancestor."
@@ -21171,9 +20841,6 @@ msgstr ""
"Retourne le premier [World2D] valide de cette fenêtre d'affichage, en "
"cherchant dans sa propriété [member world] ainsi que celle de ses parents."
-msgid "Returns the total transform of the viewport."
-msgstr "Retourne la transformation totale de la fenêtre d'affichage."
-
msgid ""
"Returns the mouse's position in this [Viewport] using the coordinate system "
"of this [Viewport]."
@@ -21204,13 +20871,6 @@ 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 ""
-"Moves the mouse pointer to the specified position in this [Viewport] using "
-"the coordinate system of this [Viewport]."
-msgstr ""
-"Déplace le pointeur de la souris à la position spécifiée dans ce [Viewport] "
-"en utilisant le système de coordonnées de ce [Viewport]."
-
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 a93fabf919..d2d3354d48 100644
--- a/doc/translations/zh_CN.po
+++ b/doc/translations/zh_CN.po
@@ -60,11 +60,14 @@
# 烧风 <hk-shao@foxmail.com>, 2022.
# Yan Chen <cyan97087@gmail.com>, 2022.
# Caten <catenhu@gmail.com>, 2022.
+# 风é’å±± <idleman@yeah.net>, 2023.
+# zehuai wu <wuzehuai@gmail.com>, 2023.
+# matrixant <yuan545@hotmail.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-01-09 20:42+0000\n"
+"PO-Revision-Date: 2023-02-10 06:54+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"
@@ -73,7 +76,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.15.1-dev\n"
+"X-Generator: Weblate 4.16-dev\n"
msgid "Description"
msgstr "æè¿°"
@@ -84,9 +87,15 @@ msgstr "教程"
msgid "Properties"
msgstr "属性"
+msgid "Constructors"
+msgstr "构造函数"
+
msgid "Methods"
msgstr "方法"
+msgid "Operators"
+msgstr "æ“作符"
+
msgid "Theme Properties"
msgstr "主题属性"
@@ -102,9 +111,15 @@ msgstr "常é‡"
msgid "Property Descriptions"
msgstr "属性说明"
+msgid "Constructor Descriptions"
+msgstr "构造函数说明"
+
msgid "Method Descriptions"
msgstr "方法说明"
+msgid "Operator Descriptions"
+msgstr "æ“作符说明"
+
msgid "Theme Property Descriptions"
msgstr "主题属性说明"
@@ -159,88 +174,1059 @@ msgid "Built-in GDScript functions."
msgstr "内置 GDScript 函数。"
msgid ""
+"A list of GDScript-specific utility functions accessed in any script.\n"
+"For the list of the global functions and constants see [@GlobalScope]."
+msgstr ""
+"å¯åœ¨ä»»ä½•è„šæœ¬ä¸­è®¿é—®çš„,GDScript专用的实用函数的列表。\n"
+"有关全局函数和常é‡çš„列表,请å‚阅 [@GlobalScope]。"
+
+msgid "GDScript exports"
+msgstr "GDScript的导出"
+
+msgid ""
+"Returns a [Color] constructed from red ([param r8]), green ([param g8]), "
+"blue ([param b8]), and optionally alpha ([param a8]) integer channels, each "
+"divided by [code]255.0[/code] for their final value.\n"
+"[codeblock]\n"
+"var red = Color8(255, 0, 0) # Same as Color(1, 0, 0)\n"
+"var dark_blue = Color8(0, 0, 51) # Same as Color(0, 0, 0.2).\n"
+"var my_color = Color8(306, 255, 0, 102) # Same as Color(1.2, 1, 0, 0.4).\n"
+"[/codeblock]"
+msgstr ""
+"返回一个由红([param r8])ã€ç»¿ï¼ˆ[param g8])ã€è“([param b8])和å¯é€‰çš„阿尔法"
+"([param a8])整数通é“构造的 [Color],æ¯ä¸ªé€šé“除以 [code]255.0[/code],作为其"
+"最终值。\n"
+"[codeblock]\n"
+"var red = Color8(255, 0, 0) # 与 Color(1, 0, 0) 相åŒ\n"
+"var dark_blue = Color8(0, 0, 51) # 与 Color(0, 0, 0.2) 相åŒã€‚\n"
+"var my_color = Color8(306, 255, 0, 102) # 与 Color(1.2, 1, 0, 0.4) 相åŒã€‚\n"
+"[/codeblock]"
+
+msgid ""
+"Asserts that the [param condition] is [code]true[/code]. If the [param "
+"condition] is [code]false[/code], an error is generated. When running from "
+"the editor, the running project will also be paused until you resume it. "
+"This can be used as a stronger form of [method @GlobalScope.push_error] for "
+"reporting errors to project developers or add-on users.\n"
+"An optional [param message] can be shown in addition to the generic "
+"\"Assertion failed\" message. You can use this to provide additional details "
+"about why the assertion failed.\n"
+"[b]Warning:[/b] For performance reasons, the code inside [method assert] is "
+"only executed in debug builds or when running the project from the editor. "
+"Don't include code that has side effects in an [method assert] call. "
+"Otherwise, the project will behave differently when exported in release "
+"mode.\n"
+"[codeblock]\n"
+"# Imagine we always want speed to be between 0 and 20.\n"
+"var speed = -10\n"
+"assert(speed < 20) # True, the program will continue\n"
+"assert(speed >= 0) # False, the program will stop\n"
+"assert(speed >= 0 and speed < 20) # You can also combine the two conditional "
+"statements in one check\n"
+"assert(speed < 20, \"the speed limit is 20\") # Show a message\n"
+"[/codeblock]"
+msgstr ""
+"断言æ¡ä»¶ [param condition] 为 [code]true[/code]。如果æ¡ä»¶ [param condition] "
+"为 [code]false[/code] ,则会生æˆä¸€ä¸ªé”™è¯¯ã€‚如果是从编辑器è¿è¡Œçš„,正在è¿è¡Œçš„项"
+"目还会被暂åœï¼Œç›´åˆ°æ‰‹åŠ¨æ¢å¤ã€‚该函数å¯ä»¥ä½œä¸º [method @GlobalScope.push_error] "
+"的加强版,用于å‘项目开å‘者或æ’件用户报错。\n"
+"如果给出了å¯é€‰çš„ [param message] å‚数,在通用的“Assertion failedâ€æ¶ˆæ¯ä¹‹å¤–,还"
+"会显示该信æ¯ã€‚ä½ å¯ä»¥ä½¿ç”¨å®ƒæ¥æ供关于断言失败原因的其他详细信æ¯ã€‚\n"
+"[b]注æ„:[/b]出于对性能的考虑,[method assert] 中的代ç åªä¼šåœ¨è°ƒè¯•ç‰ˆæœ¬æˆ–者从编"
+"辑器è¿è¡Œé¡¹ç›®æ—¶æ‰§è¡Œã€‚所以ä¸è¦åœ¨ [method assert] 调用中加入具有副作用的代ç ã€‚å¦"
+"则,项目在以å‘行模å¼å¯¼å‡ºåŽå°†æœ‰ä¸ä¸€è‡´çš„行为。\n"
+"[codeblock]\n"
+"# 比如说我们希望 speed 始终在 0 和 20 之间。\n"
+"speed = -10\n"
+"assert(speed < 20) # True,程åºä¼šç»§ç»­æ‰§è¡Œ\n"
+"assert(speed >= 0) # False,程åºä¼šåœæ­¢\n"
+"assert(speed >= 0 && speed < 20) # 你还å¯ä»¥åœ¨å•æ¬¡æ–­è¨€ä¸­åˆå¹¶ä¸¤ä¸ªæ¡ä»¶è¯­å¥\n"
+"assert(speed < 20, \"speed = %f, but the speed limit is 20\" % speed) # 在消"
+"æ¯ä¸­æ˜¾ç¤ºè¯¦æƒ…\n"
+"[/codeblock]"
+
+msgid ""
+"Returns a single character (as a [String]) of the given Unicode code point "
+"(which is compatible with ASCII code).\n"
+"[codeblock]\n"
+"a = char(65) # a is \"A\"\n"
+"a = char(65 + 32) # a is \"a\"\n"
+"a = char(8364) # a is \"€\"\n"
+"[/codeblock]"
+msgstr ""
+"返回给定的 Unicode ç ä½ï¼ˆä¸ŽASCIIç å…¼å®¹ï¼‰çš„å•å­—符字符串(作为一个"
+"[String])。\n"
+"[codeblock]\n"
+"a = char(65) # a 是“Aâ€\n"
+"a = char(65 + 32) # a 是“aâ€\n"
+"a = char(8364) # a 是“€â€\n"
+"[/codeblock]"
+
+msgid ""
+"Converts [param what] to [param type] in the best way possible. The [param "
+"type] uses the [enum Variant.Type] values.\n"
+"[codeblock]\n"
+"var a = [4, 2.5, 1.2]\n"
+"print(a is Array) # Prints true\n"
+"\n"
+"var b = convert(a, TYPE_PACKED_BYTE_ARRAY)\n"
+"print(b) # Prints [4, 2, 1]\n"
+"print(b is Array) # Prints false\n"
+"[/codeblock]"
+msgstr ""
+"å°½å¯èƒ½ä»¥æœ€ä½³æ–¹å¼å°† [param what] 转æ¢ä¸º [param type]。[param type] 使用 [enum "
+"Variant.Type] 值。\n"
+"[codeblock]\n"
+"var a = [4, 2.5, 1.2]\n"
+"print(a is Array) # 输出 true\n"
+"\n"
+"var b = convert(a, TYPE_PACKED_BYTE_ARRAY)\n"
+"print(b) # 输出 [4, 2, 1]\n"
+"print(b is Array) # 输出 false\n"
+"[/codeblock]"
+
+msgid ""
+"Converts a [param dictionary] (created with [method inst_to_dict]) back to "
+"an Object instance. Can be useful for deserializing."
+msgstr ""
+"将一个 [param dictionary] (用 [method inst_to_dict] 创建的)转æ¢å›žä¸ºä¸€ä¸ª "
+"Object 实例。在ååºåˆ—化时å¯èƒ½å¾ˆæœ‰ç”¨ã€‚"
+
+msgid ""
+"Returns an array of dictionaries representing the current call stack. See "
+"also [method print_stack].\n"
+"[codeblock]\n"
+"func _ready():\n"
+" foo()\n"
+"\n"
+"func foo():\n"
+" bar()\n"
+"\n"
+"func bar():\n"
+" print(get_stack())\n"
+"[/codeblock]\n"
+"Starting from [code]_ready()[/code], [code]bar()[/code] would print:\n"
+"[codeblock]\n"
+"[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, "
+"source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n"
+"[/codeblock]\n"
+"[b]Note:[/b] This function only works if the running instance is connected "
+"to a debugging server (i.e. an editor instance). [method get_stack] will not "
+"work in projects exported in release mode, or in projects exported in debug "
+"mode if not connected to a debugging server.\n"
+"[b]Note:[/b] Calling this function from a [Thread] is not supported. Doing "
+"so will return an empty array."
+msgstr ""
+"返回一个表示当å‰è°ƒç”¨å †æ ˆçš„字典数组。å¦è¯·å‚阅 [method print_stack]。\n"
+"[codeblock]\n"
+"func _ready():\n"
+" foo()\n"
+"\n"
+"func foo():\n"
+" bar()\n"
+"\n"
+"func bar():\n"
+" print(get_stack())\n"
+"[/codeblock]\n"
+"从 [code]_ready()[/code] 开始,[code]bar()[/code] 将打å°ï¼š\n"
+"[codeblock]\n"
+"[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, "
+"source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n"
+"[/codeblock]\n"
+"[b]注æ„:[/b]åªæœ‰åœ¨è¿è¡Œçš„实例连接到调试æœåŠ¡å™¨ï¼ˆå³ç¼–辑器实例)åŽï¼Œè¯¥å‡½æ•°æ‰æœ‰"
+"效。[method get_stack] ä¸é€‚用于以å‘布模å¼å¯¼å‡ºçš„项目;或者在未连接到调试æœåŠ¡å™¨"
+"的情况下,以调试模å¼å¯¼å‡ºçš„项目。\n"
+"[b]注æ„:[/b]ä¸æ”¯æŒä»Ž [Thread] 调用此函数。这样åšå°†è¿”回一个空数组。"
+
+msgid ""
+"Returns the passed [param instance] converted to a Dictionary. Can be useful "
+"for serializing.\n"
+"[b]Note:[/b] Cannot be used to serialize objects with built-in scripts "
+"attached or objects allocated within built-in scripts.\n"
+"[codeblock]\n"
+"var foo = \"bar\"\n"
+"func _ready():\n"
+" var d = inst_to_dict(self)\n"
+" print(d.keys())\n"
+" print(d.values())\n"
+"[/codeblock]\n"
+"Prints out:\n"
+"[codeblock]\n"
+"[@subpath, @path, foo]\n"
+"[, res://test.gd, bar]\n"
+"[/codeblock]"
+msgstr ""
+"返回传入的 [param instance] 转æ¢ä¸ºçš„字典。å¯ç”¨äºŽåºåˆ—化。\n"
+"[b]注æ„:[/b]ä¸èƒ½ç”¨äºŽåºåˆ—化附加了内置脚本的对象,或在内置脚本中分é…的对象。\n"
+"[codeblock]\n"
+"var foo = \"bar\"\n"
+"func _ready():\n"
+" var d = inst_to_dict(self)\n"
+" print(d.keys())\n"
+" print(d.values())\n"
+"[/codeblock]\n"
+"输出:\n"
+"[codeblock]\n"
+"[@subpath, @path, foo]\n"
+"[, res://test.gd, bar]\n"
+"[/codeblock]"
+
+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 "
+"generated and execution is stopped.\n"
+"[codeblock]\n"
+"a = [1, 2, 3, 4]\n"
+"len(a) # Returns 4\n"
+"\n"
+"b = \"Hello!\"\n"
+"len(b) # Returns 6\n"
+"[/codeblock]"
+msgstr ""
+"返回给定 Variant [param var] 的长度。长度å¯ä»¥æ˜¯ [String] 的字符数ã€ä»»æ„数组类"
+"型的元素数ã€æˆ– [Dictionary] 的大å°ç­‰ã€‚对于所有其他 Variant 类型,都会生æˆè¿è¡Œ"
+"时错误并åœæ­¢æ‰§è¡Œã€‚\n"
+"[codeblock]\n"
+"a = [1, 2, 3, 4]\n"
+"len(a) # 返回 4\n"
+"\n"
+"b = \"Hello!\"\n"
+"len(b) # 返回 6\n"
+"[/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 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 "
+"requires [param path] to be a constant [String]. If you want to load a "
+"resource from a dynamic/variable path, use [method load].\n"
+"[b]Note:[/b] Resource paths can be obtained by right clicking on a resource "
+"in the Assets Panel and choosing \"Copy Path\" or by dragging the file from "
+"the FileSystem dock into the script.\n"
+"[codeblock]\n"
+"# Create instance of a scene.\n"
+"var diamond = preload(\"res://diamond.tscn\").instantiate()\n"
+"[/codeblock]"
+msgstr ""
+"从ä½äºŽ [param path] 的文件系统中返回一个 [Resource]。在è¿è¡Œæ—¶æœŸé—´ï¼Œè¯¥èµ„æºå°†åœ¨"
+"解æžè„šæœ¬æ—¶åŠ è½½ã€‚实际å¯ä»¥å°†è¿™ä¸ªå‡½æ•°è§†ä½œå¯¹è¯¥èµ„æºçš„引用。请注æ„,此函数è¦æ±‚ "
+"[param path] ä¸ºå¸¸é‡ [String]。如果è¦ä»ŽåŠ¨æ€/å¯å˜è·¯å¾„加载资æºï¼Œè¯·ä½¿ç”¨ [method "
+"load]。\n"
+"[b]注æ„:[/b]资æºè·¯å¾„å¯ä»¥é€šè¿‡å³é”®å•å‡»èµ„产é¢æ¿ä¸­çš„资æºå¹¶é€‰æ‹©â€œå¤åˆ¶è·¯å¾„â€ï¼Œæˆ–通过"
+"将文件从文件系统åœé é¢æ¿æ‹–到脚本中æ¥èŽ·å¾—。\n"
+"[codeblock]\n"
+"# 创建场景的实例。\n"
+"var diamond = preload(\"res://diamond.tscn\").instantiate()\n"
+"[/codeblock]"
+
+msgid ""
+"Like [method @GlobalScope.print], but includes the current stack frame when "
+"running with the debugger turned on.\n"
+"The output in the console may look like the following:\n"
+"[codeblock]\n"
+"Test print\n"
+"At: res://test.gd:15:_process()\n"
+"[/codeblock]\n"
+"[b]Note:[/b] Calling this function from a [Thread] is not supported. Doing "
+"so will instead print the thread ID."
+msgstr ""
+"与 [method @GlobalScope.print] 类似,但在打开调试器è¿è¡Œæ—¶è¿˜ä¼šåŒ…å«å½“å‰æ ˆå¸§ã€‚\n"
+"控制å°ä¸­çš„输出应该是类似这样的:\n"
+"[codeblock]\n"
+"Test print\n"
+"At: res://test.gd:15:_process()\n"
+"[/codeblock]\n"
+"[b]注æ„:[/b]ä¸æ”¯æŒä»Ž [Thread] 中调用此方法。调用时会输出线程 ID。"
+
+msgid ""
+"Prints a stack trace at the current code location. See also [method "
+"get_stack].\n"
+"The output in the console may look like the following:\n"
+"[codeblock]\n"
+"Frame 0 - res://test.gd:16 in function '_process'\n"
+"[/codeblock]\n"
+"[b]Note:[/b] This function only works if the running instance is connected "
+"to a debugging server (i.e. an editor instance). [method print_stack] will "
+"not work in projects exported in release mode, or in projects exported in "
+"debug mode if not connected to a debugging server.\n"
+"[b]Note:[/b] Calling this function from a [Thread] is not supported. Doing "
+"so will instead print the thread ID."
+msgstr ""
+"输出当å‰ä»£ç ä½ç½®çš„栈追踪。å¦è¯·å‚阅 [method get_stack]。\n"
+"控制å°ä¸­çš„输出是类似这样的:\n"
+"[codeblock]\n"
+"Frame 0 - res://test.gd:16 in function '_process'\n"
+"[/codeblock]\n"
+"[b]注æ„:[/b]åªæœ‰åœ¨è¿è¡Œçš„实例连接到调试æœåŠ¡å™¨ï¼ˆå³ç¼–辑器实例)åŽï¼Œè¯¥å‡½æ•°æ‰æœ‰"
+"效。[method print_stack] ä¸é€‚用于以å‘布模å¼å¯¼å‡ºçš„项目;或者在未连接到调试æœåŠ¡"
+"器的情况下,以调试模å¼å¯¼å‡ºçš„项目。\n"
+"[b]注æ„:[/b]ä¸æ”¯æŒä»Ž [Thread] 调用此函数。这样åšå°†æ”¹ä¸ºæ‰“å°çº¿ç¨‹ ID。"
+
+msgid ""
+"Returns an array with the given range. [method range] can be called in three "
+"ways:\n"
+"[code]range(n: int)[/code]: Starts from 0, increases by steps of 1, and "
+"stops [i]before[/i] [code]n[/code]. The argument [code]n[/code] is "
+"[b]exclusive[/b].\n"
+"[code]range(b: int, n: int)[/code]: Starts from [code]b[/code], increases by "
+"steps of 1, and stops [i]before[/i] [code]n[/code]. The arguments [code]b[/"
+"code] and [code]n[/code] are [b]inclusive[/b] and [b]exclusive[/b], "
+"respectively.\n"
+"[code]range(b: int, n: int, s: int)[/code]: Starts from [code]b[/code], "
+"increases/decreases by steps of [code]s[/code], and stops [i]before[/i] "
+"[code]n[/code]. The arguments [code]b[/code] and [code]n[/code] are "
+"[b]inclusive[/b] and [b]exclusive[/b], respectively. The argument [code]s[/"
+"code] [b]can[/b] be negative, but not [code]0[/code]. If [code]s[/code] is "
+"[code]0[/code], an error message is printed.\n"
+"[method range] converts all arguments to [int] before processing.\n"
+"[b]Note:[/b] Returns an empty array if no value meets the value constraint "
+"(e.g. [code]range(2, 5, -1)[/code] or [code]range(5, 5, 1)[/code]).\n"
+"Examples:\n"
+"[codeblock]\n"
+"print(range(4)) # Prints [0, 1, 2, 3]\n"
+"print(range(2, 5)) # Prints [2, 3, 4]\n"
+"print(range(0, 6, 2)) # Prints [0, 2, 4]\n"
+"print(range(4, 1, -1)) # Prints [4, 3, 2]\n"
+"[/codeblock]\n"
+"To iterate over an [Array] backwards, use:\n"
+"[codeblock]\n"
+"var array = [3, 6, 9]\n"
+"for i in range(array.size(), 0, -1):\n"
+" print(array[i - 1])\n"
+"[/codeblock]\n"
+"Output:\n"
+"[codeblock]\n"
+"9\n"
+"6\n"
+"3\n"
+"[/codeblock]\n"
+"To iterate over [float], convert them in the loop.\n"
+"[codeblock]\n"
+"for i in range (3, 0, -1):\n"
+" print(i / 10.0)\n"
+"[/codeblock]\n"
+"Output:\n"
+"[codeblock]\n"
+"0.3\n"
+"0.2\n"
+"0.1\n"
+"[/codeblock]"
+msgstr ""
+"返回给定范围的数组。[method range] 的调用方法有三ç§ï¼š\n"
+"[code]range(n: int)[/code]:从 0 开始,æ¯æ¬¡åŠ  1,在到达 [code]n[/code] [i]之"
+"å‰[/i]åœæ­¢ã€‚[b]ä¸åŒ…å«[/b]å‚æ•° [code]n[/code]。\n"
+"[code]range(b: int, n: int)[/code]:从 [code]b[/code] 开始,æ¯æ¬¡åŠ  1,在到达 "
+"[code]n[/code] [i]之å‰[/i]åœæ­¢ã€‚[b]包å«[/b]å‚æ•° [code]b[/code],[b]ä¸åŒ…å«[/b]"
+"å‚æ•° [code]n[/code]。\n"
+"[code]range(b: int, n: int, s: int)[/code]:从 [code]b[/code] 开始,æ¯æ¬¡åŠ  "
+"[code]s[/code],在到达 [code]n[/code] [i]之å‰[/i]åœæ­¢ã€‚[b]包å«[/b]å‚æ•° "
+"[code]b[/code],[b]ä¸åŒ…å«[/b]å‚æ•° [code]n[/code]。å‚æ•° [code]s[/code] [b]å¯"
+"以[/b]为负数,但ä¸èƒ½ä¸º [code]0[/code]。如果 [code]s[/code] 为 [code]0[/"
+"code],会输出一æ¡é”™è¯¯ã€‚\n"
+"[method range] 会先将所有å‚数转æ¢ä¸º [int] å†è¿›è¡Œå¤„ç†ã€‚\n"
+"[b]注æ„:[/b]如果ä¸å­˜åœ¨æ»¡è¶³æ¡ä»¶çš„值,则返回空数组(例如 [code]range(2, 5, -1)"
+"[/code] 和 [code]range(5, 5, 1)[/code])。\n"
+"示例:\n"
+"[codeblock]\n"
+"print(range(4)) # 输出 [0, 1, 2, 3]\n"
+"print(range(2, 5)) # 输出 [2, 3, 4]\n"
+"print(range(0, 6, 2)) # 输出 [0, 2, 4]\n"
+"print(range(4, 1, -1)) # 输出 [4, 3, 2]\n"
+"[/codeblock]\n"
+"åå‘é历 [Array] 请使用:\n"
+"[codeblock]\n"
+"var array = [3, 6, 9]\n"
+"for i in range(array.size(), 0, -1):\n"
+" print(array[i - 1])\n"
+"[/codeblock]\n"
+"输出:\n"
+"[codeblock]\n"
+"9\n"
+"6\n"
+"3\n"
+"[/codeblock]\n"
+"è¦é历 [float],请在循环中转æ¢å®ƒä»¬ã€‚\n"
+"[codeblock]\n"
+"for i in range (3, 0, -1):\n"
+" print(i / 10.0)\n"
+"[/codeblock]\n"
+"输出:\n"
+"[codeblock]\n"
+"0.3\n"
+"0.2\n"
+"0.1\n"
+"[/codeblock]"
+
+msgid ""
+"Returns [code]true[/code] if the given [Object]-derived class exists in "
+"[ClassDB]. Note that [Variant] data types are not registered in [ClassDB].\n"
+"[codeblock]\n"
+"type_exists(\"Sprite2D\") # Returns true\n"
+"type_exists(\"NonExistentClass\") # Returns false\n"
+"[/codeblock]"
+msgstr ""
+"如果 [ClassDB] 中存在给定的 [Object] 派生类,则返回 [code]true[/code]。请注"
+"æ„,[Variant] æ•°æ®ç±»åž‹æœªåœ¨ [ClassDB] 中注册。\n"
+"[codeblock]\n"
+"type_exists(\"Sprite2D\") # 返回 true\n"
+"type_exists(\"NonExistentClass\") # 返回 false\n"
+"[/codeblock]"
+
+msgid ""
+"Constant that represents how many times the diameter of a circle fits around "
+"its perimeter. This is equivalent to [code]TAU / 2[/code], or 180 degrees in "
+"rotations."
+msgstr ""
+"常é‡ï¼Œè¡¨ç¤ºåœ†çš„周长是直径的多少å€ã€‚相当于 [code]TAU / 2[/code],或以弧度表示的"
+"180度。"
+
+msgid ""
"The circle constant, the circumference of the unit circle in radians. This "
"is equivalent to [code]PI * 2[/code], or 360 degrees in rotations."
msgstr ""
-"圆常é‡ï¼Œå•ä½åœ†çš„周长,å•ä½ä¸ºå¼§åº¦ã€‚相当于 [code]PI * 2[/code]ï¼Œå³ 360 度的旋转"
+"圆常é‡ï¼Œå•ä½åœ†çš„周长,å•ä½ä¸ºå¼§åº¦ã€‚相当于 [code]PI * 2[/code]ï¼Œå³ 360 度的弧度"
"值。"
+msgid ""
+"Positive floating-point infinity. This is the result of floating-point "
+"division when the divisor is [code]0.0[/code]. For negative infinity, use "
+"[code]-INF[/code]. Dividing by [code]-0.0[/code] will result in negative "
+"infinity if the numerator is positive, so dividing by [code]0.0[/code] is "
+"not the same as dividing by [code]-0.0[/code] (despite [code]0.0 == -0.0[/"
+"code] returning [code]true[/code]).\n"
+"[b]Warning:[/b] Numeric infinity is only a concept with floating-point "
+"numbers, and has no equivalent for integers. Dividing an integer number by "
+"[code]0[/code] will not result in [constant INF] and will result in a run-"
+"time error instead."
+msgstr ""
+"正浮点无穷大。这是除数为 [code]0.0[/code] 时浮点除法的结果。对于负无穷大,使"
+"用 [code]-INF[/code]。如果分å­ä¸ºæ­£ï¼Œé™¤ä»¥ [code]-0.0[/code] 将导致负无穷大,因"
+"此除以 [code]0.0[/code] 与除以 [code]-0.0[/code] ä¸åŒï¼ˆå°½ç®¡ [code]0.0 == "
+"-0.0[/code] 返回 [code]true[/code])。\n"
+"[b]警告:[/b]数值无穷大åªæ˜¯æµ®ç‚¹æ•°çš„一个概念,对于整数æ¥è¯´æ²¡æœ‰å¯¹åº”的概念。将整"
+"数除以 [code]0[/code] ä¸ä¼šäº§ç”Ÿ [constant INF],而是会产生一个è¿è¡Œæ—¶é”™è¯¯ã€‚"
+
+msgid ""
+"\"Not a Number\", an invalid floating-point value. [constant NAN] has "
+"special properties, including that it is not equal to itself ([code]NAN == "
+"NAN[/code] returns [code]false[/code]). It is output by some invalid "
+"operations, such as dividing floating-point [code]0.0[/code] by [code]0.0[/"
+"code].\n"
+"[b]Warning:[/b] \"Not a Number\" is only a concept with floating-point "
+"numbers, and has no equivalent for integers. Dividing an integer [code]0[/"
+"code] by [code]0[/code] will not result in [constant NAN] and will result in "
+"a run-time error instead."
+msgstr ""
+"“Not a Numberâ€ï¼ˆä¸æ˜¯ä¸€ä¸ªæ•°ï¼‰ï¼Œä¸€ä¸ªæ— æ•ˆçš„浮点数值。[constant NAN] 有许多特殊的"
+"性质,包括它ä¸ç­‰äºŽè‡ªèº«ï¼ˆ[code]NAN == NAN[/code] 返回 [code]false[/code])。它"
+"是由一些无效è¿ç®—输出的,例如将浮点数 [code]0.0[/code] 除以 [code]0.0[/"
+"code]。\n"
+"[b]警告:[/b]“ä¸æ˜¯ä¸€ä¸ªæ•°â€åªæ˜¯æµ®ç‚¹æ•°çš„概念,整数中没有对应的概念。将整数 "
+"[code]0[/code] 除以 [code]0[/code] ä¸ä¼šäº§ç”Ÿ [constant NAN],而是会产生一个è¿"
+"行时错误。"
+
+msgid ""
+"Mark the following property as exported (editable in the Inspector dock and "
+"saved to disk). To control the type of the exported property use the type "
+"hint notation.\n"
+"[codeblock]\n"
+"@export var int_number = 5\n"
+"@export var float_number: float = 5\n"
+"[/codeblock]"
+msgstr ""
+"将以下属性标记为已导出(å¯åœ¨ Inspector Dock 中编辑并ä¿å­˜åˆ°ç£ç›˜ï¼‰ã€‚è¦æŽ§åˆ¶å¯¼å‡º"
+"属性的类型,请使用类型æ示表示法。\n"
+"[codeblock]\n"
+"@export var int_number = 5\n"
+"@export var float_number: float = 5\n"
+"[/codeblock]"
+
+msgid ""
+"Define a new category for the following exported properties. This helps to "
+"organize properties in the Inspector dock.\n"
+"See also [constant PROPERTY_USAGE_CATEGORY].\n"
+"[codeblock]\n"
+"@export_category(\"My Properties\")\n"
+"@export var number = 3\n"
+"@export var string = \"\"\n"
+"[/codeblock]\n"
+"[b]Note:[/b] Categories in the property list are supposed to indicate "
+"different base types, so the use of this annotation is not encouraged. See "
+"[annotation @export_group] and [annotation @export_subgroup] instead."
+msgstr ""
+"为以下导出的属性定义一个新类别。这有助于在检查器åœé æ ä¸­ç»„织属性。\n"
+"å¦è¯·å‚è§ [constant PROPERTY_USAGE_CATEGORY]。\n"
+"[codeblock]\n"
+"@export_category(\"My Properties\")\n"
+"@export var number = 3\n"
+"@export var string = \"\"\n"
+"[/codeblock]\n"
+"[b]注æ„:[/b]属性列表中的类别应该指示ä¸åŒçš„基本类型,因此ä¸é¼“励使用此注解。请"
+"å‚阅 [annotation @export_group] å’Œ [annotation @export_subgroup]。"
+
+msgid ""
+"Export a [Color] property without transparency (its alpha fixed as "
+"[code]1.0[/code]).\n"
+"See also [constant PROPERTY_HINT_COLOR_NO_ALPHA].\n"
+"[codeblock]\n"
+"@export_color_no_alpha var modulate_color: Color\n"
+"[/codeblock]"
+msgstr ""
+"导出一个没有é€æ˜Žåº¦çš„ [Color] 属性(它的 alpha 固定为 [code]1.0[/code])。\n"
+"å¦è§ [constant PROPERTY_HINT_COLOR_NO_ALPHA]。\n"
+"[codeblock]\n"
+"@export_color_no_alpha var modulate_color: Color\n"
+"[/codeblock]"
+
+msgid ""
+"Export a [String] property as a path to a directory. The path will be "
+"limited to the project folder and its subfolders. See [annotation "
+"@export_global_dir] to allow picking from the entire filesystem.\n"
+"See also [constant PROPERTY_HINT_DIR].\n"
+"[codeblock]\n"
+"@export_dir var sprite_folder: String\n"
+"[/codeblock]"
+msgstr ""
+"å°† [String] 属性作为目录路径导出。该路径将被é™åˆ¶åœ¨é¡¹ç›®æ–‡ä»¶å¤¹åŠå…¶å­æ–‡ä»¶å¤¹ä¸­ã€‚"
+"请å‚阅 [annotation @export_global_dir],以å…许从整个文件系统中进行选择。\n"
+"å¦è¯·å‚è§ [constant PROPERTY_HINT_DIR]。\n"
+"[codeblock]\n"
+"@export_dir var sprite_folder: String\n"
+"[/codeblock]"
+
+msgid ""
+"Export a floating-point property with an easing editor widget. Additional "
+"hints can be provided to adjust the behavior of the widget. "
+"[code]\"attenuation\"[/code] flips the curve, which makes it more intuitive "
+"for editing attenuation properties. [code]\"positive_only\"[/code] limits "
+"values to only be greater than or equal to zero.\n"
+"See also [constant PROPERTY_HINT_EXP_EASING].\n"
+"[codeblock]\n"
+"@export_exp_easing var transition_speed\n"
+"@export_exp_easing(\"attenuation\") var fading_attenuation\n"
+"@export_exp_easing(\"positive_only\") var effect_power\n"
+"[/codeblock]"
+msgstr ""
+"使用缓动编辑器å°éƒ¨ä»¶å¯¼å‡ºæµ®ç‚¹å±žæ€§ã€‚å¯ä»¥æä¾›é¢å¤–çš„æ示æ¥è°ƒæ•´å°éƒ¨ä»¶çš„行为。"
+"[code]\"attenuation\"[/code] 翻转曲线,使编辑衰å‡å±žæ€§æ›´åŠ ç›´è§‚。"
+"[code]\"positive_only\"[/code] 将值é™åˆ¶ä¸ºä»…大于或等于零。\n"
+"å¦è¯·å‚è§ [constant PROPERTY_HINT_EXP_EASING]。\n"
+"[codeblock]\n"
+"@export_exp_easing var transition_speed\n"
+"@export_exp_easing(\"attenuation\") var fading_attenuation\n"
+"@export_exp_easing(\"positive_only\") var effect_power\n"
+"[/codeblock]"
+
+msgid ""
+"Export a [String] property as a path to a file. The path will be limited to "
+"the project folder and its subfolders. See [annotation @export_global_file] "
+"to allow picking from the entire filesystem.\n"
+"If [param filter] is provided, only matching files will be available for "
+"picking.\n"
+"See also [constant PROPERTY_HINT_FILE].\n"
+"[codeblock]\n"
+"@export_file var sound_effect_file: String\n"
+"@export_file(\"*.txt\") var notes_file: String\n"
+"[/codeblock]"
+msgstr ""
+"å°† [String] 属性导出为文件的路径。该路径将é™äºŽé¡¹ç›®æ–‡ä»¶å¤¹åŠå…¶å­æ–‡ä»¶å¤¹ã€‚请å‚阅 "
+"[annotation @export_global_file],以å…许从整个文件系统中进行选择。\n"
+"如果æ供了 [param filter],则åªæœ‰åŒ¹é…的文件å¯ä¾›é€‰æ‹©ã€‚\n"
+"å¦è¯·å‚è§ [constant PROPERTY_HINT_FILE]。\n"
+"[codeblock]\n"
+"@export_file var sound_effect_file: String\n"
+"@export_file(\"*.txt\") var notes_file: String\n"
+"[/codeblock]"
+
+msgid ""
+"Export an integer property as a bit flag field for 2D navigation layers. The "
+"widget in the Inspector dock will use the layer names defined in [member "
+"ProjectSettings.layer_names/2d_navigation/layer_1].\n"
+"See also [constant PROPERTY_HINT_LAYERS_2D_NAVIGATION].\n"
+"[codeblock]\n"
+"@export_flags_2d_navigation var navigation_layers: int\n"
+"[/codeblock]"
+msgstr ""
+"将整数属性导出为 2D 导航层的ä½æ ‡å¿—字段。检查器åœé æ ä¸­çš„å°éƒ¨ä»¶ï¼Œå°†ä½¿ç”¨åœ¨ "
+"[member ProjectSettings.layer_names/2d_navigation/layer_1] 中定义的层å称。\n"
+"å¦è¯·å‚è§ [constant PROPERTY_HINT_LAYERS_2D_NAVIGATION]。\n"
+"[codeblock]\n"
+"@export_flags_2d_navigation var navigation_layers: int\n"
+"[/codeblock]"
+
+msgid ""
+"Export an integer property as a bit flag field for 2D physics layers. The "
+"widget in the Inspector dock will use the layer names defined in [member "
+"ProjectSettings.layer_names/2d_physics/layer_1].\n"
+"See also [constant PROPERTY_HINT_LAYERS_2D_PHYSICS].\n"
+"[codeblock]\n"
+"@export_flags_2d_physics var physics_layers: int\n"
+"[/codeblock]"
+msgstr ""
+"将整数属性导出为 2D 物ç†å±‚çš„ä½æ ‡å¿—字段。检查器åœé æ ä¸­çš„å°éƒ¨ä»¶ï¼Œå°†ä½¿ç”¨åœ¨ "
+"[member ProjectSettings.layer_names/2d_physics/layer_1] 中定义的层å称。\n"
+"å¦è¯·å‚è§ [constant PROPERTY_HINT_LAYERS_2D_PHYSICS]。\n"
+"[codeblock]\n"
+"@export_flags_2d_physics var physics_layers: int\n"
+"[/codeblock]"
+
+msgid ""
+"Export an integer property as a bit flag field for 2D render layers. The "
+"widget in the Inspector dock will use the layer names defined in [member "
+"ProjectSettings.layer_names/2d_render/layer_1].\n"
+"See also [constant PROPERTY_HINT_LAYERS_2D_RENDER].\n"
+"[codeblock]\n"
+"@export_flags_2d_render var render_layers: int\n"
+"[/codeblock]"
+msgstr ""
+"将整数属性导出为 2D 渲染层的ä½æ ‡å¿—字段。检查器åœé æ ä¸­çš„å°å·¥å…·å°†ä½¿ç”¨åœ¨ "
+"[member ProjectSettings.layer_names/2d_render/layer_1] 中定义的层å称。\n"
+"å¦è¯·å‚è§ [constant PROPERTY_HINT_LAYERS_2D_RENDER]。\n"
+"[codeblock]\n"
+"@export_flags_2d_render var render_layers: int\n"
+"[/codeblock]"
+
+msgid ""
+"Export an integer property as a bit flag field for 3D navigation layers. The "
+"widget in the Inspector dock will use the layer names defined in [member "
+"ProjectSettings.layer_names/3d_navigation/layer_1].\n"
+"See also [constant PROPERTY_HINT_LAYERS_3D_NAVIGATION].\n"
+"[codeblock]\n"
+"@export_flags_3d_navigation var navigation_layers: int\n"
+"[/codeblock]"
+msgstr ""
+"将整数属性导出为 3D 导航层的ä½æ ‡å¿—字段。检查器åœé é¢æ¿ä¸­çš„å°å·¥å…·å°†ä½¿ç”¨åœ¨ "
+"[member ProjectSettings.layer_names/3d_navigation/layer_1] 中定义的层å称。\n"
+"å¦è¯·å‚è§ [constant PROPERTY_HINT_LAYERS_3D_NAVIGATION]。\n"
+"[codeblock]\n"
+"@export_flags_3d_navigation var navigation_layers: int\n"
+"[/codeblock]"
+
+msgid ""
+"Export an integer property as a bit flag field for 3D physics layers. The "
+"widget in the Inspector dock will use the layer names defined in [member "
+"ProjectSettings.layer_names/3d_physics/layer_1].\n"
+"See also [constant PROPERTY_HINT_LAYERS_3D_PHYSICS].\n"
+"[codeblock]\n"
+"@export_flags_3d_physics var physics_layers: int\n"
+"[/codeblock]"
+msgstr ""
+"将整数属性导出为 3D 物ç†å±‚çš„ä½æ ‡å¿—字段。检查器åœé é¢æ¿ä¸­çš„å°å·¥å…·å°†ä½¿ç”¨åœ¨ "
+"[member ProjectSettings.layer_names/3d_physics/layer_1] 中定义的层å称。\n"
+"å¦è¯·å‚è§ [constant PROPERTY_HINT_LAYERS_3D_PHYSICS]。\n"
+"[codeblock]\n"
+"@export_flags_3d_physics var physics_layers: int\n"
+"[/codeblock]"
+
+msgid ""
+"Export an integer property as a bit flag field for 3D render layers. The "
+"widget in the Inspector dock will use the layer names defined in [member "
+"ProjectSettings.layer_names/3d_render/layer_1].\n"
+"See also [constant PROPERTY_HINT_LAYERS_3D_RENDER].\n"
+"[codeblock]\n"
+"@export_flags_3d_render var render_layers: int\n"
+"[/codeblock]"
+msgstr ""
+"将整数属性导出为 3D 渲染层的ä½æ ‡å¿—字段。检查器åœé é¢æ¿ä¸­çš„å°å·¥å…·å°†ä½¿ç”¨åœ¨ "
+"[member ProjectSettings.layer_names/3d_render/layer_1] 中定义的层å称。\n"
+"å¦è¯·å‚è§ [constant PROPERTY_HINT_LAYERS_3D_RENDER]。\n"
+"[codeblock]\n"
+"@export_flags_3d_render var render_layers: int\n"
+"[/codeblock]"
+
+msgid ""
+"Export a [String] property as a path to a directory. The path can be picked "
+"from the entire filesystem. See [annotation @export_dir] to limit it to the "
+"project folder and its subfolders.\n"
+"See also [constant PROPERTY_HINT_GLOBAL_DIR].\n"
+"[codeblock]\n"
+"@export_global_dir var sprite_folder: String\n"
+"[/codeblock]"
+msgstr ""
+"å°† [String] 属性导出为目录路径。å¯ä»¥ä»Žæ•´ä¸ªæ–‡ä»¶ç³»ç»Ÿä¸­é€‰æ‹©è·¯å¾„。请å‚阅 "
+"[annotation @export_dir] 以将其é™åˆ¶ä¸ºé¡¹ç›®æ–‡ä»¶å¤¹åŠå…¶å­æ–‡ä»¶å¤¹ã€‚\n"
+"å¦è¯·å‚è§ [constant PROPERTY_HINT_GLOBAL_DIR]。\n"
+"[codeblock]\n"
+"@export_global_dir var sprite_folder: String\n"
+"[/codeblock]"
+
+msgid ""
+"Export a [String] property as a path to a file. The path can be picked from "
+"the entire filesystem. See [annotation @export_file] to limit it to the "
+"project folder and its subfolders.\n"
+"If [param filter] is provided, only matching files will be available for "
+"picking.\n"
+"See also [constant PROPERTY_HINT_GLOBAL_FILE].\n"
+"[codeblock]\n"
+"@export_global_file var sound_effect_file: String\n"
+"@export_global_file(\"*.txt\") var notes_file: String\n"
+"[/codeblock]"
+msgstr ""
+"å°† [String] 属性作为文件路径导出。å¯ä»¥ä»Žæ•´ä¸ªæ–‡ä»¶ç³»ç»Ÿä¸­é€‰æ‹©è·¯å¾„。请å‚阅 "
+"[annotation @export_file],以将其é™åˆ¶ä¸ºé¡¹ç›®æ–‡ä»¶å¤¹åŠå…¶å­æ–‡ä»¶å¤¹ã€‚\n"
+"如果æ供了 [param filter],则åªæœ‰åŒ¹é…的文件å¯ä¾›é€‰æ‹©ã€‚\n"
+"å¦è¯·å‚è§ [constant PROPERTY_HINT_GLOBAL_FILE]。\n"
+"[codeblock]\n"
+"@export_global_file var sound_effect_file: String\n"
+"@export_global_file(\"*.txt\") var notes_file: String\n"
+"[/codeblock]"
+
+msgid ""
+"Define a new group for the following exported properties. This helps to "
+"organize properties in the Inspector dock. Groups can be added with an "
+"optional [param prefix], which would make group to only consider properties "
+"that have this prefix. The grouping will break on the first property that "
+"doesn't have a prefix. The prefix is also removed from the property's name "
+"in the Inspector dock.\n"
+"If no [param prefix] is provided, the every following property is added to "
+"the group. The group ends when then next group or category is defined. You "
+"can also force end a group by using this annotation with empty strings for "
+"parameters, [code]@export_group(\"\", \"\")[/code].\n"
+"Groups cannot be nested, use [annotation @export_subgroup] to add subgroups "
+"within groups.\n"
+"See also [constant PROPERTY_USAGE_GROUP].\n"
+"[codeblock]\n"
+"@export_group(\"My Properties\")\n"
+"@export var number = 3\n"
+"@export var string = \"\"\n"
+"\n"
+"@export_group(\"Prefixed Properties\", \"prefix_\")\n"
+"@export var prefix_number = 3\n"
+"@export var prefix_string = \"\"\n"
+"\n"
+"@export_group(\"\", \"\")\n"
+"@export var ungrouped_number = 3\n"
+"[/codeblock]"
+msgstr ""
+"为以下导出的属性定义一个新组。这有助于在检查器åœé é¢æ¿ä¸­ç»„织属性。å¯ä»¥ä½¿ç”¨å¯"
+"选的 [param prefix] 添加组,这将使组仅考虑具有此å‰ç¼€çš„属性。分组将在第一个没"
+"有å‰ç¼€çš„属性上中断。å‰ç¼€ä¹Ÿå°†ä»Žæ£€æŸ¥å™¨åœé é¢æ¿ä¸­çš„属性å称中移除。\n"
+"如果未æä¾› [param prefix],则将以下æ¯ä¸ªå±žæ€§æ·»åŠ åˆ°ç»„中。当定义下一个组或类别"
+"时,该组结æŸã€‚您还å¯ä»¥é€šè¿‡å°†æ­¤æ³¨è§£ä¸Žç©ºå­—符串的å‚数一起使用æ¥å¼ºåˆ¶ç»“æŸç»„,"
+"[code]@export_group(\"\", \"\")[/code]。\n"
+"组ä¸èƒ½è¢«åµŒå¥—,使用 [annotation @export_subgroup] 在组内添加å­ç»„。\n"
+"å¦è§ [constant PROPERTY_USAGE_GROUP]。\n"
+"[codeblock]\n"
+"@export_group(\"My Properties\")\n"
+"@export var number = 3\n"
+"@export var string = \"\"\n"
+"\n"
+"@export_group(\"Prefixed Properties\", \"prefix_\")\n"
+"@export var prefix_number = 3\n"
+"@export var prefix_string = \"\"\n"
+"\n"
+"@export_group(\"\", \"\")\n"
+"@export var ungrouped_number = 3\n"
+"[/codeblock]"
+
+msgid ""
+"Export a [String] property with a large [TextEdit] widget instead of a "
+"[LineEdit]. This adds support for multiline content and makes it easier to "
+"edit large amount of text stored in the property.\n"
+"See also [constant PROPERTY_HINT_MULTILINE_TEXT].\n"
+"[codeblock]\n"
+"@export_multiline var character_biography\n"
+"[/codeblock]"
+msgstr ""
+"用一个大的 [TextEdit] 部件而ä¸æ˜¯ [LineEdit] 导出一个 [String] 属性。这增加了"
+"对多行内容的支æŒï¼Œä½¿å…¶æ›´å®¹æ˜“编辑存储在属性中的大é‡æ–‡æœ¬ã€‚\n"
+"å‚è§ [constant PROPERTY_HINT_MULTILINE_TEXT]。\n"
+"[codeblock]\n"
+"@export_multiline var character_biography\n"
+"[/codeblock]"
+
+msgid ""
+"Export a [String] property with a placeholder text displayed in the editor "
+"widget when no value is present.\n"
+"See also [constant PROPERTY_HINT_PLACEHOLDER_TEXT].\n"
+"[codeblock]\n"
+"@export_placeholder(\"Name in lowercase\") var character_id: String\n"
+"[/codeblock]"
+msgstr ""
+"导出一个带有一个å ä½ç¬¦æ–‡æœ¬çš„ [String] 属性,当没有值时,编辑器å°éƒ¨ä»¶ä¸­ä¼šæ˜¾ç¤º"
+"该å ä½ç¬¦æ–‡æœ¬ã€‚\n"
+"å¦è¯·å‚è§ [constant PROPERTY_HINT_PLACEHOLDER_TEXT]。\n"
+"[codeblock]\n"
+"@export_placeholder(\"Name in lowercase\") var character_id: String\n"
+"[/codeblock]"
+
+msgid ""
+"Define a new subgroup for the following exported properties. This helps to "
+"organize properties in the Inspector dock. Subgroups work exactly like "
+"groups, except they need a parent group to exist. See [annotation "
+"@export_group].\n"
+"See also [constant PROPERTY_USAGE_SUBGROUP].\n"
+"[codeblock]\n"
+"@export_group(\"My Properties\")\n"
+"@export var number = 3\n"
+"@export var string = \"\"\n"
+"\n"
+"@export_subgroup(\"My Prefixed Properties\", \"prefix_\")\n"
+"@export var prefix_number = 3\n"
+"@export var prefix_string = \"\"\n"
+"[/codeblock]\n"
+"[b]Note:[/b] Subgroups cannot be nested, they only provide one extra level "
+"of depth. Just like the next group ends the previous group, so do the "
+"subsequent subgroups."
+msgstr ""
+"为接下æ¥çš„导出属性定义一个新的å­ç»„。这有助于组织检查器åœé é¢æ¿ä¸­çš„属性。å­ç»„"
+"的工作方å¼ä¸Žç»„完全一样,åªæ˜¯å®ƒä»¬éœ€è¦ä¸€ä¸ªçˆ¶ç»„æ‰èƒ½å­˜åœ¨ã€‚请å‚阅 [annotation "
+"@export_group]。\n"
+"å¦è¯·å‚è§ [constant PROPERTY_USAGE_SUBGROUP]。\n"
+"[codeblock]\n"
+"@export_group(\"My Properties\")\n"
+"@export var number = 3\n"
+"@export var string = \"\"\n"
+"\n"
+"@export_subgroup(\"My Prefixed Properties\", \"prefix_\")\n"
+"@export var prefix_number = 3\n"
+"@export var prefix_string = \"\"\n"
+"[/codeblock]\n"
+"[b]注æ„:[/b]å­ç»„ä¸èƒ½åµŒå¥—,它们åªæ供一层é¢å¤–的深度。就åƒæ–°ç»„使å‰ä¸€ä¸ªç»„结æŸä¸€"
+"样,åŽç»­çš„å­ç»„也会打断之å‰çš„å­ç»„。"
+
msgid "Random number generation"
msgstr "éšæœºæ•°ç”Ÿæˆ"
-msgid "Converts from decibels to linear energy (audio)."
-msgstr "从分è´è½¬æ¢ä¸ºçº¿æ€§èƒ½é‡ï¼ˆéŸ³é¢‘)。"
+msgid ""
+"Returns the absolute value of a [Variant] parameter [param x] (i.e. non-"
+"negative value). Supported types: [int], [float], [Vector2], [Vector2i], "
+"[Vector3], [Vector3i], [Vector4], [Vector4i].\n"
+"[codeblock]\n"
+"var a = abs(-1)\n"
+"# a is 1\n"
+"\n"
+"var b = abs(-1.2)\n"
+"# b is 1.2\n"
+"\n"
+"var c = abs(Vector2(-3.5, -4))\n"
+"# c is (3.5, 4)\n"
+"\n"
+"var d = abs(Vector2i(-5, -6))\n"
+"# d is (5, 6)\n"
+"\n"
+"var e = abs(Vector3(-7, 8.5, -3.8))\n"
+"# e is (7, 8.5, 3.8)\n"
+"\n"
+"var f = abs(Vector3i(-7, -8, -9))\n"
+"# f is (7, 8, 9)\n"
+"[/codeblock]\n"
+"[b]Note:[/b] For better type safety, use [method absf], [method absi], "
+"[method Vector2.abs], [method Vector2i.abs], [method Vector3.abs], [method "
+"Vector3i.abs], [method Vector4.abs], or [method Vector4i.abs]."
+msgstr ""
+"返回一个 [Variant] 类型å‚æ•° [param x] çš„ç»å¯¹å€¼ï¼ˆå³éžè´Ÿå€¼ï¼‰ã€‚支æŒçš„类型:"
+"[int]ã€[float]ã€[Vector2]ã€[Vector2i]ã€[Vector3]ã€[Vector3i]ã€[Vector4]ã€"
+"[Vector4i] 。\n"
+"[codeblock]\n"
+"var a = abs(-1)\n"
+"# a=1\n"
+"\n"
+"var b = abs(-1.2)\n"
+"# b=1.2\n"
+"\n"
+"var c = abs(Vector2(-3.5, -4))\n"
+"# c=(3.5, 4)\n"
+"\n"
+"var d = abs(Vector2i(-5, -6))\n"
+"# d=(5, 6)\n"
+"\n"
+"var e = abs(Vector3(-7, 8.5, -3.8))\n"
+"# e=(7, 8.5, 3.8)\n"
+"\n"
+"var f = abs(Vector3i(-7, -8, -9))\n"
+"# f=(7, 8, 9)\n"
+"[/codeblock]\n"
+"[b]注æ„:[/b] 为了更好的类型安全,请使用 [method absf]ã€[method absi]ã€"
+"[method Vector2.abs]ã€[method Vector2i.abs]ã€[method Vector3.abs]ã€[method "
+"Vector3i.abs]ã€[method Vector4.abs] 或 [method Vector4i.abs]。"
msgid ""
-"Prints one or more arguments to strings in the best way possible to standard "
-"error line.\n"
+"Returns the absolute value of float parameter [param x] (i.e. positive "
+"value).\n"
"[codeblock]\n"
-"printerr(\"prints to stderr\")\n"
+"# a is 1.2\n"
+"var a = absf(-1.2)\n"
"[/codeblock]"
msgstr ""
-"以å¯èƒ½çš„最佳方å¼å°†ä¸€ä¸ªæˆ–多个å‚数作为字符串输出到标准错误行。\n"
+"返回浮点å‚æ•° [param x] çš„ç»å¯¹å€¼ï¼ˆå³æ­£å€¼ï¼‰ã€‚\n"
"[codeblock]\n"
-"printerr(\"prints to stderr\")\n"
+"# a=1.2\n"
+"var a = absf(-1.2)\n"
"[/codeblock]"
msgid ""
-"Prints one or more arguments to the console with a space between each "
-"argument.\n"
+"Returns the absolute value of int parameter [param x] (i.e. positive "
+"value).\n"
"[codeblock]\n"
-"prints(\"A\", \"B\", \"C\") # Prints A B C\n"
+"# a is 1\n"
+"var a = absi(-1)\n"
"[/codeblock]"
msgstr ""
-"将一个或多个å‚数打å°åˆ°æŽ§åˆ¶å°ï¼Œæ¯ä¸ªå‚数之间有一个空格。\n"
+"返回整数å‚æ•° [param x] çš„ç»å¯¹å€¼ï¼ˆå³æ­£å€¼ï¼‰ã€‚\n"
"[codeblock]\n"
-"prints(\"A\", \"B\", \"C\") # 输出 A B C\n"
+"# a=1\n"
+"var a = absi(-1)\n"
"[/codeblock]"
msgid ""
-"Prints one or more arguments to the console with a tab between each "
-"argument.\n"
+"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"
-"printt(\"A\", \"B\", \"C\") # Prints A B C\n"
+"# c is 0.523599 or 30 degrees if converted with rad_to_deg(c)\n"
+"var c = acos(0.866025)\n"
"[/codeblock]"
msgstr ""
-"将一个或多个å‚数打å°åˆ°æŽ§åˆ¶å°ï¼Œæ¯ä¸ªå‚数之间有一个制表符。\n"
+"返回 [param x] çš„å余弦,å•ä½ä¸ºå¼§åº¦ã€‚用æ¥èŽ·å–余弦 [param x] 的角度。[param "
+"x] 必须在 [code]-1.0[/code] å’Œ [code]1.0[/code](包括)之间,å¦åˆ™ [method "
+"acos] 将返回 [constant @GDScript.NAN]。\n"
"[codeblock]\n"
-"printt(\"A\", \"B\", \"C\") # 输出 A B C\n"
+"# 如果用 rad_to_deg(c) 转æ¢ï¼Œc为0.523599或30度\n"
+"var c = acos(0.866025)\n"
"[/codeblock]"
msgid ""
-"Pushes a warning message to Godot's built-in debugger and to the OS "
-"terminal.\n"
+"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"
-"push_warning(\"test warning\") # Prints \"test warning\" to debugger and "
-"terminal as warning call\n"
+"# s is 0.523599 or 30 degrees if converted with rad_to_deg(s)\n"
+"var s = asin(0.5)\n"
"[/codeblock]"
msgstr ""
-"将警告消æ¯æŽ¨é€åˆ° Godot 的内置调试器和 OS 终端。\n"
+"返回 [param x] çš„å正弦值,å•ä½ä¸ºå¼§åº¦ã€‚用æ¥èŽ·å–正弦 [param x] 的角度。[param "
+"x] 必须在 [code]-1.0[/code] å’Œ [code]1.0[/code](包括)之间,å¦åˆ™ [method "
+"asin] 将返回 [constant @GDScript.NAN]。\n"
"[codeblock]\n"
-"push_warning(\"test warning\") # 以警告的形å¼å‘调试器和终端输出 \"test "
-"warning\"\n"
+"# 如果用 rad_to_deg(s) 转æ¢ï¼Œs为0.523599或30度\n"
+"var s = asin(0.5)\n"
"[/codeblock]"
msgid ""
-"Returns a random unsigned 32-bit integer. Use remainder to obtain a random "
-"value in the interval [code][0, N - 1][/code] (where N is smaller than "
-"2^32).\n"
+"Returns the arc tangent of [param x] in radians. Use it to get the angle "
+"from an angle's tangent in trigonometry.\n"
+"The method cannot know in which quadrant the angle should fall. See [method "
+"atan2] if you have both [code]y[/code] and [code]x[/code].\n"
+"[codeblock]\n"
+"var a = atan(0.5) # a is 0.463648\n"
+"[/codeblock]\n"
+"If [param x] is between [code]-PI / 2[/code] and [code]PI / 2[/code] "
+"(inclusive), [code]atan(tan(x))[/code] is equal to [param x]."
+msgstr ""
+"返回 [param x] çš„å正切值,å•ä½æ˜¯å¼§åº¦ã€‚在三角函数中用它æ¥å¾—到一个角上切线的角"
+"度。\n"
+"该方法无法确定角度应该è½åœ¨å“ªä¸ªè±¡é™ã€‚如果你åŒæ—¶æ‹¥æœ‰ [code]y[/code] å’Œ "
+"[code]x[/code],请å‚è§ [method atan2]。\n"
+"[codeblock]\n"
+"var a = atan(0.5) # a=0.463648\n"
+"[/codeblock]\n"
+"如果 [param x] 在 [code]-PI/2[/code] 和 [code]PI/2[/code](包括)之间,"
+"[code]atan(tan(x))[/code] 等于 [param x]。"
+
+msgid ""
+"Returns the arc tangent of [code]y/x[/code] in radians. Use to get the angle "
+"of tangent [code]y/x[/code]. To compute the value, the method takes into "
+"account the sign of both arguments in order to determine the quadrant.\n"
+"Important note: The Y coordinate comes first, by convention.\n"
"[codeblock]\n"
-"randi() # Returns random integer between 0 and 2^32 - 1\n"
-"randi() % 20 # Returns random integer between 0 and 19\n"
-"randi() % 100 # Returns random integer between 0 and 99\n"
-"randi() % 100 + 1 # Returns random integer between 1 and 100\n"
+"var a = atan2(0, -1) # a is 3.141593\n"
"[/codeblock]"
msgstr ""
-"返回一个éšæœºçš„æ— ç¬¦å· 32 ä½æ•´æ•°ã€‚使用余数获得区间 [code][0, N - 1][/code] (其"
-"中 N å°äºŽ 2^32)的éšæœºå€¼ã€‚\n"
+"返回 [code]y/x[/code] çš„å正切值,å•ä½ä¸ºå¼§åº¦ã€‚用æ¥èŽ·å¾—切线的角度 [code]y/x[/"
+"code] 。为了计算该值,该方法考虑了两个å‚数的符å·ï¼Œä»¥ç¡®å®šè±¡é™ã€‚\n"
+"é‡è¦æ示:按照惯例,Yå标在å‰ã€‚\n"
"[codeblock]\n"
-"randi() # 返回介于 0 到 2^32 - 1 之间的éšæœºæ•´æ•°\n"
-"randi() % 20 # 返回介于 0 到 19之间的éšæœºæ•´æ•°\n"
-"randi() % 100 # 返回介于 0 到 99 之间的éšæœºæ•´æ•°\n"
-"randi() % 100 + 1 # 返回介于 1 到 100 之间的éšæœºæ•´æ•°\n"
+"var a = atan2(0, -1) # a=3.141593\n"
"[/codeblock]"
+msgid "Converts from decibels to linear energy (audio)."
+msgstr "从分è´è½¬æ¢ä¸ºçº¿æ€§èƒ½é‡ï¼ˆéŸ³é¢‘)。"
+
+msgid ""
+"Rounds [param x] downward (towards negative infinity), returning the largest "
+"whole number that is not more than [param x].\n"
+"A type-safe version of [method floor], returning a [float]."
+msgstr ""
+"å°† [param x] å‘下èˆå…¥ï¼ˆå‘负无穷大),返回ä¸è¶…过 [param x] 的最大整数。\n"
+"一个类型安全的 [method floor] 版本,返回一个 [float]。"
+
+msgid ""
+"Returns whether [param x] is a finite value, i.e. it is not [constant "
+"@GDScript.NAN], positive infinity, or negative infinity."
+msgstr ""
+"返回 [param x] 是å¦ä¸ºæœ‰é™å€¼ï¼Œå³ä¸æ˜¯ [constant @GDScript.NAN]ã€æ­£æ— ç©·å¤§æˆ–è´Ÿæ— "
+"穷大。"
+
+msgid ""
+"Returns [code]true[/code] if [param x] is either positive infinity or "
+"negative infinity."
+msgstr "如果 [param x] 是正无穷大或负无穷大,则返回 [code]true[/code] 。"
+
+msgid ""
+"Returns [code]true[/code] if the Object that corresponds to [param id] is a "
+"valid object (e.g. has not been deleted from memory). All Objects have a "
+"unique instance ID."
+msgstr ""
+"如果与 [param id] 对应的 Object 是有效的对象(例如没有从内存中删除),则返回 "
+"[code]true[/code] 。所有对象都有唯一的实例 ID。"
+
+msgid ""
+"Returns [code]true[/code] if [param instance] is a valid Object (e.g. has "
+"not been deleted from memory)."
+msgstr ""
+"如果 [param instance] 是有效的 Object(例如,没有从内存中删除),则返回 "
+"[code]true[/code] 。"
+
+msgid ""
+"Returns [code]true[/code] if [param x] is a NaN (\"Not a Number\" or "
+"invalid) value."
+msgstr "如果 [param x] 是 NaN(“éžæ•°å­—â€æˆ–无效)值,则返回 [code]true[/code] 。"
+
msgid "The [AudioServer] singleton."
msgstr "[AudioServer] å•ä¾‹ã€‚"
@@ -342,6 +1328,9 @@ msgstr "ESC 键。"
msgid "Tab key."
msgstr "Tab 键。"
+msgid "Shift + Tab key."
+msgstr "Shift + Tab 键。"
+
msgid "Backspace key."
msgstr "退格键。"
@@ -1079,6 +2068,98 @@ msgstr "忙碌错误。"
msgid "Skip error."
msgstr "跳过错误。"
+msgid ""
+"Hints that a vector property should allow its components to be linked. For "
+"example, this allows [member Vector2.x] and [member Vector2.y] to be edited "
+"together."
+msgstr ""
+"æ示å‘é‡å±žæ€§åº”该å…许分é‡é“¾æŽ¥ã€‚例如,这能够让 [member Vector2.x] å’Œ [member "
+"Vector2.y] 被一起编辑。"
+
+msgid ""
+"Hints that an [int] property is a bitmask using the optionally named 2D "
+"render layers."
+msgstr "æ示 [int] 属性为ä½æŽ©ç ï¼Œè¡¨ç¤ºå¯å‘½åçš„ 2D 渲染层。"
+
+msgid ""
+"Hints that an [int] property is a bitmask using the optionally named 2D "
+"physics layers."
+msgstr "æ示 [int] 属性为ä½æŽ©ç ï¼Œè¡¨ç¤ºå¯å‘½åçš„ 2D 物ç†å±‚。"
+
+msgid ""
+"Hints that an [int] property is a bitmask using the optionally named 2D "
+"navigation layers."
+msgstr "æ示 [int] 属性为ä½æŽ©ç ï¼Œè¡¨ç¤ºå¯å‘½åçš„ 2D 导航层。"
+
+msgid ""
+"Hints that an [int] property is a bitmask using the optionally named 3D "
+"render layers."
+msgstr "æ示 [int] 属性为ä½æŽ©ç ï¼Œè¡¨ç¤ºå¯å‘½åçš„ 3D 渲染层。"
+
+msgid ""
+"Hints that an [int] property is a bitmask using the optionally named 3D "
+"physics layers."
+msgstr "æ示 [int] 属性为ä½æŽ©ç ï¼Œè¡¨ç¤ºå¯å‘½åçš„ 3D 物ç†å±‚。"
+
+msgid ""
+"Hints that an [int] property is a bitmask using the optionally named 3D "
+"navigation layers."
+msgstr "æ示 [int] 属性为ä½æŽ©ç ï¼Œè¡¨ç¤ºå¯å‘½åçš„ 3D 导航层。"
+
+msgid ""
+"Hints that a [String] property is a path to a file. Editing it will show a "
+"file dialog for picking the path. The hint string can be a set of filters "
+"with wildcards like [code]\"*.png,*.jpg\"[/code]."
+msgstr ""
+"æ示 [String] 属性为文件的路径。编辑时会弹出选å–路径的文件对è¯æ¡†ã€‚æ示字符串"
+"å¯ä»¥è®¾ä¸ºä¸€ç»„带有通é…符的筛选器,例如 [code]\"*.png,*.jpg\"[/code]。"
+
+msgid ""
+"Hints that a [String] property is a path to a directory. Editing it will "
+"show a file dialog for picking the path."
+msgstr "æ示 [String] 属性为目录的路径。编辑时会弹出选å–路径的文件对è¯æ¡†ã€‚"
+
+msgid ""
+"Hints that a [String] property is an absolute path to a file outside the "
+"project folder. Editing it will show a file dialog for picking the path. The "
+"hint string can be a set of filters with wildcards, like [code]\"*.png,*."
+"jpg\"[/code]."
+msgstr ""
+"æ示 [String] 属性为文件的ç»å¯¹è·¯å¾„,ä½äºŽé¡¹ç›®æ–‡ä»¶å¤¹ä¹‹å¤–。编辑时会弹出选å–路径"
+"的文件对è¯æ¡†ã€‚æ示字符串å¯ä»¥è®¾ä¸ºä¸€ç»„带有通é…符的筛选器,例如 [code]\"*.png,*."
+"jpg\"[/code]。"
+
+msgid ""
+"Hints that a [String] property is an absolute path to a directory outside "
+"the project folder. Editing it will show a file dialog for picking the path."
+msgstr ""
+"æ示 [String] 属性为目录的ç»å¯¹è·¯å¾„,ä½äºŽé¡¹ç›®æ–‡ä»¶å¤¹ä¹‹å¤–。编辑时会弹出选å–路径"
+"的文件对è¯æ¡†ã€‚"
+
+msgid ""
+"Hints that a [String] property is text with line breaks. Editing it will "
+"show a text input field where line breaks can be typed."
+msgstr ""
+"æ示 [String] 属性为包å«æ¢è¡Œçš„文本。编辑是会显示文本输入字段,å¯ä»¥è¿›è¡Œæ¢è¡Œã€‚"
+
+msgid "Hints that a [String] property is an [Expression]."
+msgstr "æ示 [String] 属性为 [Expression]。"
+
+msgid ""
+"Hints that a [String] property should show a placeholder text on its input "
+"field, if empty. The hint string is the placeholder text to use."
+msgstr ""
+"æ示 [String] 属性在为空时应当显示å ä½æ–‡æœ¬ã€‚æ示字符串为所使用的å ä½æ–‡æœ¬ã€‚"
+
+msgid ""
+"Hints that a quaternion property should disable the temporary euler editor."
+msgstr "æ示四元数属性应当ç¦ç”¨ä¸´æ—¶æ¬§æ‹‰å€¼ç¼–辑器。"
+
+msgid ""
+"Hints that a string property is a password, and every character is replaced "
+"with the secret character."
+msgstr "æ示字符串属性为密ç ï¼Œæ¯ä¸€ä¸ªå­—符都会被替æ¢ä¸ºç§˜å¯†å­—符。"
+
msgid "The property is serialized and saved in the scene file (default)."
msgstr "将属性åºåˆ—化并ä¿å­˜åˆ°åœºæ™¯æ–‡ä»¶ä¸­ï¼ˆé»˜è®¤ï¼‰ã€‚"
@@ -1257,6 +2338,9 @@ msgstr "å‘é‡æ•°å­¦"
msgid "Advanced vector math"
msgstr "高等å‘é‡æ•°å­¦"
+msgid "Constructs an [AABB] as a copy of the given [AABB]."
+msgstr "构造给定 [AABB] 的副本。"
+
msgid "Constructs an [AABB] from a position and size."
msgstr "从一个ä½ç½®å’Œå¤§å°æž„造 [AABB] 。"
@@ -1450,13 +2534,6 @@ msgstr "2D ç²¾çµåŠ¨ç”»"
msgid "2D Dodge The Creeps Demo"
msgstr "2D Dodge The Creeps 演示"
-msgid ""
-"The current animation from the [member frames] resource. If this value "
-"changes, the [code]frame[/code] counter is reset."
-msgstr ""
-"æ¥è‡ª [member frames] 资æºçš„当å‰åŠ¨ç”»ã€‚如果这个值å‘生å˜åŒ–,[code]frame[/code] "
-"计数器会被é‡ç½®ã€‚"
-
msgid "If [code]true[/code], texture will be centered."
msgstr "如果为 [code]true[/code],纹ç†å°†è¢«å±…中。"
@@ -1466,8 +2543,8 @@ msgstr "如果为 [code]true[/code],纹ç†å°†è¢«æ°´å¹³ç¿»è½¬ã€‚"
msgid "If [code]true[/code], texture is flipped vertically."
msgstr "如果为 [code]true[/code],纹ç†å°†è¢«åž‚直翻转。"
-msgid "The displayed animation frame's index."
-msgstr "显示的动画帧的索引。"
+msgid "The texture's drawing offset."
+msgstr "纹ç†çš„绘图å移é‡ã€‚"
msgid ""
"The [SpriteFrames] resource containing the animation(s). Allows you the "
@@ -1477,12 +2554,6 @@ msgstr ""
"包å«åŠ¨ç”»çš„ [SpriteFrames] 资æºã€‚å¯ä»¥å¯¹ [SpriteFrames] 资æºè¿›è¡ŒåŠ è½½ã€ç¼–辑ã€æ¸…"
"空ã€å”¯ä¸€åŒ–ã€ä¿å­˜çŠ¶æ€ç­‰æ“作。"
-msgid "The texture's drawing offset."
-msgstr "纹ç†çš„绘图å移é‡ã€‚"
-
-msgid "Emitted when [member frame] changed."
-msgstr "当 [member frame] 更改时å‘出。"
-
msgid ""
"2D sprite node in 3D world, that can use multiple 2D textures for animation."
msgstr "3D 世界中的 2D ç²¾çµèŠ‚点,å¯ä»¥ä½¿ç”¨å¤šä¸ª 2D 纹ç†è¿›è¡ŒåŠ¨ç”»å¤„ç†ã€‚"
@@ -1490,16 +2561,6 @@ msgstr "3D 世界中的 2D ç²¾çµèŠ‚点,å¯ä»¥ä½¿ç”¨å¤šä¸ª 2D 纹ç†è¿›è¡ŒåŠ¨ç
msgid "2D Sprite animation (also applies to 3D)"
msgstr "2D ç²¾çµåŠ¨ç”»ï¼ˆä¹Ÿé€‚用于 3D)"
-msgid ""
-"The current animation from the [code]frames[/code] resource. If this value "
-"changes, the [code]frame[/code] counter is reset."
-msgstr ""
-"æ¥è‡ª [code]frames[/code] 资æºçš„当å‰åŠ¨ç”»ã€‚如果这个值å‘生å˜åŒ–,[code]frame[/"
-"code] 计数器会被é‡ç½®ã€‚"
-
-msgid "The [SpriteFrames] resource containing the animation(s)."
-msgstr "包å«åŠ¨ç”»çš„ [SpriteFrames] 资æºã€‚"
-
msgid "Proxy texture for simple frame-based animations."
msgstr "基于简å•å¸§åŠ¨ç”»çš„代ç†çº¹ç†ã€‚"
@@ -1731,12 +2792,6 @@ msgstr ""
"节点上显示过滤器编辑。"
msgid ""
-"Adds an input to the node. This is only useful for nodes created for use in "
-"an [AnimationNodeBlendTree]."
-msgstr ""
-"为节点添加一个输入。这åªå¯¹åˆ›å»ºç”¨äºŽ [AnimationNodeBlendTree] 的节点有用。"
-
-msgid ""
"Blend another animation node (in case this node contains children animation "
"nodes). This function is only useful if you inherit from [AnimationRootNode] "
"instead, else editors will not display your node for addition."
@@ -1778,16 +2833,6 @@ msgstr ""
msgid "If [code]true[/code], filtering is enabled."
msgstr "如果为 [code]true[/code],则å¯ç”¨ç­›é€‰åŠŸèƒ½ã€‚"
-msgid ""
-"Emitted by nodes that inherit from this class and that have an internal tree "
-"when one of their nodes changes. The nodes that emit this signal are "
-"[AnimationNodeBlendSpace1D], [AnimationNodeBlendSpace2D], "
-"[AnimationNodeStateMachine], and [AnimationNodeBlendTree]."
-msgstr ""
-"由继承自该类且内部有树的节点å‘出,当其一个节点å‘生å˜åŒ–时。å‘出此信å·çš„节点有 "
-"[AnimationNodeBlendSpace1D]ã€[AnimationNodeBlendSpace2D]ã€"
-"[AnimationNodeStateMachine] 和 [AnimationNodeBlendTree]。"
-
msgid "Do not use filtering."
msgstr "ä¸è¦ä½¿ç”¨ç­›é€‰åŠŸèƒ½ã€‚"
@@ -1912,6 +2957,11 @@ msgid "Returns the number of points on the blend axis."
msgstr "返回混åˆè½´ä¸Šçš„点的数é‡ã€‚"
msgid ""
+"Controls the interpolation between animations. See [enum BlendMode] "
+"constants."
+msgstr "控制动画之间的æ’å€¼ã€‚è§ [enum BlendMode] 常é‡ã€‚"
+
+msgid ""
"The blend space's axis's upper limit for the points' position. See [method "
"add_blend_point]."
msgstr "æ··åˆç©ºé—´çš„轴的点的ä½ç½®ä¸Šé™ã€‚è§ [method add_blend_point]。"
@@ -1927,6 +2977,21 @@ msgstr "当在轴上移动一个点时,è¦æ•æ‰åˆ°çš„ä½ç½®å¢žé‡ã€‚"
msgid "Label of the virtual axis of the blend space."
msgstr "æ··åˆç©ºé—´è™šæ‹Ÿè½´çš„标签。"
+msgid "The interpolation between animations is linear."
+msgstr "动画之间的æ’点是线性的。"
+
+msgid ""
+"The blend space plays the animation of the node the blending position is "
+"closest to. Useful for frame-by-frame 2D animations."
+msgstr "æ··åˆç©ºé—´æ’­æ”¾æ··åˆä½ç½®æœ€æŽ¥è¿‘的节点的动画。对é€å¸§çš„2D动画很有用。"
+
+msgid ""
+"Similar to [constant BLEND_MODE_DISCRETE], but starts the new animation at "
+"the last animation's playback position."
+msgstr ""
+"类似于 [constant BLEND_MODE_DISCRETE],但在最åŽä¸€ä¸ªåŠ¨ç”»çš„播放ä½ç½®å¼€å§‹æ–°çš„动"
+"画。"
+
msgid ""
"Blends linearly between three [AnimationNode] of any type placed in a 2D "
"space."
@@ -1963,11 +3028,6 @@ msgstr ""
"新。"
msgid ""
-"Controls the interpolation between animations. See [enum BlendMode] "
-"constants."
-msgstr "控制动画之间的æ’å€¼ã€‚è§ [enum BlendMode] 常é‡ã€‚"
-
-msgid ""
"The blend space's X and Y axes' upper limit for the points' position. See "
"[method add_blend_point]."
msgstr "æ··åˆç©ºé—´çš„ X è½´å’Œ Y 轴的点的ä½ç½®ä¸Šé™ã€‚è§ [method add_blend_point]。"
@@ -1991,21 +3051,6 @@ msgid ""
"one of their vertices changes position."
msgstr "æ¯å½“创建ã€ç§»é™¤æ··åˆç©ºé—´çš„三角形,或当其中一个顶点改å˜ä½ç½®æ—¶å‘出。"
-msgid "The interpolation between animations is linear."
-msgstr "动画之间的æ’点是线性的。"
-
-msgid ""
-"The blend space plays the animation of the node the blending position is "
-"closest to. Useful for frame-by-frame 2D animations."
-msgstr "æ··åˆç©ºé—´æ’­æ”¾æ··åˆä½ç½®æœ€æŽ¥è¿‘的节点的动画。对é€å¸§çš„2D动画很有用。"
-
-msgid ""
-"Similar to [constant BLEND_MODE_DISCRETE], but starts the new animation at "
-"the last animation's playback position."
-msgstr ""
-"类似于 [constant BLEND_MODE_DISCRETE],但在最åŽä¸€ä¸ªåŠ¨ç”»çš„播放ä½ç½®å¼€å§‹æ–°çš„动"
-"画。"
-
msgid "[AnimationTree] node resource that contains many blend type nodes."
msgstr "[AnimationTree] 节点资æºï¼Œå…¶ä¸­åŒ…å«è®¸å¤šæ··åˆç±»åž‹èŠ‚点。"
@@ -2220,18 +3265,6 @@ msgid "Clears all queued, unplayed animations."
msgstr "清除所有已排队ã€æœªæ’­æ”¾çš„动画。"
msgid ""
-"Gets the actual playing speed of current animation or 0 if not playing. This "
-"speed is the [member playback_speed] property multiplied by "
-"[code]custom_speed[/code] argument specified when calling the [method play] "
-"method."
-msgstr ""
-"获å–当å‰åŠ¨ç”»çš„实际播放速度,如果没有播放则为0。这个速度是调用[method play]æ–¹"
-"法时指定的[member playback_speed]属性乘以[code]custom_speed[/code]å‚数。"
-
-msgid "Returns [code]true[/code] if playing an animation."
-msgstr "如果正在播放动画,则返回 [code]true[/code]。"
-
-msgid ""
"Queues an animation for playback once the current one is done.\n"
"[b]Note:[/b] If a looped animation is currently playing, the queued "
"animation will never play unless the looped animation is stopped somehow."
@@ -2388,11 +3421,6 @@ msgid ""
msgstr "如果为 [code]true[/code],该区域的音频总线将覆盖默认的音频总线。"
msgid ""
-"The falloff factor for point gravity. The greater the value, the faster "
-"gravity decreases with distance."
-msgstr "点é‡åŠ›çš„è¡°å‡ç³»æ•°ã€‚该值越大,é‡åŠ›å€¼éšè·ç¦»ä¸‹é™çš„速度就越快。"
-
-msgid ""
"The rate at which objects stop moving in this area. Represents the linear "
"velocity lost per second.\n"
"See [member ProjectSettings.physics/2d/default_linear_damp] for more details "
@@ -2489,6 +3517,9 @@ msgstr ""
msgid "A generic array datatype."
msgstr "通用数组数æ®ç±»åž‹ã€‚"
+msgid "Constructs an empty [Array]."
+msgstr "构造空的 [Array]。"
+
msgid ""
"Appends an element at the end of the array (alias of [method push_back])."
msgstr "å‘数组末尾追加一个元素([method push_back] 的别å)。"
@@ -3289,6 +4320,9 @@ msgid ""
"range from -30 to 0."
msgstr "é™åˆ¶å™¨å¼€å§‹ç”Ÿæ•ˆçš„阈值,以分è´ä¸ºå•ä½ã€‚值的范围å¯ä»¥ä»Ž -30 到 0。"
+msgid "Adds a low-pass filter to the audio bus."
+msgstr "å‘音频总线添加一个低通滤波器。"
+
msgid ""
"Cuts frequencies higher than the [member AudioEffectFilter.cutoff_hz] and "
"allows lower frequencies to pass."
@@ -3560,9 +4594,6 @@ msgid ""
msgstr ""
"返回分é…给给定总线和效果指数(以åŠå¯é€‰çš„通é“)的 [AudioEffectInstance]。"
-msgid "Returns the names of all audio devices detected on the system."
-msgstr "返回系统中检测到的所有音频设备的å称。"
-
msgid "Returns the sample rate at the output of the [AudioServer]."
msgstr "返回 [AudioServer] 输出的采样率。"
@@ -3596,19 +4627,6 @@ msgstr "解é”音频驱动程åºçš„主循环。(é”定åŽï¼Œä½ å§‹ç»ˆéœ€è¦æ‰‹
msgid "Number of available audio buses."
msgstr "å¯ç”¨éŸ³é¢‘总线的数é‡ã€‚"
-msgid ""
-"Name of the current device for audio output (see [method get_device_list]). "
-"On systems with multiple audio outputs (such as analog, USB and HDMI audio), "
-"this can be used to select the audio output device. The value "
-"[code]\"Default\"[/code] will play audio on the system-wide default audio "
-"output. If an invalid device name is set, the value will be reverted back to "
-"[code]\"Default\"[/code]."
-msgstr ""
-"当å‰éŸ³é¢‘输出设备åç§°ï¼ˆè§ [method get_device_list])。在具有多个音频输出的系统"
-"中(例如模拟ã€USBã€HDMI 音频),å¯ç”¨äºŽé€‰æ‹©éŸ³é¢‘输出设备。将值设为 "
-"[code]\"Default\"[/code] 则会从系统默认的音频输出播放音频。如果设置了无效的设"
-"备å称,该值会被æ¢å¤ä¸º [code]\"Default\"[/code]。"
-
msgid "Emitted when the [AudioBusLayout] changes."
msgstr "当 [AudioBusLayout] 改å˜æ—¶å‘出。"
@@ -3813,15 +4831,9 @@ msgstr ""
"é‡å®šå‘,使其在特定的音频总线中播放。一个例å­æ˜¯å¯ä»¥ç”¨æ¥åˆ¶ä½œâ€œæ°´åŸŸâ€ï¼Œå°†æ°´ä¸­æ’­æ”¾"
"的声音é‡å®šå‘至å•ç‹¬çš„音频总线,让声音å¬èµ·æ¥åƒæ˜¯åœ¨æ°´ä¸‹æ’­æ”¾ã€‚"
-msgid "Dampens audio over distance with this as an exponent."
-msgstr "以此为指数,将声音在è·ç¦»ä¸Šè¿›è¡Œè¡°å‡ã€‚"
-
msgid "Maximum distance from which audio is still hearable."
msgstr "音频ä»å¯å¬åˆ°çš„最大è·ç¦»ã€‚"
-msgid "Base volume without dampening."
-msgstr "基础音é‡ï¼Œæ— è¡°å‡ã€‚"
-
msgid "Plays positional sound in 3D space."
msgstr "在 3D 空间中播放与ä½ç½®ç›¸å…³çš„声音。"
@@ -3830,14 +4842,6 @@ msgid ""
"[AudioStreamPlayer3D]."
msgstr "返回与这个 [AudioStreamPlayer3D] 相关è”çš„ [AudioStreamPlayback] 对象。"
-msgid ""
-"Dampens audio using a low-pass filter above this frequency, in Hz. To "
-"disable the dampening effect entirely, set this to [code]20500[/code] as "
-"this frequency is above the human hearing limit."
-msgstr ""
-"使用高于此频率的低通滤波器衰å‡éŸ³é¢‘,以 Hz 为å•ä½ã€‚è¦å®Œå…¨ç¦ç”¨é˜»å°¼æ•ˆæžœï¼Œè¯·å°†å…¶"
-"设置为 [code]20500[/code],因为该频率高于人类å¬åŠ›æžé™ã€‚"
-
msgid "Amount how much the filter affects the loudness, in decibels."
msgstr "滤波器对å“度的影å“程度,以分è´ä¸ºå•ä½ã€‚"
@@ -3869,21 +4873,6 @@ msgstr ""
"校验。这是因为音频总线布局å¯ä»¥åœ¨è®¾ç½®è¿™ä¸ªå±žæ€§åŽå†åŠ è½½ã€‚如果这个给定的å称在è¿"
"行时无法解æžï¼Œå°±ä¼šå›žé€€åˆ° [code]\"Master\"[/code]。"
-msgid "The angle in which the audio reaches cameras undampened."
-msgstr "音频到达相机的角度,ä¸å—è¡°å‡ã€‚"
-
-msgid ""
-"If [code]true[/code], the audio should be dampened according to the "
-"direction of the sound."
-msgstr "如果为 [code]true[/code],则应根æ®å£°éŸ³çš„æ–¹å‘对音频进行衰å‡ã€‚"
-
-msgid ""
-"Dampens audio if camera is outside of [member emission_angle_degrees] and "
-"[member emission_angle_enabled] is set by this factor, in decibels."
-msgstr ""
-"如果样机在 [member emission_angle_degrees] 之外,并且 [member "
-"emission_angle_enabled] 被设置为这个系数,则对音频进行å‡å¼±ï¼Œå•ä½æ˜¯åˆ†è´ã€‚"
-
msgid "Sets the absolute maximum of the soundlevel, in decibels."
msgstr "设置声级的ç»å¯¹æœ€å¤§å€¼ï¼Œä»¥åˆ†è´ä¸ºå•ä½ã€‚"
@@ -3902,29 +4891,6 @@ msgid ""
"over a larger distance."
msgstr "è¡°å‡æ•ˆæžœçš„系数。更高的值使声音在更远的è·ç¦»å¯ä»¥å¬åˆ°ã€‚"
-msgid "The base sound level unaffected by dampening, in decibels."
-msgstr "ä¸å—阻尼影å“的基本声级,å•ä½ä¸ºåˆ†è´ã€‚"
-
-msgid "Linear dampening of loudness according to distance."
-msgstr "æ ¹æ®è·ç¦»å¯¹å“度进行线性衰å‡ã€‚"
-
-msgid "Squared dampening of loudness according to distance."
-msgstr "æ ¹æ®è·ç¦»å¯¹å“度进行平方衰å‡ã€‚"
-
-msgid "Logarithmic dampening of loudness according to distance."
-msgstr "æ ¹æ®è·ç¦»å¯¹æ•°é™ä½Žå“度。"
-
-msgid ""
-"No dampening of loudness according to distance. The sound will still be "
-"heard positionally, unlike an [AudioStreamPlayer]. [constant "
-"ATTENUATION_DISABLED] can be combined with a [member max_distance] value "
-"greater than [code]0.0[/code] to achieve linear attenuation clamped to a "
-"sphere of a defined size."
-msgstr ""
-"ä¸ä¼šæ ¹æ®è·ç¦»è¡°å‡å“度。与 [AudioStreamPlayer] ä¸åŒï¼Œå£°éŸ³ä»ä¼šåœ¨ä½ç½®ä¸Šè¢«å¬åˆ°ã€‚"
-"[constant ATTENUATION_DISABLED] å¯ä»¥ä¸Žå¤§äºŽ [code]0.0[/code] çš„ [member "
-"max_distance] 值结åˆä½¿ç”¨ï¼Œä»¥å®žçŽ°çº¿æ€§è¡°å‡ï¼Œé™åˆ¶åœ¨å®šä¹‰çš„çƒä½“大å°ã€‚"
-
msgid "Disables doppler tracking."
msgstr "ç¦ç”¨å¤šæ™®å‹’跟踪。"
@@ -4775,6 +5741,9 @@ msgstr "矩阵å˜æ¢æ¼”示"
msgid "2.5D Demo"
msgstr "2.5D 演示"
+msgid "Constructs a [Basis] as a copy of the given [Basis]."
+msgstr "构造给定 [Basis] 的副本。"
+
msgid "Constructs a pure rotation basis matrix from the given quaternion."
msgstr "æ ¹æ®ç»™å®šçš„四元数构造一个纯旋转基矩阵。"
@@ -4957,6 +5926,9 @@ msgstr "附ç€éª¨éª¼çš„å称。"
msgid "Boolean built-in type."
msgstr "布尔型内置型。"
+msgid "Constructs a [bool] as a copy of the given [bool]."
+msgstr "构造给定 [bool] 的副本。"
+
msgid ""
"Cast a [float] value to a boolean value, this method will return "
"[code]false[/code] if [code]0.0[/code] is passed in, and [code]true[/code] "
@@ -5057,6 +6029,12 @@ msgstr "返回当å‰æŒ‰ä¸‹çš„按钮。"
msgid "Emitted when one of the buttons of the group is pressed."
msgstr "当该组中的一个按钮被按下时触å‘。"
+msgid "Constructs an empty [Callable], with no object nor method bound."
+msgstr "构造空的 [Callable],没有绑定对象和方法。"
+
+msgid "Constructs a [Callable] as a copy of the given [Callable]."
+msgstr "构造给定 [Callable] 的副本。"
+
msgid "Calls the specified method after optional delay."
msgstr "在å¯é€‰çš„延迟之åŽè°ƒç”¨æŒ‡å®šçš„方法。"
@@ -5846,8 +6824,11 @@ msgstr ""
msgid "BBCode in RichTextLabel"
msgstr "RichTextLabel 中的 BBCode"
+msgid "RichTextEffect test project (third-party)"
+msgstr "RichTextEffect 测试项目(第三方)"
+
msgid "The color the character will be drawn with."
-msgstr "绘制角色所用的颜色。"
+msgstr "绘制字符所用的颜色。"
msgid ""
"Contains the arguments passed in the opening BBCode tag. By default, "
@@ -5875,6 +6856,18 @@ msgstr ""
"1)}\n"
"[/codeblock]"
+msgid ""
+"Number of glyphs in the grapheme cluster. This value is set in the first "
+"glyph of a cluster. Setting this property won't affect drawing."
+msgstr ""
+"字素簇中的字形数é‡ã€‚该值在簇的第一个字形中设置。设置此属性ä¸ä¼šå½±å“绘制。"
+
+msgid ""
+"Glyph flags. See [enum TextServer.GraphemeFlag] for more info. Setting this "
+"property won't affect drawing."
+msgstr ""
+"å­—å½¢æ ‡å¿—ã€‚è¯¦æƒ…è§ [enum TextServer.GraphemeFlag]。设置此属性ä¸ä¼šå½±å“绘制。"
+
msgid "The position offset the character will be drawn with (in pixels)."
msgstr "绘制字符的ä½ç½®å移é‡ï¼ˆä»¥åƒç´ ä¸ºå•ä½ï¼‰ã€‚"
@@ -6240,6 +7233,64 @@ msgid "GUI Drag And Drop Demo"
msgstr "GUI 拖放演示"
msgid ""
+"Constructs a default [Color] from opaque black. This is the same as "
+"[constant BLACK].\n"
+"[b]Note:[/b] in C#, constructs an empty color with all of its components set "
+"to [code]0.0[/code] (transparent black)."
+msgstr ""
+"用ä¸é€æ˜Žçš„黑色构造默认的 [Color],与 [constant BLACK] 相åŒã€‚\n"
+"[b]注æ„:[/b]在 C# 中构造的空颜色,其所有分é‡éƒ½ä¸º [code]0.0[/code](é€æ˜Ž"
+"黑)。"
+
+msgid "Constructs a [Color] as a copy of the given [Color]."
+msgstr "构造给定 [Color] 的副本。"
+
+msgid ""
+"Returns the linear interpolation between this color's components and [param "
+"to]'s components. The interpolation factor [param weight] should be between "
+"0.0 and 1.0 (inclusive). See also [method @GlobalScope.lerp].\n"
+"[codeblocks]\n"
+"[gdscript]\n"
+"var red = Color(1.0, 0.0, 0.0)\n"
+"var aqua = Color(0.0, 1.0, 0.8)\n"
+"\n"
+"red.lerp(aqua, 0.2) # Returns Color(0.8, 0.2, 0.16)\n"
+"red.lerp(aqua, 0.5) # Returns Color(0.5, 0.5, 0.4)\n"
+"red.lerp(aqua, 1.0) # Returns Color(0.0, 1.0, 0.8)\n"
+"[/gdscript]\n"
+"[csharp]\n"
+"var red = new Color(1.0f, 0.0f, 0.0f);\n"
+"var aqua = new Color(0.0f, 1.0f, 0.8f);\n"
+"\n"
+"red.Lerp(aqua, 0.2f); // Returns Color(0.8f, 0.2f, 0.16f)\n"
+"red.Lerp(aqua, 0.5f); // Returns Color(0.5f, 0.5f, 0.4f)\n"
+"red.Lerp(aqua, 1.0f); // Returns Color(0.0f, 1.0f, 0.8f)\n"
+"[/csharp]\n"
+"[/codeblocks]"
+msgstr ""
+"返回将该颜色的分é‡å’Œ [param to] 的分é‡è¿›è¡Œçº¿æ€§æ’值的结果。æ’值系数 [param "
+"weight] 应该在 0.0 å’Œ 1.0 之间(闭区间)。å¦è¯·å‚阅 [method @GlobalScope."
+"lerp]。\n"
+"[codeblocks]\n"
+"[gdscript]\n"
+"var red = Color(1.0, 0.0, 0.0)\n"
+"var aqua = Color(0.0, 1.0, 0.8)\n"
+"\n"
+"red.lerp(aqua, 0.2) # 返回 Color(0.8, 0.2, 0.16)\n"
+"red.lerp(aqua, 0.5) # 返回 Color(0.5, 0.5, 0.4)\n"
+"red.lerp(aqua, 1.0) # 返回 Color(0.0, 1.0, 0.8)\n"
+"[/gdscript]\n"
+"[csharp]\n"
+"var red = new Color(1.0f, 0.0f, 0.0f);\n"
+"var aqua = new Color(0.0f, 1.0f, 0.8f);\n"
+"\n"
+"red.Lerp(aqua, 0.2f); // 返回 Color(0.8f, 0.2f, 0.16f)\n"
+"red.Lerp(aqua, 0.5f); // 返回 Color(0.5f, 0.5f, 0.4f)\n"
+"red.Lerp(aqua, 1.0f); // 返回 Color(0.0f, 1.0f, 0.8f)\n"
+"[/csharp]\n"
+"[/codeblocks]"
+
+msgid ""
"The color's alpha component, typically on the range of 0 to 1. A value of 0 "
"means that the color is fully transparent. A value of 1 means that the color "
"is fully opaque."
@@ -7063,11 +8114,6 @@ msgstr ""
"ä¿¡å·ã€‚å‚阅常é‡æ¥äº†è§£æ¯ä¸ªå¸¸é‡çš„作用。"
msgid ""
-"The size of the node's bounding rectangle, in pixels. [Container] nodes "
-"update this property automatically."
-msgstr "节点边界矩形的大å°ï¼Œä»¥åƒç´ ä¸ºå•ä½ã€‚[Container] 节点会自动更新此属性。"
-
-msgid ""
"Tells the parent [Container] nodes how they should resize and place the node "
"on the X axis. Use one of the [enum SizeFlags] constants to change the "
"flags. See the constants to learn what each does."
@@ -8226,6 +9272,15 @@ msgstr "字典类型。"
msgid "GDScript basics: Dictionary"
msgstr "GDScript 基础:字典"
+msgid "Constructs an empty [Dictionary]."
+msgstr "构造空的 [Dictionary]。"
+
+msgid "Returns the list of keys in the dictionary."
+msgstr "返回该字典中的键列表。"
+
+msgid "Returns the list of values in this dictionary."
+msgstr "返回该字典中的值列表。"
+
msgid "Type used to handle the filesystem."
msgstr "用于处ç†æ–‡ä»¶ç³»ç»Ÿçš„类型。"
@@ -9476,6 +10531,37 @@ msgid ""
"project."
msgstr "在文件对è¯æ¡†ä¸­è®¾ç½®æœ¬é¡¹ç›®æœ€è¿‘访问过的文件夹列表。"
+msgid ""
+"The tint intensity to use for the subresources background in the Inspector "
+"dock. The tint is used to distinguish between different subresources in the "
+"inspector. Higher values result in a more noticeable background color "
+"difference."
+msgstr ""
+"检查器é¢æ¿ä¸­ï¼Œå­èµ„æºèƒŒæ™¯çš„ç€è‰²å¼ºåº¦ã€‚ç€è‰²ç”¨äºŽåŒºåˆ†æ£€æŸ¥å™¨ä¸­ä¸åŒçš„å­èµ„æºã€‚值越"
+"高,背景色差越容易区分。"
+
+msgid ""
+"The \"start\" stop of the color gradient to use for bones in the 2D skeleton "
+"editor."
+msgstr "2D 骨架编辑器中,骨骼颜色æ¸å˜çš„“开始â€ç‚¹ã€‚"
+
+msgid ""
+"The \"end\" stop of the color gradient to use for bones in the 2D skeleton "
+"editor."
+msgstr "2D 骨架编辑器中,骨骼颜色æ¸å˜çš„“结æŸâ€ç‚¹ã€‚"
+
+msgid ""
+"The color to use for inverse kinematics-enabled bones in the 2D skeleton "
+"editor."
+msgstr "2D 骨架编辑器中,用于å¯ç”¨äº†åå‘è¿åŠ¨å­¦çš„骨骼的颜色。"
+
+msgid ""
+"The outline color to use for non-selected bones in the 2D skeleton editor. "
+"See also [member editors/2d/bone_selected_color]."
+msgstr ""
+"2D 骨架编辑器中,用于未选中骨骼的轮廓颜色。å¦è§ [member editors/2d/"
+"bone_selected_color]。"
+
msgid "Emitted after any editor setting has changed."
msgstr "在编辑器设置改å˜åŽè§¦å‘。"
@@ -9932,6 +11018,44 @@ msgstr "è¦æ˜¾ç¤ºçš„最大图层 ID。åªæœ‰åœ¨ä½¿ç”¨ [constant BG_CANVAS] 背æ™
msgid "The background mode. See [enum BGMode] for possible values."
msgstr "背景模å¼ã€‚å¯èƒ½çš„å–å€¼è§ [enum BGMode]。"
+msgid ""
+"If set above [code]0.0[/code] (exclusive), blends between the fog's color "
+"and the color of the background [Sky]. This has a small performance cost "
+"when set above [code]0.0[/code]. Must have [member background_mode] set to "
+"[constant BG_SKY].\n"
+"This is useful to simulate [url=https://en.wikipedia.org/wiki/"
+"Aerial_perspective]aerial perspective[/url] in large scenes with low density "
+"fog. However, it is not very useful for high-density fog, as the sky will "
+"shine through. When set to [code]1.0[/code], the fog color comes completely "
+"from the [Sky]. If set to [code]0.0[/code], aerial perspective is disabled."
+msgstr ""
+"如果设置大于 [code]0.0[/code](ä¸å«ï¼‰ï¼Œä¼šåœ¨é›¾çš„颜色和背景 [Sky] 的颜色之间进"
+"行混åˆã€‚设置大于 [code]0.0[/code] 时有较å°çš„性能代价。必须将 [member "
+"background_mode] 设置为 [constant BG_SKY]。\n"
+"对于模拟雾密度较低的大场景中的[https://zh.wikipedia.org/wiki/"
+"%E7%A9%BA%E6%B0%94%E9%80%8F%E8%A7%86]空气é€è§†[/url]很有用。但对于高密度的雾æ¥"
+"说ä¸æ˜¯å¾ˆæœ‰ç”¨ï¼Œå› ä¸ºå¤©ç©ºä¼šè¢«ç…§äº®ã€‚设置为 [code]1.0[/code] 时,雾的颜色完全æ¥è‡ª "
+"[Sky]。设置为 [code]0.0[/code] 时,会ç¦ç”¨ç©ºæ°”é€è§†ã€‚"
+
+msgid "The fog's color."
+msgstr "雾的颜色。"
+
+msgid "The fog's brightness. Higher values result in brighter fog."
+msgstr "雾的亮度。值越高,雾越亮。"
+
+msgid ""
+"The factor to use when affecting the sky with non-volumetric fog. [code]1.0[/"
+"code] means that fog can fully obscure the sky. Lower values reduce the "
+"impact of fog on sky rendering, with [code]0.0[/code] not affecting sky "
+"rendering at all.\n"
+"[b]Note:[/b] [member fog_sky_affect] has no visual effect if [member "
+"fog_aerial_perspective] is [code]1.0[/code]."
+msgstr ""
+"éžä½“积雾影å“天空时使用的系数。[code]1.0[/code] 表示雾å¯ä»¥å®Œå…¨é®è”½å¤©ç©ºã€‚较低的"
+"值会å‡å°‘雾对天空渲染的影å“,[code]0.0[/code] 完全ä¸å½±å“天空的渲染。\n"
+"[b]注æ„:[/b]如果 [member fog_aerial_perspective] 为 [code]1.0[/code],"
+"[member fog_sky_affect] ä¸ä¼šæœ‰è§†è§‰æ•ˆæžœã€‚"
+
msgid "The glow blending mode."
msgstr "辉光混åˆæ¨¡å¼ã€‚"
@@ -9942,6 +11066,9 @@ msgstr ""
"泛光的强度。如果设置为大于 [code]0[/code] 的值,则将在比 [member "
"glow_hdr_threshold] æˆå‘˜æ›´æš—的区域中显示辉光。"
+msgid "If [code]true[/code], the glow effect is enabled."
+msgstr "如果为 [code]true[/code],则å¯ç”¨è¾‰å…‰æ•ˆæžœã€‚"
+
msgid ""
"The higher threshold of the HDR glow. Areas brighter than this threshold "
"will be clamped for the purposes of the glow effect."
@@ -9952,6 +11079,31 @@ msgid "The bleed scale of the HDR glow."
msgstr "HDR 辉光的逸出缩放。"
msgid ""
+"The intensity of the 1st level of glow. This is the most \"local\" level "
+"(least blurry)."
+msgstr "第 1 级辉光的强度。这是最“局部â€çš„级别(最ä¸æ¨¡ç³Šï¼‰ã€‚"
+
+msgid "The intensity of the 2nd level of glow."
+msgstr "第 2 级辉光的强度。"
+
+msgid "The intensity of the 3rd level of glow."
+msgstr "第 3 级辉光的强度。"
+
+msgid "The intensity of the 4th level of glow."
+msgstr "第 4 级辉光的强度。"
+
+msgid "The intensity of the 5th level of glow."
+msgstr "第 5 级辉光的强度。"
+
+msgid "The intensity of the 6th level of glow."
+msgstr "第 6 级辉光的强度。"
+
+msgid ""
+"The intensity of the 7th level of glow. This is the most \"global\" level "
+"(blurriest)."
+msgstr "第 7 级辉光的强度。这是最“全局â€çš„级别(最模糊)。"
+
+msgid ""
"The screen-space ambient occlusion intensity on materials that have an AO "
"texture defined. Values higher than [code]0[/code] will make the SSAO effect "
"visible in areas darkened by AO textures."
@@ -10313,12 +11465,18 @@ msgstr "应用于文件图标的颜色调制。"
msgid "The color modulation applied to the folder icon."
msgstr "应用于文件夹图标的颜色调制。"
+msgid "Custom icon for the back arrow."
+msgstr "å‘åŽç®­å¤´çš„自定义图标。"
+
msgid "Custom icon for files."
msgstr "文件的自定义图标。"
msgid "Custom icon for folders."
msgstr "文件夹的自定义图标。"
+msgid "Custom icon for the forward arrow."
+msgstr "å‘å‰ç®­å¤´çš„自定义图标。"
+
msgid "Custom icon for the parent folder arrow."
msgstr "父文件夹箭头的自定义图标。"
@@ -10331,12 +11489,55 @@ msgstr "切æ¢éšè—按钮的自定义图标。"
msgid "Float built-in type."
msgstr "浮点数内置类型。"
+msgid ""
+"The [float] built-in type is a 64-bit double-precision floating-point "
+"number, equivalent to [code]double[/code] in C++. This type has 14 reliable "
+"decimal digits of precision. The [float] type can be stored in [Variant], "
+"which is the generic type used by the engine. The maximum value of [float] "
+"is approximately [code]1.79769e308[/code], and the minimum is approximately "
+"[code]-1.79769e308[/code].\n"
+"Many methods and properties in the engine use 32-bit single-precision "
+"floating-point numbers instead, equivalent to [code]float[/code] in C++, "
+"which have 6 reliable decimal digits of precision. For data structures such "
+"as [Vector2] and [Vector3], Godot uses 32-bit floating-point numbers by "
+"default, but it can be changed to use 64-bit doubles if Godot is compiled "
+"with the [code]precision=double[/code] option.\n"
+"Math done using the [float] type is not guaranteed to be exact or "
+"deterministic, and will often result in small errors. You should usually use "
+"the [method @GlobalScope.is_equal_approx] and [method @GlobalScope."
+"is_zero_approx] methods instead of [code]==[/code] to compare [float] values "
+"for equality."
+msgstr ""
+"[float] 内置类型是 64 ä½åŒç²¾åº¦æµ®ç‚¹æ•°ï¼Œç›¸å½“于 C++ 中的 [code]double[/code]。这"
+"个类型有 14 个å¯é çš„å进制å°æ•°ä½ç²¾åº¦ã€‚å¯ä»¥åœ¨å¼•æ“Žæ‰€ä½¿ç”¨çš„通用类型 [Variant] 中"
+"存储 [float] 类型。[float] 的最大值约为 [code]1.79769e308[/code],最å°å€¼çº¦ä¸º "
+"[code]-1.79769e308[/code]。\n"
+"ä¸è¿‡å¼•æ“Žä¸­çš„大多数方法和属性使用的都是 32 ä½å•ç²¾åº¦æµ®ç‚¹æ•°ï¼Œç›¸å½“于 C++ 中的 "
+"[code]float[/code],有 6 ä½å¯é çš„å进制å°æ•°ä½ç²¾åº¦ã€‚Godot 在 [Vector2] å’Œ "
+"[Vector3] 等数æ®ç»“构中默认使用 32 ä½æµ®ç‚¹æ•°ï¼Œä½†å¦‚æžœ Godot 编译时使用了 "
+"[code]precision=double[/code] 选项,就会改为 64 ä½ double。\n"
+"使用 [float] 类型进行的数学è¿ç®—无法ä¿è¯ç²¾ç¡®ä¸Žç¨³å®šï¼Œç»å¸¸ä¼šäº§ç”Ÿè¾ƒå°çš„误差。你通"
+"常应该使用 [method @GlobalScope.is_equal_approx] 和 [method @GlobalScope."
+"is_zero_approx] 方法æ¥æ¯”较 [float] 值是å¦ç›¸ç­‰ï¼Œä¸åº”该用 [code]==[/code]。"
+
msgid "Wikipedia: Double-precision floating-point format"
msgstr "维基百科:åŒç²¾åº¦æµ®ç‚¹æ•°æ ¼å¼"
msgid "Wikipedia: Single-precision floating-point format"
msgstr "维基百科:å•ç²¾åº¦æµ®ç‚¹æ•°æ ¼å¼"
+msgid "Constructs a default-initialized [float] set to [code]0.0[/code]."
+msgstr "构造默认åˆå§‹åŒ–çš„ [float],会被设为 [code]0.0[/code]。"
+
+msgid "Constructs a [float] as a copy of the given [float]."
+msgstr "构造给定 [float] 的副本。"
+
+msgid ""
+"Converts a [String] to a [float], following the same rules as [method String."
+"to_float]."
+msgstr ""
+"å°† [String] 转æ¢ä¸º [float],éµå¾ªä¸Ž [method String.to_float] 相åŒçš„规则。"
+
msgid ""
"Cast a [bool] value to a floating-point value, [code]float(true)[/code] will "
"be equal to 1.0 and [code]float(false)[/code] will be equal to 0.0."
@@ -10344,6 +11545,12 @@ msgstr ""
"å°† [bool] 值转æ¢ä¸ºæµ®ç‚¹å€¼ï¼Œ[code]float(true)[/code] 将等于 1.0,"
"[code]float(false)[/code] 将等于 0.0。"
+msgid ""
+"Cast an [int] value to a floating-point value, [code]float(1)[/code] will be "
+"equal to [code]1.0[/code]."
+msgstr ""
+"å°† [int] 值转æ¢ä¸ºæµ®ç‚¹å€¼ï¼Œ[code]float(1)[/code] 将等于 [code]1.0[/code]。"
+
msgid "Base class for flow containers."
msgstr "æµå¼å®¹å™¨çš„基类。"
@@ -10369,6 +11576,9 @@ msgstr "å­èŠ‚点的垂直分隔é‡ã€‚"
msgid "Returns the font ascent (number of pixels above the baseline)."
msgstr "返回字体的上å‡å¹…度(超出基线的åƒç´ æ•°ï¼‰ã€‚"
+msgid "Returns the font descent (number of pixels below the baseline)."
+msgstr "返回字体的å‡å°‘é‡ï¼ˆä½ŽäºŽåŸºçº¿çš„åƒç´ æ•°ï¼‰ã€‚"
+
msgid "A script implemented in the GDScript programming language."
msgstr "用 GDScript 编程语言实现的脚本。"
@@ -10443,11 +11653,6 @@ msgid ""
"the X axis."
msgstr "正方å‘的最å°æ—‹è½¬ï¼Œä»¥æŒ£è„±å¹¶ç»• X 轴旋转。"
-msgid ""
-"The amount of rotational damping across the Y axis. The lower, the more "
-"dampening occurs."
-msgstr "Y 轴上的旋转阻尼é‡ã€‚值越低,旋转的阻尼就越大。"
-
msgid "If [code]true[/code], rotation across the Y axis is limited."
msgstr "如果为 [code]true[/code],则跨越 Y 轴的旋转将å—到é™åˆ¶ã€‚"
@@ -10480,11 +11685,6 @@ msgid ""
"the Y axis."
msgstr "正方å‘的最å°æ—‹è½¬ï¼Œä»¥æŒ£è„±å¹¶ç»• Y 轴旋转。"
-msgid ""
-"The amount of rotational damping across the Z axis. The lower, the more "
-"dampening occurs."
-msgstr "跨越 Z 轴的旋转阻尼é‡ã€‚值越低,阻尼就越多。"
-
msgid "If [code]true[/code], rotation across the Z axis is limited."
msgstr "如果为 [code]true[/code],则跨越 Z 轴的旋转将å—到é™åˆ¶ã€‚"
@@ -10697,11 +11897,6 @@ msgid "The speed of all rotations across the axes."
msgstr "所有跨轴旋转的速度。"
msgid ""
-"The amount of rotational damping across the axes. The lower, the more "
-"dampening occurs."
-msgstr "跨越 Z 轴的旋转阻尼é‡ã€‚值越低,å‘生的阻尼就越多。"
-
-msgid ""
"The amount of rotational restitution across the axes. The lower, the more "
"restitution occurs."
msgstr "在å„轴上的旋转æ¢å¤é‡ã€‚值越低,å‘生的æ¢å¤é‡è¶Šå¤§ã€‚"
@@ -11178,10 +12373,10 @@ msgid ""
msgstr "当用户改å˜æ»šåŠ¨å移é‡æ—¶å‘出。在代ç ä¸­æ”¹å˜æ»šåŠ¨å移é‡æ—¶ï¼Œå®ƒä¸ä¼šè¢«è§¦å‘。"
msgid "Color of major grid lines."
-msgstr "主网格线æ¡é¢œè‰²ã€‚"
+msgstr "主è¦æ …格线的颜色。"
msgid "Color of minor grid lines."
-msgstr "次è¦ç½‘格线的颜色。"
+msgstr "次è¦æ …格线的颜色。"
msgid "The fill color of the selection rectangle."
msgstr "选定的矩形的填充颜色。"
@@ -11202,7 +12397,7 @@ msgid "The icon for the snap toggle button."
msgstr "å¸é™„动按钮的图标。"
msgid "The background drawn under the grid."
-msgstr "绘制在网格下方的背景。"
+msgstr "绘制在栅格下方的背景。"
msgid "Disables all input and output slots of the GraphNode."
msgstr "ç¦ç”¨ GraphNode 的所有输入和输出槽。"
@@ -11341,7 +12536,7 @@ msgstr "[GraphNode] 被选中时使用的背景。"
msgid ""
"Grid container used to arrange Control-derived children in a grid like "
"layout."
-msgstr "网格容器,用于将派生自 Control çš„å­èŠ‚点按照类似网格的形å¼æŽ’列。"
+msgstr "栅格容器,用于将派生自 Control çš„å­èŠ‚点按照类似栅格的形å¼æŽ’列。"
msgid ""
"GridContainer will arrange its Control-derived children in a grid like "
@@ -11355,10 +12550,10 @@ msgid ""
"[b]Note:[/b] GridContainer only works with child nodes inheriting from "
"Control. It won't rearrange child nodes inheriting from Node2D."
msgstr ""
-"GridContainer 将把它的 Control 派生的å­èŠ‚点排布在一个类似网格的结构中,网格的"
+"GridContainer 将把它的 Control 派生的å­èŠ‚点排布在一个类似栅格的结构中,栅格的"
"列数由 [member columns] 属性指定,行数等于容器中å­èŠ‚点的数é‡é™¤ä»¥åˆ—数。例如,"
"如果容器有 5 个å­èŠ‚点ã€2 列,那么容器中就会有 3 行。\n"
-"请注æ„,网格布局将ä¿ç•™æ¯ä¸ªå¤§å°çš„容器的列和行,并且空列将自动扩展。\n"
+"请注æ„,栅格布局将ä¿ç•™æ¯ä¸ªå¤§å°çš„容器的列和行,并且空列将自动扩展。\n"
"[b]注æ„:[/b]GridContainer åªå¯¹ç»§æ‰¿è‡ª Control çš„å­èŠ‚点生效。它ä¸ä¼šé‡æ–°æŽ’列继"
"承自 Node2D çš„å­èŠ‚点。"
@@ -12507,6 +13702,13 @@ msgstr "图åƒæ•°æ®ç±»åž‹ã€‚"
msgid "Importing images"
msgstr "导入图åƒ"
+msgid ""
+"Converts a bump map to a normal map. A bump map provides a height offset per-"
+"pixel, while a normal map provides a normal direction per pixel."
+msgstr ""
+"将凹凸贴图转æ¢ä¸ºæ³•çº¿è´´å›¾ã€‚凹凸贴图æä¾›æ¯ä¸ªåƒç´ çš„高度å移,而法线贴图æä¾›æ¯ä¸ª"
+"åƒç´ çš„法线方å‘。"
+
msgid "Removes the image's mipmaps."
msgstr "删除图åƒçš„多级æ¸è¿œçº¹ç†ã€‚"
@@ -13630,7 +14832,7 @@ msgid ""
"code with [method add_action] and [method action_add_event]. See [method "
"Node._input]."
msgstr ""
-"管ç†æ‰€æœ‰çš„ [InputEventAction],å¯ä»¥é€šè¿‡é¡¹ç›®è®¾ç½®èœå•[b]项目 > 项目设置 > é”®ä½"
+"管ç†æ‰€æœ‰çš„ [InputEventAction],å¯ä»¥é€šè¿‡é¡¹ç›®è®¾ç½®èœå•[b]项目 > 项目设置 > 输入"
"映射[/b]或在代ç ä¸­ç”¨ [method add_action] å’Œ [method action_add_event] 创建/ä¿®"
"改。请å‚阅 [method Node._input]。"
@@ -13704,6 +14906,9 @@ msgstr ""
msgid "Integer built-in type."
msgstr "整数内置类型。"
+msgid "Constructs an [int] as a copy of the given [int]."
+msgstr "构造给定 [int] 的副本。"
+
msgid ""
"Cast a [bool] value to an integer value, [code]int(true)[/code] will be "
"equals to 1 and [code]int(false)[/code] will be equals to 0."
@@ -13741,6 +14946,13 @@ msgstr ""
"}\n"
"[/codeblock]"
+msgid ""
+"Returns resolved addresses, or an empty array if an error happened or "
+"resolution didn't happen yet (see [method get_resolve_item_status])."
+msgstr ""
+"如果å‘生错误或尚未å‘生解æžï¼Œåˆ™è¿”回已解æžçš„地å€æˆ–空数组(请å‚阅 [method "
+"get_resolve_item_status])。"
+
msgid "DNS hostname resolver status: No status."
msgstr "DNS 主机å解æžå™¨çŠ¶æ€ï¼šæ— çŠ¶æ€ã€‚"
@@ -15454,16 +16666,6 @@ msgstr ""
"[b]注æ„:[/b]如果线程已ç»æ‹¥æœ‰äº’æ–¥é”的所有æƒï¼Œè¯¥å‡½æ•°å°†æ— é˜»å¡žåœ°è¿”回。"
msgid ""
-"Tries locking this [Mutex], but does not block. Returns [constant OK] on "
-"success, [constant ERR_BUSY] otherwise.\n"
-"[b]Note:[/b] This function returns [constant OK] if the thread already has "
-"ownership of the mutex."
-msgstr ""
-"试图é”定此 [Mutex],但并ä¸é˜»å¡žã€‚æˆåŠŸæ—¶è¿”回 [constant OK],å¦åˆ™è¿”回 [constant "
-"ERR_BUSY]。\n"
-"[b]注æ„:[/b]如果线程已ç»æ‹¥æœ‰äº†è¯¥ Mutex 的所有æƒï¼Œè¯¥å‡½æ•°è¿”回 [constant OK]。"
-
-msgid ""
"Unlocks this [Mutex], leaving it to other threads.\n"
"[b]Note:[/b] If a thread called [method lock] or [method try_lock] multiple "
"times while already having ownership of the mutex, it must also call [method "
@@ -15474,30 +16676,6 @@ msgstr ""
"[method try_lock],它也必须调用相åŒæ¬¡æ•°çš„ [method unlock] æ‰èƒ½æ­£ç¡®è§£é”."
msgid ""
-"Returns this agent's current path from start to finish in global "
-"coordinates. The path only updates when the target location is changed or "
-"the agent requires a repath. The path array is not intended to be used in "
-"direct path movement as the agent has its own internal path logic that would "
-"get corrupted by changing the path array manually. Use the intended [method "
-"get_next_location] once every physics frame to receive the next path point "
-"for the agents movement as this function also updates the internal path "
-"logic."
-msgstr ""
-"返回这个代ç†ä»Žèµ·ç‚¹åˆ°ç»ˆç‚¹çš„当å‰è·¯å¾„,使用全局å标。该路径åªä¼šåœ¨ç›®æ ‡ä½ç½®å‘生å˜"
-"化,或者代ç†è¦æ±‚é‡æ–°è®¡ç®—路径时更新。路径数组ä¸åº”直接用作移动路径,代ç†æœ‰å…¶å†…"
-"部的路径逻辑,手动修改路径数组å¯èƒ½ä¼šé€ æˆç ´å。请在æ¯ä¸€ä¸ªç‰©ç†å¸§ä¸­è°ƒç”¨ä¸€æ¬¡ "
-"[method get_next_location] 获å–该代ç†çš„下一个路径点,这个函数会更新其内部的路"
-"径逻辑。"
-
-msgid ""
-"Returns the reachable final location in global coordinates. This can change "
-"if the navigation path is altered in any way. Because of this, it would be "
-"best to check this each frame."
-msgstr ""
-"返回å¯åˆ°è¾¾çš„最终ä½ç½®çš„全局å标。如果导航路径由于任何原因å‘生改å˜ï¼Œè¿™ä¸ªä½ç½®ä¹Ÿ"
-"å¯èƒ½å‘生å˜åŒ–。因此,最好æ¯ä¸€å¸§éƒ½æ£€æŸ¥ä¸€ä¸‹ã€‚"
-
-msgid ""
"Returns the [RID] of the navigation map for this NavigationAgent node. This "
"function returns always the map set on the NavigationAgent node and not the "
"map of the abstract agent on the NavigationServer. If the agent map is "
@@ -15513,17 +16691,6 @@ msgstr ""
"NavigationAgent 的导航地图,能够åŒæ—¶åœ¨ NavigationServer 上的代ç†ã€‚"
msgid ""
-"Returns the next location in global coordinates that can be moved to, making "
-"sure that there are no static objects in the way. If the agent does not have "
-"a navigation path, it will return the position of the agent's parent. The "
-"use of this function once every physics frame is required to update the "
-"internal path logic of the NavigationAgent."
-msgstr ""
-"返回å¯ä»¥ç§»åŠ¨è‡³çš„下一个ä½ç½®ï¼Œä½¿ç”¨å…¨å±€å标,确ä¿ä¸­é€”没有é™æ€ç‰©ä½“阻挡。如果代ç†"
-"没有导航路径,则会返回代ç†çˆ¶èŠ‚点的ä½ç½®ã€‚必须在æ¯ä¸ªç‰©ç†å¸§éƒ½è°ƒç”¨ä¸€æ¬¡è¿™ä¸ªå‡½æ•°ï¼Œ"
-"更新 NavigationAgent 内部的路径逻辑。"
-
-msgid ""
"Sets the [RID] of the navigation map this NavigationAgent node should use "
"and also updates the [code]agent[/code] on the NavigationServer."
msgstr ""
@@ -15562,14 +16729,6 @@ msgstr ""
"å…¥é‡æ–°å¯»è·¯çš„死循环,因为它在æ¯æ¬¡ç‰©ç†å¸§æ›´æ–°åŽéƒ½ä¼šè¶…过或者到ä¸äº†ä¸‹ä¸€ä¸ªç‚¹ã€‚"
msgid ""
-"The maximum distance the agent is allowed away from the ideal path to the "
-"final location. This can happen due to trying to avoid collisions. When the "
-"maximum distance is exceeded, it recalculates the ideal path."
-msgstr ""
-"å…许代ç†å离ç†æƒ³è·¯å¾„的最大è·ç¦»ã€‚å¯èƒ½ä¸ºäº†é˜²æ’žè€Œäº§ç”Ÿå离。超出最大è·ç¦»æ—¶ï¼Œä¼šé‡"
-"新计算ç†æƒ³è·¯å¾„。"
-
-msgid ""
"The distance threshold before the final target point is considered to be "
"reached. This will allow an agent to not have to hit the point of the final "
"target exactly, but only the area. If this value is set to low the "
@@ -15581,9 +16740,6 @@ msgstr ""
"终的目标,到达该区域内å³å¯ã€‚如果这个值设得太å°ï¼Œè¯¥ NavigationAgent 将陷入é‡æ–°"
"寻路的死循环,因为它在æ¯æ¬¡ç‰©ç†å¸§æ›´æ–°åŽéƒ½ä¼šè¶…过或者到ä¸äº†æœ€ç»ˆçš„目标点。"
-msgid "Notifies when the final location is reached."
-msgstr "抵达终点ä½ç½®æ—¶å‘出通知。"
-
msgid ""
"The NavigationAgent height offset is subtracted from the y-axis value of any "
"vector path position for this NavigationAgent. The NavigationAgent height "
@@ -16834,6 +17990,17 @@ msgstr "预先解æžçš„场景树路径。"
msgid "2D Role Playing Game Demo"
msgstr "2D 角色扮演游æˆæ¼”示"
+msgid "Constructs an empty [NodePath]."
+msgstr "构造空的 [NodePath]。"
+
+msgid ""
+"Constructs a [NodePath] as a copy of the given [NodePath]. "
+"[code]NodePath(\"example\")[/code] is equivalent to [code]^\"example\"[/"
+"code]."
+msgstr ""
+"构造给定 [NodePath] 的副本。[code]NodePath(\"example\")[/code] 等价于 "
+"[code]^\"example\"[/code]。"
+
msgid ""
"Returns [code]true[/code] if the node path is absolute (as opposed to "
"relative), which means that it starts with a slash character ([code]/[/"
@@ -17164,22 +18331,6 @@ msgstr ""
"[b]注æ„:[/b] 线程 ID ä¸æ˜¯ç¡®å®šçš„,也许会在应用程åºé‡æ–°å¯åŠ¨æ—¶è¢«é‡å¤ä½¿ç”¨ã€‚"
msgid ""
-"Returns [code]true[/code] if the Godot binary used to run the project is a "
-"[i]debug[/i] export template, or when running in the editor.\n"
-"Returns [code]false[/code] if the Godot binary used to run the project is a "
-"[i]release[/i] export template.\n"
-"To check whether the Godot binary used to run the project is an export "
-"template (debug or release), use [code]OS.has_feature(\"standalone\")[/code] "
-"instead."
-msgstr ""
-"如果用于è¿è¡Œé¡¹ç›®çš„ Godot 二进制文件是[i]调试[/i]导出模æ¿ï¼Œæˆ–是在编辑器中è¿è¡Œ"
-"时,则返回 [code]true[/code]。\n"
-"如果用于è¿è¡Œé¡¹ç›®çš„ Godot 二进制文件是[i]å‘布[/i]导出模æ¿ï¼Œåˆ™è¿”回 "
-"[code]false[/code]。\n"
-"è¦æ£€æŸ¥ç”¨äºŽè¿è¡Œé¡¹ç›®çš„ Godot 二进制文件是å¦ä¸ºå¯¼å‡ºæ¨¡æ¿ï¼ˆè°ƒè¯•æˆ–å‘布),请使用 "
-"[code]OS.has_feature(\"standalone\")[/code] 代替。"
-
-msgid ""
"At the moment this function is only used by [code]AudioDriverOpenSL[/code] "
"to request permission for [code]RECORD_AUDIO[/code] on Android."
msgstr ""
@@ -17237,6 +18388,13 @@ msgstr "图片目录路径。"
msgid "Ringtones directory path."
msgstr "铃声目录路径。"
+msgid "Constructs an empty [PackedByteArray]."
+msgstr "构造空的 [PackedByteArray]。"
+
+msgid ""
+"Constructs a [PackedByteArray] as a copy of the given [PackedByteArray]."
+msgstr "构造给定 [PackedByteArray] 的副本。"
+
msgid ""
"Assigns the given value to all elements in the array. This can typically be "
"used together with [method resize] to create an array with a given size and "
@@ -17272,15 +18430,52 @@ msgstr "改å˜ç»™å®šç´¢å¼•å¤„的字节。"
msgid "Sorts the elements of the array in ascending order."
msgstr "将该数组中的元素按å‡åºæŽ’列。"
+msgid "Constructs an empty [PackedColorArray]."
+msgstr "构造空的 [PackedColorArray]。"
+
+msgid ""
+"Constructs a [PackedColorArray] as a copy of the given [PackedColorArray]."
+msgstr "构造给定 [PackedColorArray] 的副本。"
+
msgid "Appends a value to the array."
msgstr "将一个值添加到数组中。"
msgid "Changes the [Color] at the given index."
msgstr "更改给定索引处的 [Color]。"
+msgid "Constructs an empty [PackedFloat32Array]."
+msgstr "构造空的 [PackedFloat32Array]。"
+
+msgid ""
+"Constructs a [PackedFloat32Array] as a copy of the given "
+"[PackedFloat32Array]."
+msgstr "构造给定 [PackedFloat32Array] 的副本。"
+
msgid "Changes the float at the given index."
msgstr "更改给定索引处的浮点数。"
+msgid "Constructs an empty [PackedFloat64Array]."
+msgstr "构造空的 [PackedFloat64Array]。"
+
+msgid ""
+"Constructs a [PackedFloat64Array] as a copy of the given "
+"[PackedFloat64Array]."
+msgstr "构造给定 [PackedFloat64Array] 的副本。"
+
+msgid "Constructs an empty [PackedInt32Array]."
+msgstr "构造空的 [PackedInt32Array]。"
+
+msgid ""
+"Constructs a [PackedInt32Array] as a copy of the given [PackedInt32Array]."
+msgstr "构造给定 [PackedInt32Array] 的副本。"
+
+msgid "Constructs an empty [PackedInt64Array]."
+msgstr "构造空的 [PackedInt64Array]。"
+
+msgid ""
+"Constructs a [PackedInt64Array] as a copy of the given [PackedInt64Array]."
+msgstr "构造给定 [PackedInt64Array] 的副本。"
+
msgid "An abstraction of a serialized scene."
msgstr "对åºåˆ—化场景的抽象。"
@@ -17318,6 +18513,13 @@ msgstr ""
"化的情况。\n"
"[b]注æ„:[/b]仅在编辑器构建中å¯ç”¨ã€‚"
+msgid "Constructs an empty [PackedStringArray]."
+msgstr "构造空的 [PackedStringArray]。"
+
+msgid ""
+"Constructs a [PackedStringArray] as a copy of the given [PackedStringArray]."
+msgstr "构造给定 [PackedStringArray] 的副本。"
+
msgid "Appends a string element at end of the array."
msgstr "在数组的末尾追加字符串元素。"
@@ -17327,12 +18529,28 @@ msgstr "更改给定索引处的 [String]。"
msgid "2D Navigation Astar Demo"
msgstr "2D A 星导航演示"
+msgid "Constructs an empty [PackedVector2Array]."
+msgstr "构造空的 [PackedVector2Array]。"
+
+msgid ""
+"Constructs a [PackedVector2Array] as a copy of the given "
+"[PackedVector2Array]."
+msgstr "构造给定 [PackedVector2Array] 的副本。"
+
msgid "Inserts a [Vector2] at the end."
msgstr "在末尾æ’入一个 [Vector2]。"
msgid "Changes the [Vector2] at the given index."
msgstr "更改给定索引处的 [Vector2]。"
+msgid "Constructs an empty [PackedVector3Array]."
+msgstr "构造空的 [PackedVector3Array]。"
+
+msgid ""
+"Constructs a [PackedVector3Array] as a copy of the given "
+"[PackedVector3Array]."
+msgstr "构造给定 [PackedVector3Array] 的副本。"
+
msgid "Inserts a [Vector3] at the end."
msgstr "在末尾æ’入一个 [Vector3]。"
@@ -17798,6 +19016,65 @@ msgstr ""
msgid "The body's mass."
msgstr "实体的质é‡ã€‚"
+msgid ""
+"The sky's overall brightness multiplier. Higher values result in a brighter "
+"sky."
+msgstr "天空整体亮度的乘数。数值越高,天空就越亮。"
+
+msgid ""
+"Modulates the [Color] on the bottom half of the sky to represent the ground."
+msgstr "调制天空下åŠéƒ¨åˆ†çš„ [Color],这部分代表地é¢ã€‚"
+
+msgid ""
+"Controls the strength of [url=https://en.wikipedia.org/wiki/"
+"Mie_scattering]Mie scattering[/url] for the sky. Mie scattering results from "
+"light colliding with larger particles (like water). On earth, Mie scattering "
+"results in a whitish color around the sun and horizon."
+msgstr ""
+"控制天空中[url=https://zh.wikipedia.org/wiki/"
+"%E7%B1%B3%E6%B0%8F%E6%95%A3%E5%B0%84]ç±³æ°æ•£å°„[/url]的强度。米æ°æ•£å°„是光与较大"
+"çš„ç²’å­ï¼ˆä¾‹å¦‚水)碰撞的结果。在地çƒä¸Šï¼Œç±³æ°æ•£å°„的结果是太阳和地平线周围的颜色"
+"å‘白。"
+
+msgid ""
+"Controls the [Color] of the [url=https://en.wikipedia.org/wiki/"
+"Mie_scattering]Mie scattering[/url] effect. While not physically accurate, "
+"this allows for the creation of alien-looking planets."
+msgstr ""
+"控制天空中[url=https://zh.wikipedia.org/wiki/"
+"%E7%B1%B3%E6%B0%8F%E6%95%A3%E5%B0%84]ç±³æ°æ•£å°„[/url]效果的 [Color]。虽然在物ç†"
+"上并ä¸å‡†ç¡®ï¼Œä½†å¯ä»¥åˆ›é€ å‡ºçœ‹ä¸ŠåŽ»åƒçš„外星çƒçš„天空。"
+
+msgid ""
+"Controls the direction of the [url=https://en.wikipedia.org/wiki/"
+"Mie_scattering]Mie scattering[/url]. A value of [code]1[/code] means that "
+"when light hits a particle it's passing through straight forward. A value of "
+"[code]-1[/code] means that all light is scatter backwards."
+msgstr ""
+"控制[url=https://zh.wikipedia.org/wiki/%E7%B1%B3%E6%B0%8F%E6%95%A3%E5%B0%84]"
+"ç±³æ°æ•£å°„[/url]çš„æ–¹å‘。值为 [code]1[/code] 表示当光照到粒å­æ—¶ä¼šç›´æŽ¥ç©¿è¿‡ã€‚值为"
+"[code]-1[/code] 表示所有的光都是å‘åŽæ•£å°„的。"
+
+msgid ""
+"Controls the strength of the [url=https://en.wikipedia.org/wiki/"
+"Rayleigh_scattering]Rayleigh scattering[/url]. Rayleigh scattering results "
+"from light colliding with small particles. It is responsible for the blue "
+"color of the sky."
+msgstr ""
+"控制[url=https://zh.wikipedia.org/zh/%E7%91%9E%E5%88%A9%E6%95%A3%E5%B0%84]瑞"
+"利散射[/url]的强度。瑞利散射是光与较å°ç²’å­ç¢°æ’žçš„结果,是天空呈è“色的原因。"
+
+msgid ""
+"Controls the [Color] of the [url=https://en.wikipedia.org/wiki/"
+"Rayleigh_scattering]Rayleigh scattering[/url]. While not physically "
+"accurate, this allows for the creation of alien-looking planets. For "
+"example, setting this to a red [Color] results in a Mars-looking atmosphere "
+"with a corresponding blue sunset."
+msgstr ""
+"控制[url=https://zh.wikipedia.org/zh/%E7%91%9E%E5%88%A9%E6%95%A3%E5%B0%84]瑞"
+"利散射[/url]çš„ [Color]。虽然在物ç†ä¸Šå¹¶ä¸å‡†ç¡®ï¼Œä½†å¯ä»¥åˆ›é€ å‡ºçœ‹ä¸ŠåŽ»åƒçš„外星çƒçš„"
+"天空。例如,将其设为红色 [Color],å¯ä»¥å¾—到ç«æ˜Ÿå¤§æ°”的外观,日è½æ—¶ä¸ºè“色。"
+
msgid "Base class for all objects affected by physics in 2D space."
msgstr "2D空间中所有å—物ç†å½±å“的对象的基类。"
@@ -18351,21 +19628,6 @@ msgid ""
"a center point."
msgstr "常é‡ï¼Œç”¨äºŽè®¾ç½®/获å–区域中的é‡åŠ›å‘é‡æ˜¯æ–¹å‘,还是中心点。"
-msgid ""
-"Constant to set/get the falloff factor for point gravity of an area. The "
-"greater this value is, the faster the strength of gravity decreases with the "
-"square of distance."
-msgstr ""
-"常é‡ï¼Œç”¨äºŽè®¾ç½®/获å–区域中的点é‡åŠ›çš„è¡°å‡ç³»æ•°ã€‚这个值越大,é‡åŠ›çš„强度éšç€è·ç¦»çš„"
-"平方下é™å¾—越快。"
-
-msgid ""
-"This constant was used to set/get the falloff factor for point gravity. It "
-"has been superseded by [constant AREA_PARAM_GRAVITY_DISTANCE_SCALE]."
-msgstr ""
-"这个常é‡ç”¨äºŽè®¾ç½®/获å–点é‡åŠ›çš„è¡°å‡å› å­ã€‚它已ç»è¢« [constant "
-"AREA_PARAM_GRAVITY_DISTANCE_SCALE] 所å–代了。"
-
msgid "Constant to set/get the priority (order of processing) of an area."
msgstr "常é‡ï¼Œç”¨äºŽè®¾ç½®/获å–区域的优先级(处ç†é¡ºåºï¼‰ã€‚"
@@ -18419,12 +19681,6 @@ msgstr "常é‡ï¼Œç”¨äºŽè®¾ç½®/获å–物体的惯性。"
msgid "Constant to set/get a body's gravity multiplier."
msgstr "常é‡ï¼Œç”¨äºŽè®¾ç½®/获å–物体的é‡åŠ›å€æ•°ã€‚"
-msgid "Constant to set/get a body's linear dampening factor."
-msgstr "常é‡ï¼Œç”¨äºŽè®¾ç½®/获å–物体的线性阻尼系数。"
-
-msgid "Constant to set/get a body's angular dampening factor."
-msgstr "常é‡ï¼Œç”¨äºŽè®¾ç½®/获å–物体的角度阻尼系数。"
-
msgid "Represents the size of the [enum BodyParameter] enum."
msgstr "表示 [enum BodyParameter] 枚举的大å°ã€‚"
@@ -18834,6 +20090,9 @@ msgstr ""
"而“dâ€æ˜¯åŽŸç‚¹åˆ°å¹³é¢çš„è·ç¦»ï¼ˆåœ¨â€œæ³•çº¿â€æ–¹å‘)。“上方â€æˆ–“上方â€å¹³é¢è¢«è®¤ä¸ºæ˜¯æ³•çº¿æŒ‡å‘çš„"
"å¹³é¢ä¸€ä¾§ã€‚"
+msgid "Constructs a [Plane] as a copy of the given [Plane]."
+msgstr "构造给定 [Plane] 的副本。"
+
msgid "Creates a plane from the three points, given in clockwise order."
msgstr "æ ¹æ®é¡ºæ—¶é’ˆé¡ºåºç»™å‡ºçš„三个点创建一个平é¢ã€‚"
@@ -19162,6 +20421,12 @@ msgstr "背景的样å¼ã€‚"
msgid "The style of the progress (i.e. the part that fills the bar)."
msgstr "进度的样å¼ï¼ˆå³å¡«å……进度æ¡çš„部分)。"
+msgid "3D projection (4x4 matrix)."
+msgstr "3D 投影(4×4 矩阵)。"
+
+msgid "Constructs a [Projection] as a copy of the given [Projection]."
+msgstr "构造给定 [Projection] 的副本。"
+
msgid "Contains global variables accessible from everywhere."
msgstr "包å«å…¨å±€å˜é‡ï¼Œå¯ä»¥ä»Žä»»ä½•åœ°æ–¹è®¿é—®ã€‚"
@@ -20245,6 +21510,9 @@ msgstr "3D 中的 2D 演示"
msgid "Quaternion."
msgstr "四元数."
+msgid "Constructs a [Quaternion] as a copy of the given [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."
@@ -20503,6 +21771,9 @@ msgid ""
"The ray's destination point, relative to the RayCast's [code]position[/code]."
msgstr "光线的目标点,相对于该 RayCast 的 [code]position[/code]。"
+msgid "Constructs a [Rect2] as a copy of the given [Rect2]."
+msgstr "构造给定 [Rect2] 的副本。"
+
msgid "Constructs a [Rect2] by position and size."
msgstr "按ä½ç½®å’Œå¤§å°æž„造一个 [Rect2]。"
@@ -20527,6 +21798,15 @@ msgid ""
msgstr "返回该 [Rect2] 的中心,等于 [member position] + ([member size] / 2)。"
msgid ""
+"Returns [code]true[/code] if the [Rect2] has area, and [code]false[/code] if "
+"the [Rect2] is linear, empty, or has a negative [member size]. See also "
+"[method get_area]."
+msgstr ""
+"如果该 [Rect2] 有é¢ç§¯ï¼Œåˆ™è¿”回 [code]true[/code] ;如果该 [Rect2] 是线性的ã€ç©º"
+"的或有负的 [member size],则返回 [code]false[/code] 。å¦è¯·å‚阅 [member "
+"get_area]。"
+
+msgid ""
"Returns [code]true[/code] if the [Rect2] contains a point. By convention, "
"the right and bottom edges of the [Rect2] are considered exclusive, so "
"points on these edges are [b]not[/b] included.\n"
@@ -20539,6 +21819,18 @@ msgstr ""
"[b]注æ„:[/b]对于[i]大å°ä¸ºè´Ÿ[/i]çš„ [Rect2],该方法并ä¸å¯é ã€‚请使用 [method "
"abs] 获å–等价的正数大å°çŸ©å½¢å†æ£€æŸ¥æ˜¯å¦åŒ…å«æŸä¸ªç‚¹ã€‚"
+msgid "Constructs a [Rect2i] as a copy of the given [Rect2i]."
+msgstr "构造给定 [Rect2i] 的副本。"
+
+msgid ""
+"Returns [code]true[/code] if the [Rect2i] has area, and [code]false[/code] "
+"if the [Rect2i] is linear, empty, or has a negative [member size]. See also "
+"[method get_area]."
+msgstr ""
+"如果该 [Rect2i] 有é¢ç§¯ï¼Œåˆ™è¿”回 [code]true[/code] ;如果该 [Rect2i] 是线性的ã€"
+"空的或有负的 [member size],则返回 [code]false[/code] 。å¦è¯·å‚阅 [member "
+"get_area]。"
+
msgid "Base class for reference-counted objects."
msgstr "引用计数对象的基类。"
@@ -20619,21 +21911,6 @@ msgid ""
msgstr "定义å射强度。"
msgid ""
-"The maximum distance away from the [ReflectionProbe] an object can be before "
-"it is culled. Decrease this to improve performance, especially when using "
-"the [constant UPDATE_ALWAYS] [member update_mode].\n"
-"[b]Note:[/b] The maximum reflection distance is always at least equal to the "
-"[member extents]. This means that decreasing [member max_distance] will not "
-"always cull objects from reflections, especially if the reflection probe's "
-"[member extents] are already large."
-msgstr ""
-"设置对象在被剔除å‰ä¸Žè¯¥ [ReflectionProbe] 的最大è·ç¦»ã€‚调低å¯ä»¥æå‡æ€§èƒ½ï¼Œå°¤å…¶æ˜¯"
-"使用 [constant UPDATE_ALWAYS] 作为 [member update_mode] 时。\n"
-"[b]注æ„:[/b]最大åå°„è·ç¦»æ€»æ˜¯è‡³å°‘等于 [member extents] 的。这æ„味ç€å‡å° "
-"[member max_distance] 并ä¸æ€»èƒ½å°†å¯¹è±¡å‰”除出å射,尤其是在å射探针的 [member "
-"extents] 相当大时。"
-
-msgid ""
"Sets how frequently the [ReflectionProbe] is updated. Can be [constant "
"UPDATE_ONCE] or [constant UPDATE_ALWAYS]."
msgstr ""
@@ -21158,12 +22435,6 @@ msgstr ""
"多。相当于 [member ReflectionProbe.enable_shadows]。"
msgid ""
-"Sets the size of the area that the reflection probe will capture. Equivalent "
-"to [member ReflectionProbe.extents]."
-msgstr ""
-"设置å射探针将æ•èŽ·çš„区域的大å°ã€‚相当于 [member ReflectionProbe.extents]。"
-
-msgid ""
"Sets the intensity of the reflection probe. Intensity modulates the strength "
"of the reflection. Equivalent to [member ReflectionProbe.intensity]."
msgstr ""
@@ -21255,10 +22526,6 @@ msgstr "设置视å£çš„调试绘图模å¼ã€‚å¯é€‰é¡¹è§ [enum ViewportDebugDraw
msgid "If [code]true[/code], the viewport's canvas is not rendered."
msgstr "如果为 [code]true[/code],则ä¸æ¸²æŸ“视å£çš„画布。"
-msgid ""
-"If [code]true[/code], rendering of a viewport's environment is disabled."
-msgstr "如果为 [code]true[/code],则ç¦ç”¨è§†å£çŽ¯å¢ƒçš„渲染。"
-
msgid "Sets the viewport's global transformation matrix."
msgstr "设置视å£çš„全局å˜æ¢çŸ©é˜µã€‚"
@@ -21907,17 +23174,6 @@ msgstr ""
"è¦æ·»åŠ ä¸€ä¸ªè‡ªå®šä¹‰æ•ˆæžœï¼Œä½¿ç”¨[method install_effect]会更方便。"
msgid ""
-"If [code]true[/code], the label's height will be automatically updated to "
-"fit its content.\n"
-"[b]Note:[/b] This property is used as a workaround to fix issues with "
-"[RichTextLabel] in [Container]s, but it's unreliable in some cases and will "
-"be removed in future versions."
-msgstr ""
-"如果为 [code]true[/code],标签的高度将自动更新以适应其内容。\n"
-"[b]注æ„:[/b]此属性用作解决 [Container] 中 [RichTextLabel] 问题的解决方法,但"
-"在æŸäº›æƒ…况下ä¸å¯é ï¼Œå°†åœ¨æœªæ¥ç‰ˆæœ¬ä¸­åˆ é™¤ã€‚"
-
-msgid ""
"If [code]true[/code], the label underlines meta tags such as [code][url]"
"{text}[/url][/code]."
msgstr ""
@@ -22024,6 +23280,12 @@ msgstr "[RichTextLabel] 的正常背景。"
msgid "Handle for a [Resource]'s unique ID."
msgstr "[Resource] 的唯一 ID çš„å¥æŸ„。"
+msgid "Constructs an empty [RID] with the invalid ID [code]0[/code]."
+msgstr "构造空的 [RID],内容为无效的 ID [code]0[/code]。"
+
+msgid "Constructs a [RID] as a copy of the given [RID]."
+msgstr "构造给定 [RID] 的副本。"
+
msgid "2D Physics Platformer Demo"
msgstr "2D 物ç†å¹³å°è·³è·ƒæ¼”示"
@@ -22514,14 +23776,6 @@ msgstr ""
"å¯ç”¨äºŽåŒæ­¥å¤šä¸ª [Thread] çš„åŒæ­¥ä¿¡å·é‡ã€‚创建时åˆå§‹åŒ–为零。å°å¿ƒé¿å…æ­»é”。对于二"
"进制版本,请å‚阅 [Mutex]。"
-msgid ""
-"Like [method wait], but won't block, so if the value is zero, fails "
-"immediately and returns [constant ERR_BUSY]. If non-zero, it returns "
-"[constant OK] to report success."
-msgstr ""
-"与 [method wait] 类似,但ä¸ä¼šé˜»å¡žï¼Œæ‰€ä»¥å¦‚果值为零,则会立å³å¤±è´¥å¹¶è¿”回 "
-"[constant ERR_BUSY]。如果éžé›¶ï¼Œåˆ™ä¼šè¿”回 [constant OK],表示æˆåŠŸã€‚"
-
msgid "The ray's length."
msgstr "射线的长度。"
@@ -22607,6 +23861,12 @@ msgstr ""
msgid "A shortcut for binding input."
msgstr "绑定输入的快æ·æ–¹å¼ã€‚"
+msgid "Constructs an empty [Signal] with no object nor signal name bound."
+msgstr "构造空的 [Signal],没有绑定对象和信å·å称。"
+
+msgid "Constructs a [Signal] as a copy of the given [Signal]."
+msgstr "构造给定 [Signal] 的副本。"
+
msgid "Skeleton for 2D characters and animated objects."
msgstr "2D 角色和动画对象的骨架。"
@@ -23206,6 +24466,12 @@ msgstr ""
"轮询连接以检查传入的字节。在 [method StreamPeer.get_available_bytes] 之å‰è°ƒç”¨"
"它以使其正常工作。"
+msgid "Constructs an empty [String] ([code]\"\"[/code])."
+msgstr "构造空的 [String]([code]\"\"[/code])。"
+
+msgid "Constructs a [String] as a copy of the given [String]."
+msgstr "构造给定 [String] 的副本。"
+
msgid ""
"Returns a copy of the string with special characters escaped using the C "
"language standard."
@@ -23229,6 +24495,15 @@ msgid ""
"meanings according to the XML standard."
msgstr "è¿”å›žæ ¹æ® XML 标准将转义字符替æ¢ä¸ºå…¶å«ä¹‰çš„字符串副本。"
+msgid "An optimized string type for unique names."
+msgstr "针对唯一å称优化的字符串类型。"
+
+msgid "Constructs an empty [StringName]."
+msgstr "构造空的 [StringName]。"
+
+msgid "Constructs a [StringName] as a copy of the given [StringName]."
+msgstr "构造给定 [StringName] 的副本。"
+
msgid "Base class for drawing stylized boxes for the UI."
msgstr "用于为 UI 绘制风格化框的基类。"
@@ -23598,14 +24873,6 @@ msgstr "绘制时扩展此样å¼ç›’的上边è·ï¼Œä½¿å…¶ç»˜åˆ¶å¾—比请求的大
msgid "Modulates the color of the texture when this style box is drawn."
msgstr "绘制此样å¼ç›’时用于调制纹ç†çš„颜色。"
-msgid ""
-"Species a sub-region of the texture to use.\n"
-"This is equivalent to first wrapping the texture in an [AtlasTexture] with "
-"the same region."
-msgstr ""
-"指定è¦ä½¿ç”¨çš„纹ç†çš„å­åŒºåŸŸã€‚\n"
-"这相当于首先将纹ç†åŒ…裹在具有相åŒåŒºåŸŸçš„ [AtlasTexture] 中。"
-
msgid "The texture to use when drawing this style box."
msgstr "绘制此样å¼ç›’时所使用的纹ç†ã€‚"
@@ -23695,6 +24962,11 @@ msgstr "绘制å‰å§‹ç»ˆæ¸…除渲染目标。"
msgid "Never clear the render target."
msgstr "æ°¸ä¸æ¸…除渲染目标。"
+msgid ""
+"Clear the render target on the next frame, then switch to [constant "
+"CLEAR_MODE_NEVER]."
+msgstr "在下一帧清除渲染目标,然åŽåˆ‡æ¢åˆ° [constant CLEAR_MODE_NEVER]。"
+
msgid "Do not update the render target."
msgstr "ä¸è¦æ›´æ–°æ¸²æŸ“目标。"
@@ -23779,14 +25051,6 @@ msgstr ""
"一个顶点æ交,则å¯èƒ½æ ¹æœ¬æ— æ³•ä½¿ç”¨æ­¤ä¿¡æ¯ã€‚"
msgid ""
-"Specifies whether the current vertex (if using only vertex arrays) or "
-"current index (if also using index arrays) should use smooth normals for "
-"normal calculation."
-msgstr ""
-"指定当å‰é¡¶ç‚¹ï¼ˆå¦‚果仅使用顶点数组)或当å‰ç´¢å¼•ï¼ˆå¦‚果还使用索引数组)是å¦åº”使用"
-"平滑法线进行法线计算。"
-
-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."
@@ -24039,6 +25303,24 @@ msgstr "返回给定行æ¢è¡Œçš„次数。"
msgid "Returns an array of [String]s representing each wrapped index."
msgstr "返回代表å„个æ¢è¡Œç´¢å¼•çš„ [String] 数组。"
+msgid "Returns the equivalent minimap line at [param position]"
+msgstr "返回å°åœ°å›¾ [param position] 处等价的行"
+
+msgid ""
+"Returns the local position and size for the grapheme at the given [param "
+"line] and [param column]. If [code]x[/code] or [code]y[/code] position of "
+"the returned rect equal [code]-1[/code], the position is outside of the "
+"viewable area of the control.\n"
+"[b]Note:[/b] The Y position of the returned rect corresponds to the top side "
+"of the line, unlike [method get_pos_at_line_column] which returns the bottom "
+"side."
+msgstr ""
+"返回字素的本地ä½ç½®å’Œå¤§å°ï¼Œè¯¥å­—ç´ ä½äºŽç»™å®šè¡Œ [code]line[/code] 和列 "
+"[code]column[/code]。如果返回的矩形中,ä½ç½®çš„ [code]x[/code] 或 [code]y[/"
+"code] 等于 [code]-1[/code],表示ä½äºŽè¯¥æŽ§ä»¶çš„å¯è§†èŒƒå›´ä¹‹å¤–。\n"
+"[b]注æ„:[/b]ä½ç½®ä¸­çš„ Y 对应该行的顶部,而 [method get_pos_at_line_column] è¿”"
+"回的则是底部。"
+
msgid "Returns the text inside the selection."
msgstr "返回选择内的文本。"
@@ -24063,13 +25345,6 @@ msgstr "有“撤销â€åŠ¨ä½œå¯ç”¨æ—¶è¿”回 [code]true[/code]。"
msgid "Returns if the given line is wrapped."
msgstr "返回给定的行是å¦æ¢è¡Œã€‚"
-msgid ""
-"Triggers a right-click menu action by the specified index. See [enum "
-"MenuItems] for a list of available indexes."
-msgstr ""
-"按指定的索引触å‘å³é”®å•å‡»èœå•æ“作。有关å¯ç”¨ç´¢å¼•çš„列表,请å‚阅 [enum "
-"MenuItems]。"
-
msgid "Perform redo operation."
msgstr "执行é‡åšæ“作。"
@@ -24212,8 +25487,93 @@ msgstr "文本上一个åƒç´ å®½åº¦çš„大å°ï¼Œä»¥ 3D 缩放。"
msgid "The text to generate mesh from."
msgstr "用于生æˆç½‘格的文本。"
-msgid "Returns the font descent (number of pixels below the baseline)."
-msgstr "返回字体的å‡å°‘é‡ï¼ˆä½ŽäºŽåŸºçº¿çš„åƒç´ æ•°ï¼‰ã€‚"
+msgid "Returns size of the text."
+msgstr "返回该文本的大å°ã€‚"
+
+msgid "Returns extra spacing added between glyphs or lines in pixels."
+msgstr "返回字形或行之间添加的é¢å¤–é—´è·ï¼Œå•ä½ä¸ºåƒç´ ã€‚"
+
+msgid ""
+"Breaks text into words and returns array of character ranges. Use [param "
+"grapheme_flags] to set what characters are used for breaking (see [enum "
+"GraphemeFlag])."
+msgstr ""
+"将文本分解æˆå•è¯å¹¶è¿”回字符范围的数组。请使用 [param grapheme_flags] æ¥è®¾ç½®å“ª"
+"äº›å­—ç¬¦ä¼šè¢«ç”¨äºŽåˆ†è§£ï¼ˆè§ [enum GraphemeFlag])。"
+
+msgid ""
+"Returns grapheme index at the specified pixel offset at the baseline, or "
+"[code]-1[/code] if none is found."
+msgstr ""
+"返回字素的索引,该字素ä½äºŽåŸºçº¿ä¸ŠæŒ‡å®šåƒç´ å移的ä½ç½®ï¼Œå¦‚果没有找到,则返回 "
+"[code]-1[/code]。"
+
+msgid "Do not break the line."
+msgstr "ä¸æ¢è¡Œã€‚"
+
+msgid ""
+"Break the line at the line mandatory break characters (e.g. [code]\"\\n\"[/"
+"code])."
+msgstr "在强制æ¢è¡Œç¬¦å¤„æ¢è¡Œï¼ˆä¾‹å¦‚ [code]\"\\n\"[/code])。"
+
+msgid "Break the line between the words."
+msgstr "在å•è¯ä¹‹é—´æ¢è¡Œã€‚"
+
+msgid "Break the line between any unconnected graphemes."
+msgstr "在任何ä¸ç›¸è¿žçš„字素之间æ¢è¡Œã€‚"
+
+msgid ""
+"Should be used only in conjunction with [constant BREAK_WORD_BOUND], break "
+"the line between any unconnected graphemes, if it's impossible to break it "
+"between the words."
+msgstr ""
+"åªåº”与 [constant BREAK_WORD_BOUND] 一起使用,如果ä¸å¯èƒ½åœ¨å•è¯ä¹‹é—´æ¢è¡Œï¼Œåˆ™åœ¨ä»»"
+"何ä¸ç›¸è¿žçš„字素之间æ¢è¡Œã€‚"
+
+msgid "Remove edge spaces from the broken line segments."
+msgstr "移除æ¯ä¸€è¡Œå¤´å°¾çš„空格。"
+
+msgid "Trims the text per word instead of per grapheme."
+msgstr "é€è¯ä¿®å‰ªæ–‡æœ¬ï¼Œè€Œä¸æ˜¯é€å­—素修剪文本。"
+
+msgid "Grapheme is supported by the font, and can be drawn."
+msgstr "字素由字体支æŒï¼Œå¹¶ä¸”å¯ä»¥è¢«ç»˜åˆ¶ã€‚"
+
+msgid "Grapheme is part of right-to-left or bottom-to-top run."
+msgstr "字素是从å³è‡³å·¦æˆ–从下至上书写的一部分。"
+
+msgid ""
+"Grapheme is not part of source text, it was added by justification process."
+msgstr "å­—ç´ ä¸æ˜¯æºæ–‡æœ¬çš„一部分,而是通过两端对é½è¿‡ç¨‹æ·»åŠ çš„。"
+
+msgid "Grapheme is whitespace."
+msgstr "字素是空白字符。"
+
+msgid "Grapheme is mandatory break point (e.g. [code]\"\\n\"[/code])."
+msgstr "字素是强制æ¢è¡Œç‚¹ï¼ˆä¾‹å¦‚ [code]\"\\n\"[/code])。"
+
+msgid "Grapheme is optional break point (e.g. space)."
+msgstr "字素是å¯é€‰æ¢è¡Œç‚¹ï¼ˆä¾‹å¦‚空格)。"
+
+msgid "Grapheme is the tabulation character."
+msgstr "字素是制表符。"
+
+msgid "Grapheme is kashida."
+msgstr "字素是 Kashida。"
+
+msgid "Grapheme is punctuation character."
+msgstr "字素是标点符å·ã€‚"
+
+msgid "Grapheme is underscore character."
+msgstr "字素是下划线字符。"
+
+msgid ""
+"Grapheme is connected to the previous grapheme. Breaking line before this "
+"grapheme is not safe."
+msgstr "字素与å‰ä¸€ä¸ªå­—素相连。在这个字素之å‰æ¢è¡Œæ˜¯ä¸å®‰å…¨çš„。"
+
+msgid "It is safe to insert a U+0640 before this grapheme for elongation."
+msgstr "在这个字素之å‰æ’å…¥ U+0640 以进行伸长是安全的。"
msgid "Disables font hinting (smoother but less crisp)."
msgstr "ç¦ç”¨å­—体æ示(更平滑但ä¸é‚£ä¹ˆæ¸…晰)。"
@@ -24948,6 +26308,9 @@ msgstr ""
"三个 [Vector2] 值组æˆï¼š[member x]ã€[member y]ã€[member origin]。\n"
"更多信æ¯è¯·é˜…读文档文章《矩阵和å˜æ¢ã€‹ã€‚"
+msgid "Constructs a [Transform2D] as a copy of the given [Transform2D]."
+msgstr "构造给定 [Transform2D] 的副本。"
+
msgid "Constructs the transform from a given angle (in radians) and position."
msgstr "从一个给定的角度(å•ä½ä¸ºå¼§åº¦ï¼‰å’Œä½ç½®æž„造å˜æ¢ã€‚"
@@ -25044,6 +26407,9 @@ msgstr ""
"列)组æˆã€‚\n"
"更多信æ¯è¯·é˜…读文档文章《矩阵和å˜æ¢ã€‹ã€‚"
+msgid "Constructs a [Transform3D] as a copy of the given [Transform3D]."
+msgstr "构造给定 [Transform3D] 的副本。"
+
msgid ""
"The basis is a matrix containing 3 [Vector3] as its columns: X axis, Y axis, "
"and Z axis. These vectors can be interpreted as the basis vectors of local "
@@ -25257,22 +26623,9 @@ msgid ""
msgstr ""
"当具有 [constant TreeItem.CELL_MODE_CUSTOM] çš„å•å…ƒæ ¼è¢«ç‚¹å‡»ï¼Œè¿›è¡Œç¼–辑时触å‘。"
-msgid "Emitted when an item's label is double-clicked."
-msgstr "当一个项目的标签被åŒå‡»æ—¶è§¦å‘。"
-
msgid "Emitted when an item is collapsed by a click on the folding arrow."
msgstr "当一个项目的折å ç®­å¤´è¢«ç‚¹å‡»æŠ˜å æ—¶è§¦å‘。"
-msgid ""
-"Emitted when a custom button is pressed (i.e. in a [constant TreeItem."
-"CELL_MODE_CUSTOM] mode cell)."
-msgstr ""
-"当自定义按钮被按下时触å‘(å³åœ¨ [constant TreeItem.CELL_MODE_CUSTOM] 模å¼å•å…ƒ"
-"格中)。"
-
-msgid "Emitted when an item's icon is double-clicked."
-msgstr "当项目的图标被åŒå‡»æ—¶è§¦å‘。"
-
msgid "Emitted when an item is edited."
msgstr "当项目被编辑时触å‘。"
@@ -26089,6 +27442,9 @@ msgstr "[VBoxContainer] 的元素之间的垂直空间。"
msgid "3Blue1Brown Essence of Linear Algebra"
msgstr "3Blue1Brown《线性代数的本质》"
+msgid "Constructs a [Vector2] as a copy of the given [Vector2]."
+msgstr "构造给定 [Vector2] 的副本。"
+
msgid ""
"Returns a new vector with all components in absolute values (i.e. positive)."
msgstr "返回一个新的å‘é‡ï¼Œå…¶æ‰€æœ‰åˆ†é‡éƒ½æ˜¯ç»å¯¹å€¼ï¼Œå³æ­£å€¼ã€‚"
@@ -26179,6 +27535,12 @@ msgstr "上å•ä½å‘é‡ã€‚在 2D 中 Y 是å‘下的,所以这个å‘é‡æŒ‡å‘ -
msgid "Down unit vector. Y is down in 2D, so this vector points +Y."
msgstr "下å•ä½å‘é‡ã€‚在 2D 中 Y 是å‘下的,所以这个å‘é‡æŒ‡å‘ +Y。"
+msgid "Constructs a [Vector2i] as a copy of the given [Vector2i]."
+msgstr "构造给定 [Vector2i] 的副本。"
+
+msgid "Constructs a [Vector3] as a copy of the given [Vector3]."
+msgstr "构造给定 [Vector3] 的副本。"
+
msgid "Returns the unsigned minimum angle to the given vector, in radians."
msgstr "返回与给定å‘é‡çš„无符å·æœ€å°è§’度,å•ä½ä¸ºå¼§åº¦ã€‚"
@@ -26217,6 +27579,15 @@ msgid ""
"direction of south."
msgstr "åŽå•ä½å‘é‡ã€‚代表局部的åŽæ–¹å‘,全局的å—æ–¹å‘。"
+msgid "Constructs a [Vector3i] as a copy of the given [Vector3i]."
+msgstr "构造给定 [Vector3i] 的副本。"
+
+msgid "Constructs a [Vector4] as a copy of the given [Vector4]."
+msgstr "构造给定 [Vector4] 的副本。"
+
+msgid "Constructs a [Vector4i] as a copy of the given [Vector4i]."
+msgstr "构造给定 [Vector4i] 的副本。"
+
msgid "Physics body that simulates the behavior of a car."
msgstr "模拟汽车行为的物ç†ä½“。"
@@ -26385,17 +27756,6 @@ msgstr "播放结æŸæ—¶è§¦å‘。"
msgid "[VideoStream] resource for Ogg Theora videos."
msgstr "[VideoStream] Ogg Theora 视频的资æºã€‚"
-msgid "Returns the Ogg Theora video file handled by this [VideoStreamTheora]."
-msgstr "返回由这个 [VideoStreamTheora] 处ç†çš„ Ogg Theora 视频文件。"
-
-msgid ""
-"Sets the Ogg Theora video file that this [VideoStreamTheora] resource "
-"handles. The [code]file[/code] name should have the [code].ogv[/code] "
-"extension."
-msgstr ""
-"设置该 [VideoStreamTheora] 资æºå¤„ç†çš„ Ogg Theora 视频文件。[code]file[/code] "
-"çš„å称应该有 [code].ogv[/code] 扩展å。"
-
msgid ""
"Returns the first valid [World2D] for this viewport, searching the [member "
"world_2d] property of itself and any Viewport ancestor."
@@ -26403,9 +27763,6 @@ msgstr ""
"返回该视å£çš„首个有效 [World2D],在它自身åŠä»»ä½• Viewport 祖先节点的 [member "
"world_2d] 属性中查找。"
-msgid "Returns the total transform of the viewport."
-msgstr "返回视å£çš„总的å˜æ¢ã€‚"
-
msgid ""
"Returns the mouse's position in this [Viewport] using the coordinate system "
"of this [Viewport]."
@@ -26441,12 +27798,6 @@ msgstr ""
"影,但是会é™ä½Žé˜´å½±çš„è´¨é‡ã€‚一个好的åšæ³•æ˜¯è®©è±¡é™å…·æœ‰ä¸åŒæ•°é‡çš„细分,并尽å¯èƒ½åœ°"
"å‡å°‘细分。"
-msgid ""
-"Moves the mouse pointer to the specified position in this [Viewport] using "
-"the coordinate system of this [Viewport]."
-msgstr ""
-"将鼠标指针移动到该 [Viewport] 中的指定ä½ç½®ï¼Œä½¿ç”¨è¯¥ [Viewport] çš„å标系。"
-
msgid "If [code]true[/code], the viewport will process 2D audio streams."
msgstr "如果为 [code]true[/code],该视å£å°†å¤„ç† 2D 音频æµã€‚"
@@ -28281,9 +29632,6 @@ msgid ""
"(any byte combination is allowed)."
msgstr "指定 WebSockets 消æ¯åº”以二进制有效载è·çš„å½¢å¼ä¼ è¾“(å…许任何字节组åˆï¼‰ã€‚"
-msgid "How to make a VR game for WebXR with Godot"
-msgstr "如何使用 Godot 制作 WebXR çš„ VR 游æˆ"
-
msgid ""
"Checks if the given [code]session_mode[/code] is supported by the user's "
"browser.\n"
@@ -28332,6 +29680,18 @@ msgstr "目标射线由手æŒæŒ‡ç¤ºå™¨å‘射,很å¯èƒ½æ˜¯ VR 触摸控制器ã€
msgid "Target ray from touch screen, mouse or other tactile input device."
msgstr "目标射线由触摸å±ã€é¼ æ ‡ç­‰è§¦è§‰è¾“入设备å‘射。"
+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 color of the title's text."
+msgstr "标题文本的颜色。"
+
msgid "The font used to draw the title."
msgstr "用于绘制标题的字体。"
@@ -28542,11 +29902,152 @@ msgstr "追踪功能失效(相机未æ’电或被é®æŒ¡ã€ç¯å¡”关闭,等等
msgid "The origin point in AR/VR."
msgstr "AR/VR 的原点。"
+msgid "The angular velocity for this pose."
+msgstr "该姿势的角速度。"
+
+msgid ""
+"If [code]true[/code] our tracking data is up to date. If [code]false[/code] "
+"we're no longer receiving new tracking data and our state is whatever that "
+"last valid state was."
+msgstr ""
+"如果为 [code]true[/code],则我们的追踪数æ®æ˜¯æœ€æ–°çš„。如果为 [code]false[/"
+"code],我们将ä¸å†æŽ¥æ”¶æ–°çš„追踪数æ®ï¼Œå¹¶ä¸”我们的状æ€æ˜¯æœ€åŽä¸€ä¸ªæœ‰æ•ˆçŠ¶æ€ã€‚"
+
+msgid "The linear velocity of this pose."
+msgstr "该姿势的线速度。"
+
+msgid ""
+"The tracking confidence for this pose, provides insight on how accurate the "
+"spatial positioning of this record is."
+msgstr "此姿势的追踪置信度,æ供了有关此记录的空间定ä½å‡†ç¡®åº¦çš„洞察力。"
+
+msgid ""
+"The transform containing the original and transform as reported by the XR "
+"runtime."
+msgstr "该å˜æ¢åŒ…å«ç”± XR è¿è¡Œæ—¶æŠ¥å‘Šçš„原点和å˜æ¢ã€‚"
+
+msgid "No tracking information is available for this pose."
+msgstr "此姿势没有å¯ç”¨çš„追踪信æ¯ã€‚"
+
+msgid "Tracking information is deemed accurate and up to date."
+msgstr "追踪信æ¯è¢«è®¤ä¸ºæ˜¯å‡†ç¡®ä¸”最新的。"
+
msgid "A tracked object."
-msgstr "跟踪对象。"
+msgstr "追踪对象。"
+
+msgid ""
+"An instance of this object represents a device that is tracked, such as a "
+"controller or anchor point. HMDs aren't represented here as they are handled "
+"internally.\n"
+"As controllers are turned on and the [XRInterface] detects them, instances "
+"of this object are automatically added to this list of active tracking "
+"objects accessible through the [XRServer].\n"
+"The [XRController3D] and [XRAnchor3D] both consume objects of this type and "
+"should be used in your project. The positional trackers are just under-the-"
+"hood objects that make this all work. These are mostly exposed so that "
+"GDExtension-based interfaces can interact with them."
+msgstr ""
+"此对象的一个实例,表示一个被追踪的设备,例如一个控制器或锚点。HMD 没有在此处"
+"表示,因为它们是在内部处ç†çš„。\n"
+"当控制器被打开,并且 [XRInterface] 检测到它们时,此对象的实例会自动被添加到å¯"
+"通过 [XRServer] 访问的活动追踪对象列表中。\n"
+"[XRController3D] å’Œ [XRAnchor3D] 都使用这ç§ç±»åž‹çš„对象,并且应该在您的项目中使"
+"用。ä½ç½®è¿½è¸ªå™¨åªæ˜¯ä½¿è¿™ä¸€åˆ‡æ­£å¸¸å·¥ä½œçš„底层对象。这些大部分都是公开的,以便基于 "
+"GDExtension 的接å£ï¼Œå¯ä»¥ä¸Žå®ƒä»¬äº¤äº’。"
+
+msgid ""
+"Returns an input for this tracker. It can return a boolean, float or "
+"[Vector2] value depending on whether the input is a button, trigger or "
+"thumbstick/thumbpad."
+msgstr ""
+"返回此追踪器的输入。它å¯ä»¥è¿”回一个布尔值ã€æµ®ç‚¹æ•°æˆ– [Vector2] 值,具体å–决于输"
+"入是一个按钮ã€è§¦å‘器还是拇指æ†/拇指æ¿ã€‚"
+
+msgid ""
+"Returns the current [XRPose] state object for the bound [param name] pose."
+msgstr "返回绑定 [param name] å§¿åŠ¿çš„å½“å‰ [XRPose] 状æ€å¯¹è±¡ã€‚"
+
+msgid ""
+"Returns [code]true[/code] if the tracker is available and is currently "
+"tracking the bound [param name] pose."
+msgstr ""
+"如果追踪器å¯ç”¨ï¼Œå¹¶ä¸”当å‰æ­£åœ¨è¿½è¸ªç»‘定的 [param name] 姿势,则返回 [code]true[/"
+"code]。"
+
+msgid ""
+"Marks this pose as invalid, we don't clear the last reported state but it "
+"allows users to decide if trackers need to be hidden if we loose tracking or "
+"just remain at their last known position."
+msgstr ""
+"将此姿势标记为无效,我们ä¸ä¼šæ¸…除最åŽæŠ¥å‘Šçš„状æ€ï¼Œä½†å¦‚果我们失去追踪,它å…许用"
+"户决定是å¦éœ€è¦éšè—追踪器,或仅ä¿ç•™åœ¨å…¶æœ€åŽä¸€ä¸ªå·²çŸ¥ä½ç½®ã€‚"
+
+msgid ""
+"Changes the value for the given input. This method is called by a "
+"[XRInterface] implementation and should not be used directly."
+msgstr "更改给定输入的值。此方法由一个 [XRInterface] 实现调用,ä¸åº”直接使用。"
+
+msgid ""
+"Sets the transform, linear velocity, angular velocity and tracking "
+"confidence for the given pose. This method is called by a [XRInterface] "
+"implementation and should not be used directly."
+msgstr ""
+"设置给定姿势的å˜æ¢ã€çº¿é€Ÿåº¦ã€è§’速度和追踪置信度。此方法由一个 [XRInterface] 实"
+"现调用,ä¸åº”直接使用。"
+
+msgid "The description of this tracker."
+msgstr "此追踪器的æ述。"
+
+msgid "Defines which hand this tracker relates to."
+msgstr "定义此追踪器与哪åªæ‰‹ç›¸å…³ã€‚"
+
+msgid ""
+"The unique name of this tracker. The trackers that are available differ "
+"between various XR runtimes and can often be configured by the user. Godot "
+"maintains a number of reserved names that it expects the [XRInterface] to "
+"implement if applicable:\n"
+"- [code]left_hand[/code] identifies the controller held in the players left "
+"hand\n"
+"- [code]right_hand[/code] identifies the controller held in the players "
+"right hand"
+msgstr ""
+"此追踪器的唯一å称。å¯ç”¨çš„追踪器因å„ç§ XR è¿è¡Œæ—¶è€Œå¼‚,并且通常å¯ä»¥ç”±ç”¨æˆ·é…"
+"置。Godot 维护了一些ä¿ç•™å称,如果å¯åº”用,它希望 [XRInterface] æ¥å®žçŽ°ï¼š\n"
+"- [code]left_hand[/code] 标识玩家左手æ¡æŒçš„控制器\n"
+"- [code]right_hand[/code] 标识玩家å³æ‰‹æ¡æŒçš„控制器"
+
+msgid ""
+"The profile associated with this tracker, interface dependent but will "
+"indicate the type of controller being tracked."
+msgstr "与此追踪器关è”çš„é…置文件,å–决于界é¢ï¼Œä½†å°†æŒ‡ç¤ºè¢«è¿½è¸ªçš„控制器类型。"
+
+msgid "The type of tracker."
+msgstr "该追踪器的类型。"
+
+msgid ""
+"Emitted when a button on this tracker is pressed. Note that many XR runtimes "
+"allow other inputs to be mapped to buttons."
+msgstr ""
+"当该追踪器上的一个按钮被按下时å‘出。请注æ„,许多 XR è¿è¡Œæ—¶å…许将其他输入映射"
+"到按钮。"
+
+msgid "Emitted when a button on this tracker is released."
+msgstr "当该追踪器上的一个按钮被释放时å‘出。"
+
+msgid "Emitted when a trigger or similar input on this tracker changes value."
+msgstr "当此追踪器上的一个触å‘器或类似输入更改值时å‘出。"
+
+msgid "Emitted when a thumbstick or thumbpad on this tracker moves."
+msgstr "当该追踪器上的一个拇指æ†æˆ–拇指æ¿ç§»åŠ¨æ—¶å‘出。"
+
+msgid "Emitted when the state of a pose tracked by this tracker changes."
+msgstr "当被此追踪器追踪的一个姿势状æ€å‘生å˜åŒ–æ—¶å‘出。"
+
+msgid "Emitted when the profile of our tracker changes."
+msgstr "当我们的追踪器的é…ç½®å‘生å˜åŒ–æ—¶å‘出。"
msgid "The hand this tracker is held in is unknown or not applicable."
-msgstr "这个追踪器所æŒçš„手是未知的或ä¸é€‚用的。"
+msgstr "手æŒè¯¥è¿½è¸ªå™¨çš„手是未知的或ä¸é€‚用的。"
msgid "This tracker is the left hand controller."
msgstr "此跟踪器是左手控制器。"
@@ -28555,30 +30056,63 @@ msgid "This tracker is the right hand controller."
msgstr "此跟踪器是å³æ‰‹æŽ§åˆ¶å™¨ã€‚"
msgid "Server for AR and VR features."
-msgstr "AR å’Œ VR 功能的æœåŠ¡ã€‚"
+msgstr "用于 AR å’Œ VR 功能的æœåŠ¡ã€‚"
msgid ""
"The AR/VR server is the heart of our Advanced and Virtual Reality solution "
"and handles all the processing."
-msgstr "AR/VR æœåŠ¡å™¨æ˜¯æˆ‘们“高级虚拟现实â€è§£å†³æ–¹æ¡ˆçš„核心,负责进行所有处ç†ã€‚"
+msgstr "AR/VR æœåŠ¡å™¨æ˜¯æˆ‘们“高级虚拟现实â€è§£å†³æ–¹æ¡ˆçš„核心,负责执行所有处ç†ã€‚"
+
+msgid "Registers an [XRInterface] object."
+msgstr "注册一个 [XRInterface] 对象。"
+
+msgid ""
+"Registers a new [XRPositionalTracker] that tracks a spatial location in real "
+"space."
+msgstr "注册一个新的 [XRPositionalTracker],用于跟踪现实空间中的一个空间ä½ç½®ã€‚"
msgid "Returns the primary interface's transformation."
msgstr "返回主界é¢çš„å˜æ¢ã€‚"
msgid ""
+"Returns the interface registered at the given [param idx] index in the list "
+"of interfaces."
+msgstr "返回在接å£åˆ—表中给定 [param idx] 索引处注册的接å£ã€‚"
+
+msgid ""
"Returns the number of interfaces currently registered with the AR/VR server. "
"If your project supports multiple AR/VR platforms, you can look through the "
"available interface, and either present the user with a selection or simply "
"try to initialize each interface and use the first one that returns "
"[code]true[/code]."
msgstr ""
-"返回当å‰åœ¨AR/VRæœåŠ¡å™¨ä¸Šæ³¨å†Œçš„接å£æ•°é‡ã€‚如果你的项目支æŒå¤šä¸ªAR/VRå¹³å°ï¼Œä½ å¯ä»¥"
-"查看å¯ç”¨çš„接å£ï¼Œå¹¶å‘用户展示一个选择,或者简å•åœ°å°è¯•åˆå§‹åŒ–æ¯ä¸ªæŽ¥å£ï¼Œå¹¶ä½¿ç”¨ç¬¬"
-"一个返回 [code]true[/code]的接å£ã€‚"
+"返回当å‰åœ¨AR/VRæœåŠ¡ä¸Šæ³¨å†Œçš„ç•Œé¢æ•°é‡ã€‚如果你的项目支æŒå¤šä¸ªAR/VRå¹³å°ï¼Œä½ å¯ä»¥æŸ¥"
+"看å¯ç”¨çš„ç•Œé¢ï¼Œå¹¶å‘用户展示一个选择,或者简å•åœ°å°è¯•åˆå§‹åŒ–æ¯ä¸ªç•Œé¢ï¼Œå¹¶ä½¿ç”¨ç¬¬ä¸€"
+"个返回 [code]true[/code]çš„ç•Œé¢ã€‚"
msgid ""
"Returns a list of available interfaces the ID and name of each interface."
-msgstr "返回å¯ç”¨æŽ¥å£çš„列表,æ¯ä¸ªæŽ¥å£çš„IDå’Œå称。"
+msgstr "返回å¯ç”¨ç•Œé¢çš„列表,æ¯ä¸ªç•Œé¢çš„IDå’Œå称。"
+
+msgid ""
+"Returns the reference frame transform. Mostly used internally and exposed "
+"for GDExtension build interfaces."
+msgstr "返回引用帧的å˜æ¢ã€‚主è¦åœ¨å†…部使用,并公开以用于 GDExtension 构建接å£ã€‚"
+
+msgid "Returns the positional tracker with the given [param tracker_name]."
+msgstr "返回具有给定 [param tracker_name] çš„ä½ç½®è¿½è¸ªå™¨ã€‚"
+
+msgid "Returns a dictionary of trackers for [param tracker_types]."
+msgstr "返回 [param tracker_types] 的追踪器字典。"
+
+msgid "Removes this [param interface]."
+msgstr "移除该 [param interface]。"
+
+msgid "Removes this positional [param tracker]."
+msgstr "移除该ä½ç½® [param tracker]。"
+
+msgid "The primary [XRInterface] currently bound to the [XRServer]."
+msgstr "当å‰ç»‘定到 [XRServer] 的主 [XRInterface]。"
msgid ""
"Allows you to adjust the scale to your game's units. Most AR/VR platforms "
@@ -28587,6 +30121,40 @@ msgstr ""
"å…许你根æ®ä½ çš„游æˆçš„å•ä½æ¥è°ƒæ•´ç¼©æ”¾ã€‚大多数 AR/VR å¹³å°å‡å®š 1 个游æˆä¸–ç•Œå•ä½ = "
"1 个现实世界的米。"
+msgid ""
+"Emitted when a new tracker has been added. If you don't use a fixed number "
+"of controllers or if you're using [XRAnchor3D]s for an AR solution, it is "
+"important to react to this signal to add the appropriate [XRController3D] or "
+"[XRAnchor3D] nodes related to this new tracker."
+msgstr ""
+"当一个新的追踪器被添加时å‘出。如果您ä¸ä½¿ç”¨ä¸€ä¸ªå›ºå®šæ•°é‡çš„控制器,或者如果您将 "
+"[XRAnchor3D] 用于一个 AR 解决方案,请务必对此信å·åšå‡ºå应,以添加与该新追踪器"
+"相适的 [XRController3D] 或 [XRAnchor3D] 节点 。"
+
+msgid ""
+"Emitted when a tracker is removed. You should remove any [XRController3D] or "
+"[XRAnchor3D] points if applicable. This is not mandatory, the nodes simply "
+"become inactive and will be made active again when a new tracker becomes "
+"available (i.e. a new controller is switched on that takes the place of the "
+"previous one)."
+msgstr ""
+"当一个追踪器被移除时å‘出。如此,您应该移除任何 [XRController3D] 或 "
+"[XRanchor3D] 点。这ä¸æ˜¯å¼ºåˆ¶æ€§çš„,这些节点åªæ˜¯å˜å¾—ä¸æ´»åŠ¨ï¼Œå¹¶ä¸”当一个新的追踪器"
+"å¯ç”¨æ—¶ï¼Œå°†å†æ¬¡æ¿€æ´»ï¼ˆå³æ‰“开一个新的控制器,æ¥ä»£æ›¿å‰ä¸€ä¸ªæŽ§åˆ¶å™¨ï¼‰ã€‚"
+
+msgid ""
+"Emitted when an existing tracker has been updated. This can happen if the "
+"user switches controllers."
+msgstr "当现有追踪器被更新时å‘出。如果用户切æ¢æŽ§åˆ¶å™¨ï¼Œåˆ™å¯èƒ½ä¼šå‘生这ç§æƒ…况。"
+
+msgid ""
+"The tracker tracks the location of the players head. This is usually a "
+"location centered between the players eyes. Note that for handheld AR "
+"devices this can be the current location of the device."
+msgstr ""
+"追踪器追踪玩家头部的ä½ç½®ã€‚这通常是玩家眼ç›ä¹‹é—´çš„中心ä½ç½®ã€‚请注æ„,对于手æŒå¼ "
+"AR 设备,这å¯èƒ½æ˜¯è¯¥è®¾å¤‡çš„当å‰ä½ç½®ã€‚"
+
msgid "The tracker tracks the location of a controller."
msgstr "追踪器追踪控制器的ä½ç½®ã€‚"
@@ -28624,3 +30192,15 @@ msgid ""
"Does not reset the orientation of the HMD, only the position of the player "
"gets centered."
msgstr "ä¸é‡ç½® HMD çš„æ–¹å‘,åªè®©çŽ©å®¶çš„ä½ç½®å±…中。"
+
+msgid ""
+"Opens the zip archive at the given [param path] and reads its file index."
+msgstr "打开给定 [param path] 的压缩文件,并读å–其文件索引。"
+
+msgid ""
+"Loads the whole content of a file in the loaded zip archive into memory and "
+"returns it.\n"
+"Must be called after [method open]."
+msgstr ""
+"将加载的 zip 存档中文件的全部内容加载到内存中并返回它。\n"
+"必须在 [method open] 之åŽè°ƒç”¨ã€‚"
diff --git a/drivers/alsa/SCsub b/drivers/alsa/SCsub
index 1d76bb18c4..f17acb0f91 100644
--- a/drivers/alsa/SCsub
+++ b/drivers/alsa/SCsub
@@ -3,6 +3,7 @@
Import("env")
if "alsa" in env and env["alsa"]:
- env.add_source_files(env.drivers_sources, "asound-so_wrap.c")
+ if env["use_sowrap"]:
+ env.add_source_files(env.drivers_sources, "asound-so_wrap.c")
env.add_source_files(env.drivers_sources, "*.cpp")
diff --git a/drivers/alsa/audio_driver_alsa.cpp b/drivers/alsa/audio_driver_alsa.cpp
index 20cd8dd26c..689f76389b 100644
--- a/drivers/alsa/audio_driver_alsa.cpp
+++ b/drivers/alsa/audio_driver_alsa.cpp
@@ -37,7 +37,7 @@
#include <errno.h>
-#ifdef PULSEAUDIO_ENABLED
+#if defined(PULSEAUDIO_ENABLED) && defined(SOWRAP_ENABLED)
extern "C" {
extern int initialize_pulse(int verbose);
}
@@ -153,6 +153,7 @@ Error AudioDriverALSA::init_output_device() {
}
Error AudioDriverALSA::init() {
+#ifdef SOWRAP_ENABLED
#ifdef DEBUG_ENABLED
int dylibloader_verbose = 1;
#else
@@ -167,7 +168,7 @@ Error AudioDriverALSA::init() {
if (initialize_asound(dylibloader_verbose)) {
return ERR_CANT_OPEN;
}
-
+#endif
active.clear();
exit_thread.clear();
diff --git a/drivers/alsa/audio_driver_alsa.h b/drivers/alsa/audio_driver_alsa.h
index 821ba1d145..b62d7188dd 100644
--- a/drivers/alsa/audio_driver_alsa.h
+++ b/drivers/alsa/audio_driver_alsa.h
@@ -38,7 +38,11 @@
#include "core/templates/safe_refcount.h"
#include "servers/audio_server.h"
+#ifdef SOWRAP_ENABLED
#include "asound-so_wrap.h"
+#else
+#include <alsa/asoundlib.h>
+#endif
class AudioDriverALSA : public AudioDriver {
Thread thread;
diff --git a/drivers/alsamidi/midi_driver_alsamidi.h b/drivers/alsamidi/midi_driver_alsamidi.h
index 3c6300411c..80cc96310f 100644
--- a/drivers/alsamidi/midi_driver_alsamidi.h
+++ b/drivers/alsamidi/midi_driver_alsamidi.h
@@ -39,7 +39,12 @@
#include "core/templates/safe_refcount.h"
#include "core/templates/vector.h"
+#ifdef SOWRAP_ENABLED
#include "../alsa/asound-so_wrap.h"
+#else
+#include <alsa/asoundlib.h>
+#endif
+
#include <stdio.h>
class MIDIDriverALSAMidi : public MIDIDriver {
diff --git a/drivers/gles3/rasterizer_canvas_gles3.cpp b/drivers/gles3/rasterizer_canvas_gles3.cpp
index 0e217f699e..2a524e8c3a 100644
--- a/drivers/gles3/rasterizer_canvas_gles3.cpp
+++ b/drivers/gles3/rasterizer_canvas_gles3.cpp
@@ -566,6 +566,7 @@ void RasterizerCanvasGLES3::_render_items(RID p_to_render_target, int p_item_cou
uint32_t index = 0;
Item *current_clip = nullptr;
+ GLES3::CanvasShaderData *shader_data_cache = nullptr;
// Record Batches.
// First item always forms its own batch.
@@ -602,7 +603,6 @@ void RasterizerCanvasGLES3::_render_items(RID p_to_render_target, int p_item_cou
}
}
- GLES3::CanvasShaderData *shader_data_cache = nullptr;
if (material != state.canvas_instance_batches[state.current_batch_index].material) {
_new_batch(batch_broken);
@@ -2259,6 +2259,7 @@ void RasterizerCanvasGLES3::reset_canvas() {
glDisable(GL_DEPTH_TEST);
glDisable(GL_SCISSOR_TEST);
glEnable(GL_BLEND);
+ glBlendEquation(GL_FUNC_ADD);
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE);
glActiveTexture(GL_TEXTURE0 + GLES3::Config::get_singleton()->max_texture_image_units - 2);
diff --git a/drivers/gles3/rasterizer_gles3.cpp b/drivers/gles3/rasterizer_gles3.cpp
index 2e3e6263ed..600aa908cc 100644
--- a/drivers/gles3/rasterizer_gles3.cpp
+++ b/drivers/gles3/rasterizer_gles3.cpp
@@ -306,6 +306,15 @@ void RasterizerGLES3::_blit_render_target_to_screen(RID p_render_target, Display
glReadBuffer(GL_COLOR_ATTACHMENT0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, GLES3::TextureStorage::system_fbo);
+
+ if (p_screen_rect.position != Vector2()) {
+ // Viewport doesn't cover entire window so clear window to black before blitting.
+ Size2i win_size = DisplayServer::get_singleton()->window_get_size();
+ glViewport(0, 0, win_size.width, win_size.height);
+ glClearColor(0.0, 0.0, 0.0, 1.0);
+ glClear(GL_COLOR_BUFFER_BIT);
+ }
+
Vector2i screen_rect_end = p_screen_rect.get_end();
glBlitFramebuffer(0, 0, rt->size.x, rt->size.y,
p_screen_rect.position.x, flip_y ? screen_rect_end.y : p_screen_rect.position.y, screen_rect_end.x, flip_y ? p_screen_rect.position.y : screen_rect_end.y,
diff --git a/drivers/gles3/shaders/stdlib_inc.glsl b/drivers/gles3/shaders/stdlib_inc.glsl
index 0b76c4334a..92bf2d87e4 100644
--- a/drivers/gles3/shaders/stdlib_inc.glsl
+++ b/drivers/gles3/shaders/stdlib_inc.glsl
@@ -14,11 +14,7 @@ uint float2half(uint f) {
uint half2float(uint h) {
uint h_e = h & uint(0x7c00);
- if (h_e == uint(0x0000)) {
- return uint(0);
- } else {
- return ((h & uint(0x8000)) << uint(16)) | ((h_e + uint(0x1c000)) << uint(13)) | ((h & uint(0x03ff)) << uint(13));
- }
+ return ((h & uint(0x8000)) << uint(16)) | uint((h_e >> uint(10)) != uint(0)) * (((h_e + uint(0x1c000)) << uint(13)) | ((h & uint(0x03ff)) << uint(13)));
}
uint packHalf2x16(vec2 v) {
diff --git a/drivers/gles3/storage/material_storage.cpp b/drivers/gles3/storage/material_storage.cpp
index aa8df606cf..2c530e3ae6 100644
--- a/drivers/gles3/storage/material_storage.cpp
+++ b/drivers/gles3/storage/material_storage.cpp
@@ -2881,6 +2881,7 @@ void MaterialStorage::material_set_render_priority(RID p_material, int priority)
if (material->data) {
material->data->set_render_priority(priority);
}
+ material->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MATERIAL);
}
bool MaterialStorage::material_is_animated(RID p_material) {
diff --git a/drivers/gles3/storage/mesh_storage.cpp b/drivers/gles3/storage/mesh_storage.cpp
index 36b34dd8a2..1adba019ba 100644
--- a/drivers/gles3/storage/mesh_storage.cpp
+++ b/drivers/gles3/storage/mesh_storage.cpp
@@ -1686,6 +1686,8 @@ void MeshStorage::multimesh_set_buffer(RID p_multimesh, const Vector<float> &p_b
uint32_t old_stride = multimesh->xform_format == RS::MULTIMESH_TRANSFORM_2D ? 8 : 12;
old_stride += multimesh->uses_colors ? 4 : 0;
old_stride += multimesh->uses_custom_data ? 4 : 0;
+ ERR_FAIL_COND(p_buffer.size() != (multimesh->instances * (int)old_stride));
+
for (int i = 0; i < multimesh->instances; i++) {
{
float *dataptr = w + i * old_stride;
diff --git a/drivers/gles3/storage/texture_storage.cpp b/drivers/gles3/storage/texture_storage.cpp
index 9c9c39cc0e..ce66943328 100644
--- a/drivers/gles3/storage/texture_storage.cpp
+++ b/drivers/gles3/storage/texture_storage.cpp
@@ -806,6 +806,7 @@ void TextureStorage::texture_2d_update(RID p_texture, const Ref<Image> &p_image,
texture_set_data(p_texture, p_image, p_layer);
#ifdef TOOLS_ENABLED
Texture *tex = texture_owner.get_or_null(p_texture);
+ ERR_FAIL_COND(!tex);
tex->image_cache_2d.unref();
#endif
diff --git a/drivers/pulseaudio/SCsub b/drivers/pulseaudio/SCsub
index 467d1448dc..f48489d787 100644
--- a/drivers/pulseaudio/SCsub
+++ b/drivers/pulseaudio/SCsub
@@ -3,6 +3,7 @@
Import("env")
if "pulseaudio" in env and env["pulseaudio"]:
- env.add_source_files(env.drivers_sources, "pulse-so_wrap.c")
+ if env["use_sowrap"]:
+ env.add_source_files(env.drivers_sources, "pulse-so_wrap.c")
env.add_source_files(env.drivers_sources, "*.cpp")
diff --git a/drivers/pulseaudio/audio_driver_pulseaudio.cpp b/drivers/pulseaudio/audio_driver_pulseaudio.cpp
index 0246af4fea..797ffd67fe 100644
--- a/drivers/pulseaudio/audio_driver_pulseaudio.cpp
+++ b/drivers/pulseaudio/audio_driver_pulseaudio.cpp
@@ -37,7 +37,11 @@
#include "core/version.h"
#ifdef ALSAMIDI_ENABLED
+#ifdef SOWRAP_ENABLED
#include "drivers/alsa/asound-so_wrap.h"
+#else
+#include <alsa/asoundlib.h>
+#endif
#endif
void AudioDriverPulseAudio::pa_state_cb(pa_context *c, void *userdata) {
@@ -272,6 +276,7 @@ Error AudioDriverPulseAudio::init_output_device() {
}
Error AudioDriverPulseAudio::init() {
+#ifdef SOWRAP_ENABLED
#ifdef DEBUG_ENABLED
int dylibloader_verbose = 1;
#else
@@ -284,7 +289,7 @@ Error AudioDriverPulseAudio::init() {
if (initialize_pulse(dylibloader_verbose)) {
return ERR_CANT_OPEN;
}
-
+#endif
active.clear();
exit_thread.clear();
diff --git a/drivers/pulseaudio/audio_driver_pulseaudio.h b/drivers/pulseaudio/audio_driver_pulseaudio.h
index f4ff44d361..585e882059 100644
--- a/drivers/pulseaudio/audio_driver_pulseaudio.h
+++ b/drivers/pulseaudio/audio_driver_pulseaudio.h
@@ -38,7 +38,11 @@
#include "core/templates/safe_refcount.h"
#include "servers/audio_server.h"
+#ifdef SOWRAP_ENABLED
#include "pulse-so_wrap.h"
+#else
+#include <pulse/pulseaudio.h>
+#endif
class AudioDriverPulseAudio : public AudioDriver {
Thread thread;
diff --git a/drivers/unix/file_access_unix.cpp b/drivers/unix/file_access_unix.cpp
index 43d3f53904..ee3cb876cf 100644
--- a/drivers/unix/file_access_unix.cpp
+++ b/drivers/unix/file_access_unix.cpp
@@ -318,6 +318,10 @@ Error FileAccessUnix::_set_unix_permissions(const String &p_file, uint32_t p_per
return FAILED;
}
+void FileAccessUnix::close() {
+ _close();
+}
+
CloseNotificationFunc FileAccessUnix::close_notification_func = nullptr;
FileAccessUnix::~FileAccessUnix() {
diff --git a/drivers/unix/file_access_unix.h b/drivers/unix/file_access_unix.h
index 884fb9567f..79c4e73636 100644
--- a/drivers/unix/file_access_unix.h
+++ b/drivers/unix/file_access_unix.h
@@ -82,6 +82,8 @@ public:
virtual uint32_t _get_unix_permissions(const String &p_file) override;
virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override;
+ virtual void close() override;
+
FileAccessUnix() {}
virtual ~FileAccessUnix();
};
diff --git a/drivers/vulkan/rendering_device_vulkan.cpp b/drivers/vulkan/rendering_device_vulkan.cpp
index 58569dc69e..91a746636a 100644
--- a/drivers/vulkan/rendering_device_vulkan.cpp
+++ b/drivers/vulkan/rendering_device_vulkan.cpp
@@ -5927,7 +5927,7 @@ Error RenderingDeviceVulkan::buffer_clear(RID p_buffer, uint32_t p_offset, uint3
return OK;
}
-Vector<uint8_t> RenderingDeviceVulkan::buffer_get_data(RID p_buffer) {
+Vector<uint8_t> RenderingDeviceVulkan::buffer_get_data(RID p_buffer, uint32_t p_offset, uint32_t p_size) {
_THREAD_SAFE_METHOD_
// It could be this buffer was just created.
@@ -5944,12 +5944,20 @@ Vector<uint8_t> RenderingDeviceVulkan::buffer_get_data(RID p_buffer) {
VkCommandBuffer command_buffer = frames[frame].setup_command_buffer;
+ // Size of buffer to retrieve.
+ if (!p_size) {
+ p_size = buffer->size;
+ } else {
+ ERR_FAIL_COND_V_MSG(p_size + p_offset > buffer->size, Vector<uint8_t>(),
+ "Size is larger than the buffer.");
+ }
+
Buffer tmp_buffer;
- _buffer_allocate(&tmp_buffer, buffer->size, VK_BUFFER_USAGE_TRANSFER_DST_BIT, VMA_MEMORY_USAGE_AUTO_PREFER_HOST, VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT);
+ _buffer_allocate(&tmp_buffer, p_size, VK_BUFFER_USAGE_TRANSFER_DST_BIT, VMA_MEMORY_USAGE_AUTO_PREFER_HOST, VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT);
VkBufferCopy region;
- region.srcOffset = 0;
+ region.srcOffset = p_offset;
region.dstOffset = 0;
- region.size = buffer->size;
+ region.size = p_size;
vkCmdCopyBuffer(command_buffer, buffer->buffer, tmp_buffer.buffer, 1, &region); // Dst buffer is in CPU, but I wonder if src buffer needs a barrier for this.
// Flush everything so memory can be safely mapped.
_flush(true);
@@ -5960,9 +5968,9 @@ Vector<uint8_t> RenderingDeviceVulkan::buffer_get_data(RID p_buffer) {
Vector<uint8_t> buffer_data;
{
- buffer_data.resize(buffer->size);
+ buffer_data.resize(p_size);
uint8_t *w = buffer_data.ptrw();
- memcpy(w, buffer_mem, buffer->size);
+ memcpy(w, buffer_mem, p_size);
}
vmaUnmapMemory(allocator, tmp_buffer.allocation);
@@ -8454,14 +8462,17 @@ void RenderingDeviceVulkan::set_resource_name(RID p_id, const String p_name) {
}
void RenderingDeviceVulkan::draw_command_begin_label(String p_label_name, const Color p_color) {
+ _THREAD_SAFE_METHOD_
context->command_begin_label(frames[frame].draw_command_buffer, p_label_name, p_color);
}
void RenderingDeviceVulkan::draw_command_insert_label(String p_label_name, const Color p_color) {
+ _THREAD_SAFE_METHOD_
context->command_insert_label(frames[frame].draw_command_buffer, p_label_name, p_color);
}
void RenderingDeviceVulkan::draw_command_end_label() {
+ _THREAD_SAFE_METHOD_
context->command_end_label(frames[frame].draw_command_buffer);
}
diff --git a/drivers/vulkan/rendering_device_vulkan.h b/drivers/vulkan/rendering_device_vulkan.h
index 63c6b97515..91a09fa970 100644
--- a/drivers/vulkan/rendering_device_vulkan.h
+++ b/drivers/vulkan/rendering_device_vulkan.h
@@ -1122,7 +1122,7 @@ public:
virtual Error buffer_update(RID p_buffer, uint32_t p_offset, uint32_t p_size, const void *p_data, BitField<BarrierMask> p_post_barrier = BARRIER_MASK_ALL_BARRIERS); // Works for any buffer.
virtual Error buffer_clear(RID p_buffer, uint32_t p_offset, uint32_t p_size, BitField<BarrierMask> p_post_barrier = BARRIER_MASK_ALL_BARRIERS);
- virtual Vector<uint8_t> buffer_get_data(RID p_buffer);
+ virtual Vector<uint8_t> buffer_get_data(RID p_buffer, uint32_t p_offset = 0, uint32_t p_size = 0);
/*************************/
/**** RENDER PIPELINE ****/
diff --git a/drivers/vulkan/vulkan_context.cpp b/drivers/vulkan/vulkan_context.cpp
index 179de8227a..b8cea7136d 100644
--- a/drivers/vulkan/vulkan_context.cpp
+++ b/drivers/vulkan/vulkan_context.cpp
@@ -1871,7 +1871,10 @@ Error VulkanContext::_update_swap_chain(Window *window) {
// Set the windows present mode if it is available, otherwise FIFO is used (guaranteed supported).
if (present_mode_available) {
- window->presentMode = requested_present_mode;
+ if (window->presentMode != requested_present_mode) {
+ window->presentMode = requested_present_mode;
+ print_verbose("Using present mode: " + String(string_VkPresentModeKHR(window->presentMode)));
+ }
} else {
String present_mode_string;
switch (window->vsync_mode) {
@@ -1892,8 +1895,6 @@ Error VulkanContext::_update_swap_chain(Window *window) {
window->vsync_mode = DisplayServer::VSYNC_ENABLED; // Set to default.
}
- print_verbose("Using present mode: " + String(string_VkPresentModeKHR(window->presentMode)));
-
free(presentModes);
// Determine the number of VkImages to use in the swap chain.
diff --git a/drivers/windows/file_access_windows.cpp b/drivers/windows/file_access_windows.cpp
index ea40622afc..0e51586b5a 100644
--- a/drivers/windows/file_access_windows.cpp
+++ b/drivers/windows/file_access_windows.cpp
@@ -375,6 +375,10 @@ Error FileAccessWindows::_set_unix_permissions(const String &p_file, uint32_t p_
return ERR_UNAVAILABLE;
}
+void FileAccessWindows::close() {
+ _close();
+}
+
FileAccessWindows::~FileAccessWindows() {
_close();
}
@@ -391,6 +395,7 @@ void FileAccessWindows::initialize() {
reserved_file_index++;
}
}
+
void FileAccessWindows::finalize() {
invalid_files.clear();
}
diff --git a/drivers/windows/file_access_windows.h b/drivers/windows/file_access_windows.h
index 2b9960d494..453f8d3b5f 100644
--- a/drivers/windows/file_access_windows.h
+++ b/drivers/windows/file_access_windows.h
@@ -82,6 +82,8 @@ public:
virtual uint32_t _get_unix_permissions(const String &p_file) override;
virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override;
+ virtual void close() override;
+
static void initialize();
static void finalize();
diff --git a/editor/animation_track_editor.cpp b/editor/animation_track_editor.cpp
index 8426dfd1ac..9eabc31621 100644
--- a/editor/animation_track_editor.cpp
+++ b/editor/animation_track_editor.cpp
@@ -1522,6 +1522,8 @@ void AnimationTimelineEdit::set_animation(const Ref<Animation> &p_animation, boo
animation = p_animation;
read_only = p_read_only;
+ length->set_read_only(read_only);
+
if (animation.is_valid()) {
len_hb->show();
if (read_only) {
@@ -2003,7 +2005,6 @@ void AnimationTrackEdit::_notification(int p_what) {
draw_texture(down_icon, Vector2(ofs, int(get_size().height - down_icon->get_height()) / 2));
update_mode_rect.size.x += down_icon->get_width();
} else if (animation->track_get_type(track) == Animation::TYPE_BEZIER) {
- Ref<Texture2D> bezier_icon = get_theme_icon(SNAME("EditBezier"), SNAME("EditorIcons"));
update_mode_rect.size.x += down_icon->get_width();
update_mode_rect = Rect2();
} else {
@@ -2228,7 +2229,7 @@ void AnimationTrackEdit::draw_key(int p_index, float p_pixels_sec, int p_x, bool
if (i > 0) {
text += ", ";
}
- text += String(args[i]);
+ text += args[i].get_construct_string();
}
text += ")";
@@ -2540,7 +2541,7 @@ String AnimationTrackEdit::get_tooltip(const Point2 &p_pos) const {
if (i > 0) {
text += ", ";
}
- text += String(args[i]);
+ text += args[i].get_construct_string();
}
text += ")\n";
@@ -3311,25 +3312,15 @@ void AnimationTrackEditor::set_animation(const Ref<Animation> &p_anim, bool p_re
snap->set_disabled(false);
snap_mode->set_disabled(false);
- bezier_edit_icon->set_disabled(true);
-
imported_anim_warning->hide();
- bool import_warning_done = false;
- bool bezier_done = false;
for (int i = 0; i < animation->get_track_count(); i++) {
if (animation->track_is_imported(i)) {
imported_anim_warning->show();
- import_warning_done = true;
- }
- if (animation->track_get_type(i) == Animation::TrackType::TYPE_BEZIER) {
- bezier_edit_icon->set_disabled(false);
- bezier_done = true;
- }
- if (import_warning_done && bezier_done) {
break;
}
}
+ _check_bezier_exist();
} else {
hscroll->hide();
edit->set_disabled(true);
@@ -3343,6 +3334,24 @@ void AnimationTrackEditor::set_animation(const Ref<Animation> &p_anim, bool p_re
}
}
+void AnimationTrackEditor::_check_bezier_exist() {
+ bool is_exist = false;
+ for (int i = 0; i < animation->get_track_count(); i++) {
+ if (animation->track_get_type(i) == Animation::TrackType::TYPE_BEZIER) {
+ is_exist = true;
+ break;
+ }
+ }
+ if (is_exist) {
+ bezier_edit_icon->set_disabled(false);
+ } else {
+ if (bezier_edit->is_visible()) {
+ _cancel_bezier_edit();
+ }
+ bezier_edit_icon->set_disabled(true);
+ }
+}
+
Ref<Animation> AnimationTrackEditor::get_current_animation() const {
return animation;
}
@@ -4292,6 +4301,8 @@ void AnimationTrackEditor::_update_tracks() {
memdelete(track_vbox->get_child(0));
}
+ timeline->set_track_edit(nullptr);
+
track_edits.clear();
groups.clear();
@@ -4490,6 +4501,8 @@ void AnimationTrackEditor::_animation_changed() {
return; // All will be updated, don't bother with anything.
}
+ _check_bezier_exist();
+
if (key_edit) {
if (key_edit->setting) {
// If editing a key, just redraw the edited track, makes refresh less costly.
@@ -4710,7 +4723,6 @@ void AnimationTrackEditor::_new_track_node_selected(NodePath p_path) {
adding_track_path = path_to;
prop_selector->set_type_filter(filter);
prop_selector->select_property_from_instance(node);
- bezier_edit_icon->set_disabled(false);
} break;
case Animation::TYPE_AUDIO: {
if (!node->is_class("AudioStreamPlayer") && !node->is_class("AudioStreamPlayer2D") && !node->is_class("AudioStreamPlayer3D")) {
diff --git a/editor/animation_track_editor.h b/editor/animation_track_editor.h
index 2a59bda2a4..c733f397e3 100644
--- a/editor/animation_track_editor.h
+++ b/editor/animation_track_editor.h
@@ -399,6 +399,7 @@ class AnimationTrackEditor : public VBoxContainer {
void _update_tracks();
void _redraw_tracks();
void _redraw_groups();
+ void _check_bezier_exist();
void _name_limit_changed();
void _timeline_changed(float p_new_pos, bool p_drag, bool p_timeline_only);
diff --git a/editor/animation_track_editor_plugins.cpp b/editor/animation_track_editor_plugins.cpp
index 2895aa9710..be4a070213 100644
--- a/editor/animation_track_editor_plugins.cpp
+++ b/editor/animation_track_editor_plugins.cpp
@@ -847,9 +847,14 @@ bool AnimationTrackEditTypeAudio::is_key_selectable_by_distance() const {
void AnimationTrackEditTypeAudio::draw_key(int p_index, float p_pixels_sec, int p_x, bool p_selected, int p_clip_left, int p_clip_right) {
Ref<AudioStream> stream = get_animation()->audio_track_get_key_stream(get_track(), p_index);
-
if (!stream.is_valid()) {
- AnimationTrackEdit::draw_key(p_index, p_pixels_sec, p_x, p_selected, p_clip_left, p_clip_right);
+ AnimationTrackEdit::draw_key(p_index, p_pixels_sec, p_x, p_selected, p_clip_left, p_clip_right); // Draw diamond.
+ return;
+ }
+
+ float len = stream->get_length();
+ if (len == 0) {
+ AnimationTrackEdit::draw_key(p_index, p_pixels_sec, p_x, p_selected, p_clip_left, p_clip_right); // Draw diamond.
return;
}
@@ -871,16 +876,10 @@ void AnimationTrackEditTypeAudio::draw_key(int p_index, float p_pixels_sec, int
int font_size = get_theme_font_size(SNAME("font_size"), SNAME("Label"));
float fh = int(font->get_height(font_size) * 1.5);
- float len = stream->get_length();
-
Ref<AudioStreamPreview> preview = AudioStreamPreviewGenerator::get_singleton()->generate_preview(stream);
float preview_len = preview->get_length();
- if (len == 0) {
- len = preview_len;
- }
-
int pixel_total_len = len * p_pixels_sec;
len -= end_ofs;
@@ -1044,16 +1043,13 @@ void AnimationTrackEditTypeAudio::gui_input(const Ref<InputEvent> &p_event) {
continue;
}
- float start_ofs = get_animation()->audio_track_get_key_start_offset(get_track(), i);
- float end_ofs = get_animation()->audio_track_get_key_end_offset(get_track(), i);
float len = stream->get_length();
-
if (len == 0) {
- Ref<AudioStreamPreview> preview = AudioStreamPreviewGenerator::get_singleton()->generate_preview(stream);
- float preview_len = preview->get_length();
- len = preview_len;
+ continue;
}
+ float start_ofs = get_animation()->audio_track_get_key_start_offset(get_track(), i);
+ float end_ofs = get_animation()->audio_track_get_key_end_offset(get_track(), i);
len -= end_ofs;
len -= start_ofs;
diff --git a/editor/code_editor.cpp b/editor/code_editor.cpp
index b217cd57bf..9a8a1097cd 100644
--- a/editor/code_editor.cpp
+++ b/editor/code_editor.cpp
@@ -1312,20 +1312,15 @@ void CodeTextEditor::move_lines_up() {
Vector<int> new_group{ c };
Pair<int, int> group_border;
- if (text_editor->has_selection(c)) {
- group_border.first = text_editor->get_selection_from_line(c);
- group_border.second = text_editor->get_selection_to_line(c);
- } else {
- group_border.first = text_editor->get_caret_line(c);
- group_border.second = text_editor->get_caret_line(c);
- }
+ group_border.first = _get_affected_lines_from(c);
+ group_border.second = _get_affected_lines_to(c);
for (int j = i; j < caret_edit_order.size() - 1; j++) {
int c_current = caret_edit_order[j];
int c_next = caret_edit_order[j + 1];
- int next_start_pos = text_editor->has_selection(c_next) ? text_editor->get_selection_from_line(c_next) : text_editor->get_caret_line(c_next);
- int next_end_pos = text_editor->has_selection(c_next) ? text_editor->get_selection_to_line(c_next) : text_editor->get_caret_line(c_next);
+ int next_start_pos = _get_affected_lines_from(c_next);
+ int next_end_pos = _get_affected_lines_to(c_next);
int current_start_pos = text_editor->has_selection(c_current) ? text_editor->get_selection_from_line(c_current) : text_editor->get_caret_line(c_current);
@@ -1405,27 +1400,22 @@ void CodeTextEditor::move_lines_down() {
// Lists of carets representing each group
Vector<Vector<int>> caret_groups;
Vector<Pair<int, int>> group_borders;
-
+ Vector<int> group_border_ends;
// Search for groups of carets and their selections residing on the same lines
for (int i = 0; i < caret_edit_order.size(); i++) {
int c = caret_edit_order[i];
Vector<int> new_group{ c };
Pair<int, int> group_border;
- if (text_editor->has_selection(c)) {
- group_border.first = text_editor->get_selection_from_line(c);
- group_border.second = text_editor->get_selection_to_line(c);
- } else {
- group_border.first = text_editor->get_caret_line(c);
- group_border.second = text_editor->get_caret_line(c);
- }
+ group_border.first = _get_affected_lines_from(c);
+ group_border.second = _get_affected_lines_to(c);
for (int j = i; j < caret_edit_order.size() - 1; j++) {
int c_current = caret_edit_order[j];
int c_next = caret_edit_order[j + 1];
- int next_start_pos = text_editor->has_selection(c_next) ? text_editor->get_selection_from_line(c_next) : text_editor->get_caret_line(c_next);
- int next_end_pos = text_editor->has_selection(c_next) ? text_editor->get_selection_to_line(c_next) : text_editor->get_caret_line(c_next);
+ int next_start_pos = _get_affected_lines_from(c_next);
+ int next_end_pos = _get_affected_lines_to(c_next);
int current_start_pos = text_editor->has_selection(c_current) ? text_editor->get_selection_from_line(c_current) : text_editor->get_caret_line(c_current);
@@ -1442,16 +1432,17 @@ void CodeTextEditor::move_lines_down() {
}
}
group_borders.push_back(group_border);
+ group_border_ends.push_back(text_editor->has_selection(c) ? text_editor->get_selection_to_line(c) : text_editor->get_caret_line(c));
caret_groups.push_back(new_group);
}
for (int i = 0; i < group_borders.size(); i++) {
- if (group_borders[i].second + 1 > text_editor->get_line_count() - 1) {
+ if (group_border_ends[i] + 1 > text_editor->get_line_count() - 1) {
continue;
}
// If the group starts overlapping with the upper group don't move it
- if (i > 0 && group_borders[i].second + 1 >= group_borders[i - 1].first) {
+ if (i > 0 && group_border_ends[i] + 1 >= group_borders[i - 1].first) {
continue;
}
@@ -1498,87 +1489,44 @@ void CodeTextEditor::move_lines_down() {
text_editor->queue_redraw();
}
-void CodeTextEditor::_delete_line(int p_line, int p_caret) {
- // this is currently intended to be called within delete_lines()
- // so `begin_complex_operation` is omitted here
- text_editor->set_line(p_line, "");
- if (p_line == 0 && text_editor->get_line_count() > 1) {
- text_editor->set_caret_line(1, p_caret == 0, true, 0, p_caret);
- text_editor->set_caret_column(0, p_caret == 0, p_caret);
- }
- text_editor->backspace(p_caret);
- if (p_line < text_editor->get_line_count()) {
- text_editor->unfold_line(p_line);
- }
- text_editor->set_caret_line(p_line, p_caret == 0, true, 0, p_caret);
-}
-
void CodeTextEditor::delete_lines() {
text_editor->begin_complex_operation();
- Vector<int> carets_to_remove;
-
Vector<int> caret_edit_order = text_editor->get_caret_index_edit_order();
- for (int i = 0; i < caret_edit_order.size(); i++) {
- int c = caret_edit_order[i];
- int cl = text_editor->get_caret_line(c);
-
- bool swaped_caret = false;
- for (int j = i + 1; j < caret_edit_order.size(); j++) {
- if (text_editor->has_selection(caret_edit_order[j])) {
- if (text_editor->get_selection_from_line() == cl) {
- carets_to_remove.push_back(caret_edit_order[j]);
- continue;
- }
-
- if (text_editor->get_selection_to_line() == cl) {
- if (text_editor->has_selection(c)) {
- if (text_editor->get_selection_to_line(c) != cl) {
- text_editor->select(cl + 1, 0, text_editor->get_selection_to_line(c), text_editor->get_selection_to_column(c), c);
- break;
- }
- }
-
- carets_to_remove.push_back(c);
- i = j - 1;
- swaped_caret = true;
- break;
- }
- break;
- }
-
- if (text_editor->get_caret_line(caret_edit_order[j]) == cl) {
- carets_to_remove.push_back(caret_edit_order[j]);
- i = j;
+ Vector<int> lines;
+ int last_line = INT_MAX;
+ for (const int &c : caret_edit_order) {
+ for (int line = _get_affected_lines_to(c); line >= _get_affected_lines_from(c); line--) {
+ if (line >= last_line) {
continue;
}
- break;
+ last_line = line;
+ lines.append(line);
}
+ }
- if (swaped_caret) {
- continue;
+ for (const int &line : lines) {
+ if (line != text_editor->get_line_count() - 1) {
+ text_editor->remove_text(line, 0, line + 1, 0);
+ } else {
+ text_editor->remove_text(line - 1, text_editor->get_line(line - 1).length(), line, text_editor->get_line(line).length());
}
-
- if (text_editor->has_selection(c)) {
- int to_line = text_editor->get_selection_to_line(c);
- int from_line = text_editor->get_selection_from_line(c);
- int count = Math::abs(to_line - from_line) + 1;
-
- text_editor->set_caret_line(from_line, false, true, 0, c);
- text_editor->deselect(c);
- for (int j = 0; j < count; j++) {
- _delete_line(from_line, c);
+ // Readjust carets.
+ int new_line = MIN(line, text_editor->get_line_count() - 1);
+ text_editor->unfold_line(new_line);
+ for (const int &c : caret_edit_order) {
+ if (text_editor->get_caret_line(c) == line || (text_editor->get_caret_line(c) == line + 1 && text_editor->get_caret_column(c) == 0)) {
+ text_editor->deselect(c);
+ text_editor->set_caret_line(new_line, c == 0, true, 0, c);
+ continue;
}
- } else {
- _delete_line(text_editor->get_caret_line(c), c);
+ if (text_editor->get_caret_line(c) > line) {
+ text_editor->set_caret_line(text_editor->get_caret_line(c) - 1, c == 0, true, 0, c);
+ continue;
+ }
+ break;
}
}
-
- // Sort and remove backwards to preserve indexes.
- carets_to_remove.sort();
- for (int i = carets_to_remove.size() - 1; i >= 0; i--) {
- text_editor->remove_caret(carets_to_remove[i]);
- }
text_editor->merge_overlapping_carets();
text_editor->end_complex_operation();
}
@@ -1634,77 +1582,68 @@ void CodeTextEditor::toggle_inline_comment(const String &delimiter) {
text_editor->begin_complex_operation();
Vector<int> caret_edit_order = text_editor->get_caret_index_edit_order();
- for (const int &c : caret_edit_order) {
- if (text_editor->has_selection(c)) {
- int begin = text_editor->get_selection_from_line(c);
- int end = text_editor->get_selection_to_line(c);
-
- // End of selection ends on the first column of the last line, ignore it.
- if (text_editor->get_selection_to_column(c) == 0) {
- end -= 1;
+ caret_edit_order.reverse();
+ int last_line = -1;
+ for (const int &c1 : caret_edit_order) {
+ int from = _get_affected_lines_from(c1);
+ from += from == last_line ? 1 : 0;
+ int to = _get_affected_lines_to(c1);
+ last_line = to;
+ // Check first if there's any uncommented lines in selection.
+ bool is_commented = true;
+ for (int line = from; line <= to; line++) {
+ if (!text_editor->get_line(line).begins_with(delimiter)) {
+ is_commented = false;
+ break;
}
+ }
- int col_to = text_editor->get_selection_to_column(c);
- int cursor_pos = text_editor->get_caret_column(c);
-
- // Check if all lines in the selected block are commented.
- bool is_commented = true;
- for (int i = begin; i <= end; i++) {
- if (!text_editor->get_line(i).begins_with(delimiter)) {
- is_commented = false;
- break;
- }
+ // Caret positions need to be saved since they could be moved at the eol.
+ Vector<int> caret_cols;
+ Vector<int> selection_to_cols;
+ for (const int &c2 : caret_edit_order) {
+ if (text_editor->get_caret_line(c2) >= from && text_editor->get_caret_line(c2) <= to) {
+ caret_cols.append(text_editor->get_caret_column(c2));
}
- for (int i = begin; i <= end; i++) {
- String line_text = text_editor->get_line(i);
-
- if (line_text.strip_edges().is_empty()) {
- line_text = delimiter;
- } else {
- if (is_commented) {
- line_text = line_text.substr(delimiter.length(), line_text.length());
- } else {
- line_text = delimiter + line_text;
- }
- }
- text_editor->set_line(i, line_text);
+ if (text_editor->has_selection(c2) && text_editor->get_selection_to_line(c2) >= from && text_editor->get_selection_to_line(c2) <= to) {
+ selection_to_cols.append(text_editor->get_selection_to_column(c2));
}
+ }
- // Adjust selection & cursor position.
- int offset = (is_commented ? -1 : 1) * delimiter.length();
- int col_from = text_editor->get_selection_from_column(c) > 0 ? text_editor->get_selection_from_column(c) + offset : 0;
-
- if (is_commented && text_editor->get_caret_column(c) == text_editor->get_line(text_editor->get_caret_line(c)).length() + 1) {
- cursor_pos += 1;
+ // Comment/uncomment.
+ for (int line = from; line <= to; line++) {
+ String line_text = text_editor->get_line(line);
+ if (line_text.strip_edges().is_empty()) {
+ text_editor->set_line(line, delimiter);
+ continue;
}
-
- if (text_editor->get_selection_to_column(c) != 0 && col_to != text_editor->get_line(text_editor->get_selection_to_line(c)).length() + 1) {
- col_to += offset;
+ if (is_commented) {
+ text_editor->set_line(line, line_text.substr(delimiter.length(), line_text.length()));
+ continue;
}
+ text_editor->set_line(line, delimiter + line_text);
+ }
- if (text_editor->get_caret_column(c) != 0) {
- cursor_pos += offset;
+ // Readjust carets and selections.
+ int caret_i = 0;
+ int selection_i = 0;
+ int offset = (is_commented ? -1 : 1) * delimiter.length();
+ for (const int &c2 : caret_edit_order) {
+ bool is_line_selection = text_editor->has_selection(c2) && text_editor->get_selection_from_line(c2) < text_editor->get_selection_to_line(c2);
+ if (text_editor->get_caret_line(c2) >= from && text_editor->get_caret_line(c2) <= to) {
+ int caret_col = caret_cols[caret_i++];
+ caret_col += (is_line_selection && caret_col == 0) ? 0 : offset;
+ text_editor->set_caret_column(caret_col, c2 == 0, c2);
}
-
- text_editor->select(begin, col_from, text_editor->get_selection_to_line(c), col_to, c);
- text_editor->set_caret_column(cursor_pos, c == 0, c);
-
- } else {
- int begin = text_editor->get_caret_line(c);
- String line_text = text_editor->get_line(begin);
- int delimiter_length = delimiter.length();
-
- int col = text_editor->get_caret_column(c);
- if (line_text.begins_with(delimiter)) {
- line_text = line_text.substr(delimiter_length, line_text.length());
- col -= delimiter_length;
- } else {
- line_text = delimiter + line_text;
- col += delimiter_length;
+ if (text_editor->has_selection(c2) && text_editor->get_selection_to_line(c2) >= from && text_editor->get_selection_to_line(c2) <= to) {
+ int from_col = text_editor->get_selection_from_column(c2);
+ from_col += (is_line_selection && from_col == 0) ? 0 : offset;
+ int to_col = selection_to_cols[selection_i++];
+ to_col += (to_col == 0) ? 0 : offset;
+ text_editor->select(
+ text_editor->get_selection_from_line(c2), from_col,
+ text_editor->get_selection_to_line(c2), to_col, c2);
}
-
- text_editor->set_line(begin, line_text);
- text_editor->set_caret_column(col, c == 0, c);
}
}
text_editor->merge_overlapping_carets();
@@ -1942,6 +1881,22 @@ void CodeTextEditor::_toggle_scripts_pressed() {
update_toggle_scripts_button();
}
+int CodeTextEditor::_get_affected_lines_from(int p_caret) {
+ return text_editor->has_selection(p_caret) ? text_editor->get_selection_from_line(p_caret) : text_editor->get_caret_line(p_caret);
+}
+
+int CodeTextEditor::_get_affected_lines_to(int p_caret) {
+ if (!text_editor->has_selection(p_caret)) {
+ return text_editor->get_caret_line(p_caret);
+ }
+ int line = text_editor->get_selection_to_line(p_caret);
+ // Don't affect a line with no selected characters
+ if (text_editor->get_selection_to_column(p_caret) == 0) {
+ line--;
+ }
+ return line;
+}
+
void CodeTextEditor::_error_pressed(const Ref<InputEvent> &p_event) {
Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) {
@@ -2010,9 +1965,36 @@ void CodeTextEditor::set_warning_count(int p_warning_count) {
}
void CodeTextEditor::toggle_bookmark() {
- for (int i = 0; i < text_editor->get_caret_count(); i++) {
- int line = text_editor->get_caret_line(i);
- text_editor->set_line_as_bookmarked(line, !text_editor->is_line_bookmarked(line));
+ Vector<int> caret_edit_order = text_editor->get_caret_index_edit_order();
+ caret_edit_order.reverse();
+ int last_line = -1;
+ for (const int &c : caret_edit_order) {
+ int from = text_editor->has_selection(c) ? text_editor->get_selection_from_line(c) : text_editor->get_caret_line(c);
+ from += from == last_line ? 1 : 0;
+ int to = text_editor->has_selection(c) ? text_editor->get_selection_to_line(c) : text_editor->get_caret_line(c);
+ if (to < from) {
+ continue;
+ }
+ // Check first if there's any bookmarked lines in the selection.
+ bool selection_has_bookmarks = false;
+ for (int line = from; line <= to; line++) {
+ if (text_editor->is_line_bookmarked(line)) {
+ selection_has_bookmarks = true;
+ break;
+ }
+ }
+
+ // Set bookmark on caret or remove all bookmarks from the selection.
+ if (!selection_has_bookmarks) {
+ if (text_editor->get_caret_line(c) != last_line) {
+ text_editor->set_line_as_bookmarked(text_editor->get_caret_line(c), true);
+ }
+ } else {
+ for (int line = from; line <= to; line++) {
+ text_editor->set_line_as_bookmarked(line, false);
+ }
+ }
+ last_line = to;
}
}
diff --git a/editor/code_editor.h b/editor/code_editor.h
index fe2a31a7a7..343720637b 100644
--- a/editor/code_editor.h
+++ b/editor/code_editor.h
@@ -198,9 +198,11 @@ class CodeTextEditor : public VBoxContainer {
void _update_status_bar_theme();
- void _delete_line(int p_line, int p_caret);
void _toggle_scripts_pressed();
+ int _get_affected_lines_from(int p_caret);
+ int _get_affected_lines_to(int p_caret);
+
protected:
virtual void _load_theme_settings() {}
virtual void _validate_script() {}
diff --git a/editor/editor_autoload_settings.cpp b/editor/editor_autoload_settings.cpp
index f843733f2c..a6defd0e14 100644
--- a/editor/editor_autoload_settings.cpp
+++ b/editor/editor_autoload_settings.cpp
@@ -890,7 +890,7 @@ EditorAutoloadSettings::EditorAutoloadSettings() {
hbc->add_child(autoload_add_path);
autoload_add_path->set_h_size_flags(Control::SIZE_EXPAND_FILL);
autoload_add_path->set_clear_button_enabled(true);
- autoload_add_path->set_placeholder(vformat(TTR(R"(Set path or press "%s" to create a script.)"), TTR("Add")));
+ autoload_add_path->set_placeholder(vformat(TTR("Set path or press \"%s\" to create a script."), TTR("Add")));
autoload_add_path->connect("text_changed", callable_mp(this, &EditorAutoloadSettings::_autoload_path_text_changed));
browse_button = memnew(Button);
diff --git a/editor/editor_file_system.cpp b/editor/editor_file_system.cpp
index ec1ef8a6bc..8a595be6e6 100644
--- a/editor/editor_file_system.cpp
+++ b/editor/editor_file_system.cpp
@@ -1237,10 +1237,23 @@ void EditorFileSystem::_notification(int p_what) {
case NOTIFICATION_PROCESS: {
if (use_threads) {
+ /** This hack exists because of the EditorProgress nature
+ * of processing events recursively. This needs to be rewritten
+ * at some point entirely, but in the meantime the following
+ * hack prevents deadlock on import.
+ */
+
+ static bool prevent_recursive_process_hack = false;
+ if (prevent_recursive_process_hack) {
+ break;
+ }
+
+ prevent_recursive_process_hack = true;
+
+ bool done_importing = false;
+
if (scanning_changes) {
if (scanning_changes_done) {
- scanning_changes = false;
-
set_process(false);
thread_sources.wait_to_finish();
@@ -1251,6 +1264,8 @@ void EditorFileSystem::_notification(int p_what) {
}
emit_signal(SNAME("sources_changed"), sources_changed.size() > 0);
first_scan = false;
+ scanning_changes = false; // Changed to false here to prevent recursive triggering of scan thread.
+ done_importing = true;
}
} else if (!scanning && thread.is_started()) {
set_process(false);
@@ -1268,10 +1283,12 @@ void EditorFileSystem::_notification(int p_what) {
first_scan = false;
}
- if (!is_processing() && scan_changes_pending) {
+ if (done_importing && scan_changes_pending) {
scan_changes_pending = false;
scan_changes();
}
+
+ prevent_recursive_process_hack = false;
}
} break;
}
@@ -2167,6 +2184,11 @@ void EditorFileSystem::_find_group_files(EditorFileSystemDirectory *efd, HashMap
void EditorFileSystem::reimport_file_with_custom_parameters(const String &p_file, const String &p_importer, const HashMap<StringName, Variant> &p_custom_params) {
_reimport_file(p_file, p_custom_params, p_importer);
+
+ // Emit the resource_reimported signal for the single file we just reimported.
+ Vector<String> reloads;
+ reloads.append(p_file);
+ emit_signal(SNAME("resources_reimported"), reloads);
}
void EditorFileSystem::_reimport_thread(uint32_t p_index, ImportThreadData *p_import_data) {
@@ -2175,6 +2197,7 @@ void EditorFileSystem::_reimport_thread(uint32_t p_index, ImportThreadData *p_im
}
void EditorFileSystem::reimport_files(const Vector<String> &p_files) {
+ ERR_FAIL_COND_MSG(importing, "Attempted to call reimport_files() recursively, this is not allowed.");
importing = true;
Vector<String> reloads;
diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp
index bb7098643a..acbc3ce0dc 100644
--- a/editor/editor_help.cpp
+++ b/editor/editor_help.cpp
@@ -45,15 +45,34 @@
DocTools *EditorHelp::doc = nullptr;
-void EditorHelp::_update_theme() {
- text_color = get_theme_color(SNAME("text_color"), SNAME("EditorHelp"));
- title_color = get_theme_color(SNAME("title_color"), SNAME("EditorHelp"));
- headline_color = get_theme_color(SNAME("headline_color"), SNAME("EditorHelp"));
- comment_color = get_theme_color(SNAME("comment_color"), SNAME("EditorHelp"));
- symbol_color = get_theme_color(SNAME("symbol_color"), SNAME("EditorHelp"));
- value_color = get_theme_color(SNAME("value_color"), SNAME("EditorHelp"));
- qualifier_color = get_theme_color(SNAME("qualifier_color"), SNAME("EditorHelp"));
- type_color = get_theme_color(SNAME("type_color"), SNAME("EditorHelp"));
+void EditorHelp::_update_theme_item_cache() {
+ VBoxContainer::_update_theme_item_cache();
+
+ theme_cache.text_color = get_theme_color(SNAME("text_color"), SNAME("EditorHelp"));
+ theme_cache.title_color = get_theme_color(SNAME("title_color"), SNAME("EditorHelp"));
+ theme_cache.headline_color = get_theme_color(SNAME("headline_color"), SNAME("EditorHelp"));
+ theme_cache.comment_color = get_theme_color(SNAME("comment_color"), SNAME("EditorHelp"));
+ theme_cache.symbol_color = get_theme_color(SNAME("symbol_color"), SNAME("EditorHelp"));
+ theme_cache.value_color = get_theme_color(SNAME("value_color"), SNAME("EditorHelp"));
+ theme_cache.qualifier_color = get_theme_color(SNAME("qualifier_color"), SNAME("EditorHelp"));
+ theme_cache.type_color = get_theme_color(SNAME("type_color"), SNAME("EditorHelp"));
+
+ theme_cache.doc_font = get_theme_font(SNAME("doc"), SNAME("EditorFonts"));
+ theme_cache.doc_bold_font = get_theme_font(SNAME("doc_bold"), SNAME("EditorFonts"));
+ theme_cache.doc_italic_font = get_theme_font(SNAME("doc_italic"), SNAME("EditorFonts"));
+ theme_cache.doc_title_font = get_theme_font(SNAME("doc_title"), SNAME("EditorFonts"));
+ theme_cache.doc_code_font = get_theme_font(SNAME("doc_source"), SNAME("EditorFonts"));
+ theme_cache.doc_kbd_font = get_theme_font(SNAME("doc_keyboard"), SNAME("EditorFonts"));
+
+ theme_cache.doc_font_size = get_theme_font_size(SNAME("doc_size"), SNAME("EditorFonts"));
+ theme_cache.doc_title_font_size = get_theme_font_size(SNAME("doc_title_size"), SNAME("EditorFonts"));
+ theme_cache.doc_code_font_size = get_theme_font_size(SNAME("doc_source_size"), SNAME("EditorFonts"));
+ theme_cache.doc_kbd_font_size = get_theme_font_size(SNAME("doc_keyboard_size"), SNAME("EditorFonts"));
+
+ theme_cache.background_style = get_theme_stylebox(SNAME("background"), SNAME("EditorHelp"));
+
+ class_desc->add_theme_font_override("normal_font", theme_cache.doc_font);
+ class_desc->add_theme_font_size_override("normal_font_size", theme_cache.doc_font_size);
class_desc->add_theme_color_override("selection_color", get_theme_color(SNAME("selection_color"), SNAME("EditorHelp")));
class_desc->add_theme_constant_override("line_separation", get_theme_constant(SNAME("line_separation"), SNAME("EditorHelp")));
@@ -61,13 +80,6 @@ void EditorHelp::_update_theme() {
class_desc->add_theme_constant_override("table_v_separation", get_theme_constant(SNAME("table_v_separation"), SNAME("EditorHelp")));
class_desc->add_theme_constant_override("text_highlight_h_padding", get_theme_constant(SNAME("text_highlight_h_padding"), SNAME("EditorHelp")));
class_desc->add_theme_constant_override("text_highlight_v_padding", get_theme_constant(SNAME("text_highlight_v_padding"), SNAME("EditorHelp")));
-
- doc_font = get_theme_font(SNAME("doc"), SNAME("EditorFonts"));
- doc_bold_font = get_theme_font(SNAME("doc_bold"), SNAME("EditorFonts"));
- doc_title_font = get_theme_font(SNAME("doc_title"), SNAME("EditorFonts"));
- doc_code_font = get_theme_font(SNAME("doc_source"), SNAME("EditorFonts"));
-
- doc_title_font_size = get_theme_font_size(SNAME("doc_title_size"), SNAME("EditorFonts"));
}
void EditorHelp::_search(bool p_search_previous) {
@@ -187,14 +199,12 @@ void EditorHelp::_class_desc_input(const Ref<InputEvent> &p_input) {
void EditorHelp::_class_desc_resized(bool p_force_update_theme) {
// Add extra horizontal margins for better readability.
// The margins increase as the width of the editor help container increases.
- Ref<Font> font = get_theme_font(SNAME("doc_source"), SNAME("EditorFonts"));
- int font_size = get_theme_font_size(SNAME("doc_source_size"), SNAME("EditorFonts"));
- real_t char_width = font->get_char_size('x', font_size).width;
+ real_t char_width = theme_cache.doc_code_font->get_char_size('x', theme_cache.doc_code_font_size).width;
const int new_display_margin = MAX(30 * EDSCALE, get_parent_anchorable_rect().size.width - char_width * 120 * EDSCALE) * 0.5;
if (display_margin != new_display_margin || p_force_update_theme) {
display_margin = new_display_margin;
- Ref<StyleBox> class_desc_stylebox = EditorNode::get_singleton()->get_theme_base()->get_theme_stylebox(SNAME("background"), SNAME("EditorHelp"))->duplicate();
+ Ref<StyleBox> class_desc_stylebox = theme_cache.background_style->duplicate();
class_desc_stylebox->set_content_margin(SIDE_LEFT, display_margin);
class_desc_stylebox->set_content_margin(SIDE_RIGHT, display_margin);
class_desc->add_theme_style_override("normal", class_desc_stylebox);
@@ -204,7 +214,7 @@ void EditorHelp::_class_desc_resized(bool p_force_update_theme) {
void EditorHelp::_add_type(const String &p_type, const String &p_enum) {
if (p_type.is_empty() || p_type == "void") {
- class_desc->push_color(Color(type_color, 0.5));
+ class_desc->push_color(Color(theme_cache.type_color, 0.5));
class_desc->push_hint(TTR("No return value."));
class_desc->add_text("void");
class_desc->pop();
@@ -224,7 +234,7 @@ void EditorHelp::_add_type(const String &p_type, const String &p_enum) {
}
}
- class_desc->push_color(type_color);
+ class_desc->push_color(theme_cache.type_color);
bool add_array = false;
if (can_ref) {
if (t.ends_with("[]")) {
@@ -333,7 +343,7 @@ void EditorHelp::_add_method(const DocData::MethodDoc &p_method, bool p_overview
class_desc->push_meta("@method " + p_method.name);
}
- class_desc->push_color(headline_color);
+ class_desc->push_color(theme_cache.headline_color);
_add_text(p_method.name);
class_desc->pop();
@@ -341,12 +351,12 @@ void EditorHelp::_add_method(const DocData::MethodDoc &p_method, bool p_overview
class_desc->pop(); //meta
}
- class_desc->push_color(symbol_color);
+ class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text("(");
class_desc->pop();
for (int j = 0; j < p_method.arguments.size(); j++) {
- class_desc->push_color(text_color);
+ class_desc->push_color(theme_cache.text_color);
if (j > 0) {
class_desc->add_text(", ");
}
@@ -355,10 +365,10 @@ void EditorHelp::_add_method(const DocData::MethodDoc &p_method, bool p_overview
class_desc->add_text(": ");
_add_type(p_method.arguments[j].type, p_method.arguments[j].enumeration);
if (!p_method.arguments[j].default_value.is_empty()) {
- class_desc->push_color(symbol_color);
+ class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text(" = ");
class_desc->pop();
- class_desc->push_color(value_color);
+ class_desc->push_color(theme_cache.value_color);
_add_text(_fix_constant(p_method.arguments[j].default_value));
class_desc->pop();
}
@@ -367,21 +377,21 @@ void EditorHelp::_add_method(const DocData::MethodDoc &p_method, bool p_overview
}
if (is_vararg) {
- class_desc->push_color(text_color);
+ class_desc->push_color(theme_cache.text_color);
if (p_method.arguments.size()) {
class_desc->add_text(", ");
}
- class_desc->push_color(symbol_color);
+ class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text("...");
class_desc->pop();
class_desc->pop();
}
- class_desc->push_color(symbol_color);
+ class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text(")");
class_desc->pop();
if (!p_method.qualifiers.is_empty()) {
- class_desc->push_color(qualifier_color);
+ class_desc->push_color(theme_cache.qualifier_color);
PackedStringArray qualifiers = p_method.qualifiers.split_spaces();
for (const String &qualifier : qualifiers) {
@@ -426,6 +436,38 @@ void EditorHelp::_add_bulletpoint() {
class_desc->add_text(String(prefix));
}
+void EditorHelp::_push_normal_font() {
+ class_desc->push_font(theme_cache.doc_font);
+ class_desc->push_font_size(theme_cache.doc_font_size);
+}
+
+void EditorHelp::_pop_normal_font() {
+ class_desc->pop();
+ class_desc->pop();
+}
+
+void EditorHelp::_push_title_font() {
+ class_desc->push_color(theme_cache.title_color);
+ class_desc->push_font(theme_cache.doc_title_font);
+ class_desc->push_font_size(theme_cache.doc_title_font_size);
+}
+
+void EditorHelp::_pop_title_font() {
+ class_desc->pop();
+ class_desc->pop();
+ class_desc->pop();
+}
+
+void EditorHelp::_push_code_font() {
+ class_desc->push_font(theme_cache.doc_code_font);
+ class_desc->push_font_size(theme_cache.doc_code_font_size);
+}
+
+void EditorHelp::_pop_code_font() {
+ class_desc->pop();
+ class_desc->pop();
+}
+
Error EditorHelp::_goto_desc(const String &p_class, int p_vscr) {
if (!doc->class_list.has(p_class)) {
return ERR_DOES_NOT_EXIST;
@@ -447,13 +489,9 @@ Error EditorHelp::_goto_desc(const String &p_class, int p_vscr) {
}
void EditorHelp::_update_method_list(const Vector<DocData::MethodDoc> p_methods) {
- Ref<Font> font = get_theme_font(SNAME("doc_source"), SNAME("EditorFonts"));
- class_desc->pop(); // title font size
- class_desc->pop(); // title font
- class_desc->pop(); // title color
-
class_desc->add_newline();
- class_desc->push_font(font);
+
+ _push_code_font();
class_desc->push_indent(1);
class_desc->push_table(2);
class_desc->set_table_column_expand(1, true);
@@ -504,18 +542,14 @@ void EditorHelp::_update_method_list(const Vector<DocData::MethodDoc> p_methods)
class_desc->pop(); //table
class_desc->pop();
- class_desc->pop(); // font
+ _pop_code_font();
+
class_desc->add_newline();
class_desc->add_newline();
}
void EditorHelp::_update_method_descriptions(const DocData::ClassDoc p_classdoc, const Vector<DocData::MethodDoc> p_methods, const String &p_method_type) {
- Ref<Font> font = get_theme_font(SNAME("doc"), SNAME("EditorFonts"));
- Ref<Font> code_font = get_theme_font(SNAME("doc_source"), SNAME("EditorFonts"));
- String link_color_text = title_color.to_html(false);
- class_desc->pop(); // title font size
- class_desc->pop(); // title font
- class_desc->pop(); // title color
+ String link_color_text = theme_cache.title_color.to_html(false);
class_desc->add_newline();
class_desc->add_newline();
@@ -531,15 +565,15 @@ void EditorHelp::_update_method_descriptions(const DocData::ClassDoc p_classdoc,
}
for (int i = 0; i < methods_filtered.size(); i++) {
- class_desc->push_font(code_font);
+ _push_code_font();
_add_method(methods_filtered[i], false);
- class_desc->pop();
+ _pop_code_font();
class_desc->add_newline();
class_desc->add_newline();
- class_desc->push_color(text_color);
- class_desc->push_font(font);
+ class_desc->push_color(theme_cache.text_color);
+ _push_normal_font();
class_desc->push_indent(1);
if (methods_filtered[i].errors_returned.size()) {
class_desc->append_text(TTR("Error codes returned:"));
@@ -571,7 +605,7 @@ void EditorHelp::_update_method_descriptions(const DocData::ClassDoc p_classdoc,
} else {
class_desc->add_image(get_theme_icon(SNAME("Error"), SNAME("EditorIcons")));
class_desc->add_text(" ");
- class_desc->push_color(comment_color);
+ class_desc->push_color(theme_cache.comment_color);
if (p_classdoc.is_script_doc) {
class_desc->append_text(vformat(TTR("There is currently no description for this %s."), p_method_type));
} else {
@@ -581,8 +615,9 @@ void EditorHelp::_update_method_descriptions(const DocData::ClassDoc p_classdoc,
}
class_desc->pop();
+ _pop_normal_font();
class_desc->pop();
- class_desc->pop();
+
class_desc->add_newline();
class_desc->add_newline();
class_desc->add_newline();
@@ -601,25 +636,20 @@ void EditorHelp::_update_doc() {
method_line.clear();
section_line.clear();
- _update_theme();
- String link_color_text = title_color.to_html(false);
+ String link_color_text = theme_cache.title_color.to_html(false);
DocData::ClassDoc cd = doc->class_list[edited_class]; // Make a copy, so we can sort without worrying.
// Class name
section_line.push_back(Pair<String, int>(TTR("Top"), 0));
- class_desc->push_font(doc_title_font);
- class_desc->push_font_size(doc_title_font_size);
- class_desc->push_color(title_color);
+ _push_title_font();
class_desc->add_text(TTR("Class:") + " ");
- _add_type_icon(edited_class, doc_title_font_size);
+ _add_type_icon(edited_class, theme_cache.doc_title_font_size);
class_desc->add_text(" ");
- class_desc->push_color(headline_color);
+ class_desc->push_color(theme_cache.headline_color);
_add_text(edited_class);
class_desc->pop(); // color
- class_desc->pop(); // color
- class_desc->pop(); // font size
- class_desc->pop(); // font
+ _pop_title_font();
if (cd.is_deprecated) {
class_desc->add_text(" ");
@@ -639,8 +669,8 @@ void EditorHelp::_update_doc() {
// Ascendents
if (!cd.inherits.is_empty()) {
- class_desc->push_color(title_color);
- class_desc->push_font(doc_font);
+ class_desc->push_color(theme_cache.title_color);
+ _push_normal_font();
class_desc->add_text(TTR("Inherits:") + " ");
String inherits = cd.inherits;
@@ -657,7 +687,7 @@ void EditorHelp::_update_doc() {
}
}
- class_desc->pop();
+ _pop_normal_font();
class_desc->pop();
class_desc->add_newline();
}
@@ -667,11 +697,11 @@ void EditorHelp::_update_doc() {
bool found = false;
bool prev = false;
- class_desc->push_font(doc_font);
+ _push_normal_font();
for (const KeyValue<String, DocData::ClassDoc> &E : doc->class_list) {
if (E.value.inherits == cd.name) {
if (!found) {
- class_desc->push_color(title_color);
+ class_desc->push_color(theme_cache.title_color);
class_desc->add_text(TTR("Inherited by:") + " ");
found = true;
}
@@ -685,7 +715,7 @@ void EditorHelp::_update_doc() {
prev = true;
}
}
- class_desc->pop();
+ _pop_normal_font();
if (found) {
class_desc->pop();
@@ -722,13 +752,14 @@ void EditorHelp::_update_doc() {
if (!cd.brief_description.strip_edges().is_empty()) {
has_description = true;
- class_desc->push_color(text_color);
- class_desc->push_font(doc_bold_font);
+ class_desc->push_color(theme_cache.text_color);
+ class_desc->push_font(theme_cache.doc_bold_font);
class_desc->push_indent(1);
_add_text(DTR(cd.brief_description));
class_desc->pop();
class_desc->pop();
class_desc->pop();
+
class_desc->add_newline();
class_desc->add_newline();
class_desc->add_newline();
@@ -740,23 +771,20 @@ void EditorHelp::_update_doc() {
section_line.push_back(Pair<String, int>(TTR("Description"), class_desc->get_paragraph_count() - 2));
description_line = class_desc->get_paragraph_count() - 2;
- class_desc->push_color(title_color);
- class_desc->push_font(doc_title_font);
- class_desc->push_font_size(doc_title_font_size);
+ _push_title_font();
class_desc->add_text(TTR("Description"));
- class_desc->pop(); // font size
- class_desc->pop(); // font
- class_desc->pop(); // color
+ _pop_title_font();
class_desc->add_newline();
class_desc->add_newline();
- class_desc->push_color(text_color);
- class_desc->push_font(doc_font);
+ class_desc->push_color(theme_cache.text_color);
+ _push_normal_font();
class_desc->push_indent(1);
_add_text(DTR(cd.description));
class_desc->pop();
+ _pop_normal_font();
class_desc->pop();
- class_desc->pop();
+
class_desc->add_newline();
class_desc->add_newline();
class_desc->add_newline();
@@ -765,7 +793,7 @@ void EditorHelp::_update_doc() {
if (!has_description) {
class_desc->add_image(get_theme_icon(SNAME("Error"), SNAME("EditorIcons")));
class_desc->add_text(" ");
- class_desc->push_color(comment_color);
+ class_desc->push_color(theme_cache.comment_color);
if (cd.is_script_doc) {
class_desc->append_text(TTR("There is currently no description for this class."));
@@ -780,18 +808,15 @@ void EditorHelp::_update_doc() {
// Online tutorials
if (cd.tutorials.size()) {
- class_desc->push_color(title_color);
- class_desc->push_font(doc_title_font);
- class_desc->push_font_size(doc_title_font_size);
+ _push_title_font();
class_desc->add_text(TTR("Online Tutorials"));
- class_desc->pop(); // font size
- class_desc->pop(); // font
- class_desc->pop(); // color
+ _pop_title_font();
- class_desc->push_indent(1);
- class_desc->push_font(doc_code_font);
class_desc->add_newline();
+ class_desc->push_indent(1);
+ _push_code_font();
+
for (int i = 0; i < cd.tutorials.size(); i++) {
const String link = DTR(cd.tutorials[i].link);
String linktxt = (cd.tutorials[i].title.is_empty()) ? link : DTR(cd.tutorials[i].title);
@@ -800,14 +825,15 @@ void EditorHelp::_update_doc() {
linktxt = link.substr(seppos + 2);
}
- class_desc->push_color(symbol_color);
+ class_desc->push_color(theme_cache.symbol_color);
class_desc->append_text("[url=" + link + "]" + linktxt + "[/url]");
class_desc->pop();
class_desc->add_newline();
}
+ _pop_code_font();
class_desc->pop();
- class_desc->pop();
+
class_desc->add_newline();
class_desc->add_newline();
}
@@ -829,16 +855,13 @@ void EditorHelp::_update_doc() {
if (has_properties) {
section_line.push_back(Pair<String, int>(TTR("Properties"), class_desc->get_paragraph_count() - 2));
- class_desc->push_color(title_color);
- class_desc->push_font(doc_title_font);
- class_desc->push_font_size(doc_title_font_size);
+ _push_title_font();
class_desc->add_text(TTR("Properties"));
- class_desc->pop(); // font size
- class_desc->pop(); // font
- class_desc->pop(); // color
+ _pop_title_font();
class_desc->add_newline();
- class_desc->push_font(doc_code_font);
+
+ _push_code_font();
class_desc->push_indent(1);
class_desc->push_table(4);
class_desc->set_table_column_expand(1, true);
@@ -853,9 +876,9 @@ void EditorHelp::_update_doc() {
// Property type.
class_desc->push_cell();
class_desc->push_paragraph(HORIZONTAL_ALIGNMENT_RIGHT, Control::TEXT_DIRECTION_AUTO, "");
- class_desc->push_font(doc_code_font);
+ _push_code_font();
_add_type(cd.properties[i].type, cd.properties[i].enumeration);
- class_desc->pop();
+ _pop_code_font();
class_desc->pop();
class_desc->pop(); // cell
@@ -880,8 +903,8 @@ void EditorHelp::_update_doc() {
// Property name.
class_desc->push_cell();
- class_desc->push_font(doc_code_font);
- class_desc->push_color(headline_color);
+ _push_code_font();
+ class_desc->push_color(theme_cache.headline_color);
if (describe) {
class_desc->push_meta("@member " + cd.properties[i].name);
@@ -894,15 +917,15 @@ void EditorHelp::_update_doc() {
}
class_desc->pop();
- class_desc->pop();
+ _pop_code_font();
class_desc->pop(); // cell
// Property value.
class_desc->push_cell();
- class_desc->push_font(doc_code_font);
+ _push_code_font();
if (!cd.properties[i].default_value.is_empty()) {
- class_desc->push_color(symbol_color);
+ class_desc->push_color(theme_cache.symbol_color);
if (cd.properties[i].overridden) {
class_desc->add_text(" [");
class_desc->push_meta("@member " + cd.properties[i].overrides + "." + cd.properties[i].name);
@@ -914,11 +937,11 @@ void EditorHelp::_update_doc() {
}
class_desc->pop();
- class_desc->push_color(value_color);
+ class_desc->push_color(theme_cache.value_color);
_add_text(_fix_constant(cd.properties[i].default_value));
class_desc->pop();
- class_desc->push_color(symbol_color);
+ class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text("]");
class_desc->pop();
}
@@ -930,46 +953,47 @@ void EditorHelp::_update_doc() {
EXPERIMENTAL_DOC_TAG;
}
- class_desc->pop();
+ _pop_code_font();
class_desc->pop(); // cell
// Property setters and getters.
class_desc->push_cell();
- class_desc->push_font(doc_code_font);
+ _push_code_font();
if (cd.is_script_doc && (!cd.properties[i].setter.is_empty() || !cd.properties[i].getter.is_empty())) {
- class_desc->push_color(symbol_color);
+ class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text(" [" + TTR("property:") + " ");
class_desc->pop(); // color
if (!cd.properties[i].setter.is_empty()) {
- class_desc->push_color(value_color);
+ class_desc->push_color(theme_cache.value_color);
class_desc->add_text("setter");
class_desc->pop(); // color
}
if (!cd.properties[i].getter.is_empty()) {
if (!cd.properties[i].setter.is_empty()) {
- class_desc->push_color(symbol_color);
+ class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text(", ");
class_desc->pop(); // color
}
- class_desc->push_color(value_color);
+ class_desc->push_color(theme_cache.value_color);
class_desc->add_text("getter");
class_desc->pop(); // color
}
- class_desc->push_color(symbol_color);
+ class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text("]");
class_desc->pop(); // color
}
- class_desc->pop();
+ _pop_code_font();
class_desc->pop(); // cell
}
class_desc->pop(); // table
class_desc->pop();
- class_desc->pop(); // font
+ _pop_code_font();
+
class_desc->add_newline();
class_desc->add_newline();
}
@@ -998,10 +1022,10 @@ void EditorHelp::_update_doc() {
}
section_line.push_back(Pair<String, int>(TTR("Constructors"), class_desc->get_paragraph_count() - 2));
- class_desc->push_color(title_color);
- class_desc->push_font(doc_title_font);
- class_desc->push_font_size(doc_title_font_size);
+ _push_title_font();
class_desc->add_text(TTR("Constructors"));
+ _pop_title_font();
+
_update_method_list(cd.constructors);
}
@@ -1011,10 +1035,10 @@ void EditorHelp::_update_doc() {
}
section_line.push_back(Pair<String, int>(TTR("Methods"), class_desc->get_paragraph_count() - 2));
- class_desc->push_color(title_color);
- class_desc->push_font(doc_title_font);
- class_desc->push_font_size(doc_title_font_size);
+ _push_title_font();
class_desc->add_text(TTR("Methods"));
+ _pop_title_font();
+
_update_method_list(methods);
}
@@ -1024,23 +1048,19 @@ void EditorHelp::_update_doc() {
}
section_line.push_back(Pair<String, int>(TTR("Operators"), class_desc->get_paragraph_count() - 2));
- class_desc->push_color(title_color);
- class_desc->push_font(doc_title_font);
- class_desc->push_font_size(doc_title_font_size);
+ _push_title_font();
class_desc->add_text(TTR("Operators"));
+ _pop_title_font();
+
_update_method_list(cd.operators);
}
// Theme properties
if (!cd.theme_properties.is_empty()) {
section_line.push_back(Pair<String, int>(TTR("Theme Properties"), class_desc->get_paragraph_count() - 2));
- class_desc->push_color(title_color);
- class_desc->push_font(doc_title_font);
- class_desc->push_font_size(doc_title_font_size);
+ _push_title_font();
class_desc->add_text(TTR("Theme Properties"));
- class_desc->pop(); // font size
- class_desc->pop(); // font
- class_desc->pop(); // color
+ _pop_title_font();
class_desc->add_newline();
class_desc->add_newline();
@@ -1062,59 +1082,55 @@ void EditorHelp::_update_doc() {
if (theme_data_type != cd.theme_properties[i].data_type) {
theme_data_type = cd.theme_properties[i].data_type;
- class_desc->push_color(title_color);
- class_desc->push_font(doc_title_font);
- class_desc->push_font_size(doc_title_font_size);
+ _push_title_font();
if (data_type_names.has(theme_data_type)) {
class_desc->add_text(data_type_names[theme_data_type]);
} else {
class_desc->add_text("");
}
- class_desc->pop(); // font size
- class_desc->pop(); // font
- class_desc->pop(); // color
+ _pop_title_font();
class_desc->add_newline();
class_desc->add_newline();
}
// Theme item header.
- class_desc->push_font(doc_code_font);
+ _push_code_font();
_add_bulletpoint();
// Theme item object type.
_add_type(cd.theme_properties[i].type);
// Theme item name.
- class_desc->push_color(headline_color);
+ class_desc->push_color(theme_cache.headline_color);
class_desc->add_text(" ");
_add_text(cd.theme_properties[i].name);
class_desc->pop();
// Theme item default value.
if (!cd.theme_properties[i].default_value.is_empty()) {
- class_desc->push_color(symbol_color);
+ class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text(" [" + TTR("default:") + " ");
class_desc->pop();
- class_desc->push_color(value_color);
+ class_desc->push_color(theme_cache.value_color);
_add_text(_fix_constant(cd.theme_properties[i].default_value));
class_desc->pop();
- class_desc->push_color(symbol_color);
+ class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text("]");
class_desc->pop();
}
- class_desc->pop(); // monofont
+ _pop_code_font();
// Theme item description.
if (!cd.theme_properties[i].description.strip_edges().is_empty()) {
- class_desc->push_font(doc_font);
- class_desc->push_color(comment_color);
+ class_desc->push_color(theme_cache.comment_color);
+ _push_normal_font();
class_desc->push_indent(1);
_add_text(DTR(cd.theme_properties[i].description));
class_desc->pop(); // indent
+ _pop_normal_font();
class_desc->pop(); // color
- class_desc->pop(); // font
}
class_desc->add_newline();
@@ -1132,13 +1148,9 @@ void EditorHelp::_update_doc() {
}
section_line.push_back(Pair<String, int>(TTR("Signals"), class_desc->get_paragraph_count() - 2));
- class_desc->push_color(title_color);
- class_desc->push_font(doc_title_font);
- class_desc->push_font_size(doc_title_font_size);
+ _push_title_font();
class_desc->add_text(TTR("Signals"));
- class_desc->pop(); // font size
- class_desc->pop(); // font
- class_desc->pop(); // color
+ _pop_title_font();
class_desc->add_newline();
class_desc->add_newline();
@@ -1148,16 +1160,16 @@ void EditorHelp::_update_doc() {
for (int i = 0; i < cd.signals.size(); i++) {
signal_line[cd.signals[i].name] = class_desc->get_paragraph_count() - 2; // Gets overridden if description.
- class_desc->push_font(doc_code_font); // monofont
+ _push_code_font();
_add_bulletpoint();
- class_desc->push_color(headline_color);
+ class_desc->push_color(theme_cache.headline_color);
_add_text(cd.signals[i].name);
class_desc->pop();
- class_desc->push_color(symbol_color);
+ class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text("(");
class_desc->pop();
for (int j = 0; j < cd.signals[i].arguments.size(); j++) {
- class_desc->push_color(text_color);
+ class_desc->push_color(theme_cache.text_color);
if (j > 0) {
class_desc->add_text(", ");
}
@@ -1166,7 +1178,7 @@ void EditorHelp::_update_doc() {
class_desc->add_text(": ");
_add_type(cd.signals[i].arguments[j].type);
if (!cd.signals[i].arguments[j].default_value.is_empty()) {
- class_desc->push_color(symbol_color);
+ class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text(" = ");
class_desc->pop();
_add_text(cd.signals[i].arguments[j].default_value);
@@ -1175,7 +1187,7 @@ void EditorHelp::_update_doc() {
class_desc->pop();
}
- class_desc->push_color(symbol_color);
+ class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text(")");
if (cd.signals[i].is_deprecated) {
@@ -1186,16 +1198,18 @@ void EditorHelp::_update_doc() {
}
class_desc->pop();
- class_desc->pop(); // end monofont
+ _pop_code_font();
+
if (!cd.signals[i].description.strip_edges().is_empty()) {
- class_desc->push_font(doc_font);
- class_desc->push_color(comment_color);
+ class_desc->push_color(theme_cache.comment_color);
+ _push_normal_font();
class_desc->push_indent(1);
_add_text(DTR(cd.signals[i].description));
class_desc->pop(); // indent
- class_desc->pop();
- class_desc->pop(); // font
+ _pop_normal_font();
+ class_desc->pop(); // color
}
+
class_desc->add_newline();
class_desc->add_newline();
}
@@ -1228,13 +1242,9 @@ void EditorHelp::_update_doc() {
// Enums
if (enums.size()) {
section_line.push_back(Pair<String, int>(TTR("Enumerations"), class_desc->get_paragraph_count() - 2));
- class_desc->push_color(title_color);
- class_desc->push_font(doc_title_font);
- class_desc->push_font_size(doc_title_font_size);
+ _push_title_font();
class_desc->add_text(TTR("Enumerations"));
- class_desc->pop(); // font size
- class_desc->pop(); // font
- class_desc->pop(); // color
+ _pop_title_font();
class_desc->push_indent(1);
class_desc->add_newline();
@@ -1242,24 +1252,26 @@ void EditorHelp::_update_doc() {
for (KeyValue<String, Vector<DocData::ConstantDoc>> &E : enums) {
enum_line[E.key] = class_desc->get_paragraph_count() - 2;
- class_desc->push_font(doc_code_font);
- class_desc->push_color(title_color);
+ _push_code_font();
+ class_desc->push_color(theme_cache.title_color);
if (E.value.size() && E.value[0].is_bitfield) {
class_desc->add_text("flags ");
} else {
class_desc->add_text("enum ");
}
class_desc->pop();
+
String e = E.key;
if ((e.get_slice_count(".") > 1) && (e.get_slice(".", 0) == edited_class)) {
e = e.get_slice(".", 1);
}
- class_desc->push_color(headline_color);
+ class_desc->push_color(theme_cache.headline_color);
class_desc->add_text(e);
class_desc->pop();
- class_desc->pop();
- class_desc->push_color(symbol_color);
+ _pop_code_font();
+
+ class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text(":");
class_desc->pop();
@@ -1268,13 +1280,14 @@ void EditorHelp::_update_doc() {
// Enum description.
if (e != "@unnamed_enums" && cd.enums.has(e)) {
- class_desc->push_color(text_color);
- class_desc->push_font(doc_font);
+ class_desc->push_color(theme_cache.text_color);
+ _push_normal_font();
class_desc->push_indent(1);
_add_text(cd.enums[e]);
class_desc->pop();
+ _pop_normal_font();
class_desc->pop();
- class_desc->pop();
+
class_desc->add_newline();
class_desc->add_newline();
}
@@ -1293,18 +1306,18 @@ void EditorHelp::_update_doc() {
// Add the enum constant line to the constant_line map so we can locate it as a constant.
constant_line[enum_list[i].name] = class_desc->get_paragraph_count() - 2;
- class_desc->push_font(doc_code_font);
+ _push_code_font();
_add_bulletpoint();
- class_desc->push_color(headline_color);
+ class_desc->push_color(theme_cache.headline_color);
_add_text(enum_list[i].name);
class_desc->pop();
- class_desc->push_color(symbol_color);
+ class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text(" = ");
class_desc->pop();
- class_desc->push_color(value_color);
+ class_desc->push_color(theme_cache.value_color);
_add_text(_fix_constant(enum_list[i].value));
class_desc->pop();
- class_desc->pop();
+ _pop_code_font();
if (enum_list[i].is_deprecated) {
DEPRECATED_DOC_TAG;
@@ -1317,10 +1330,10 @@ void EditorHelp::_update_doc() {
class_desc->add_newline();
if (!enum_list[i].description.strip_edges().is_empty()) {
- class_desc->push_font(doc_font);
- class_desc->push_color(comment_color);
+ class_desc->push_color(theme_cache.comment_color);
+ _push_normal_font();
_add_text(DTR(enum_list[i].description));
- class_desc->pop();
+ _pop_normal_font();
class_desc->pop();
if (DTR(enum_list[i].description).find("\n") > 0) {
class_desc->add_newline();
@@ -1346,20 +1359,17 @@ void EditorHelp::_update_doc() {
// Constants
if (constants.size()) {
section_line.push_back(Pair<String, int>(TTR("Constants"), class_desc->get_paragraph_count() - 2));
- class_desc->push_color(title_color);
- class_desc->push_font(doc_title_font);
- class_desc->push_font_size(doc_title_font_size);
+ _push_title_font();
class_desc->add_text(TTR("Constants"));
- class_desc->pop(); // font size
- class_desc->pop(); // font
- class_desc->pop(); // color
+ _pop_title_font();
class_desc->push_indent(1);
class_desc->add_newline();
for (int i = 0; i < constants.size(); i++) {
constant_line[constants[i].name] = class_desc->get_paragraph_count() - 2;
- class_desc->push_font(doc_code_font);
+
+ _push_code_font();
if (constants[i].value.begins_with("Color(") && constants[i].value.ends_with(")")) {
String stripped = constants[i].value.replace(" ", "").replace("Color(", "").replace(")", "");
@@ -1373,17 +1383,17 @@ void EditorHelp::_update_doc() {
_add_bulletpoint();
}
- class_desc->push_color(headline_color);
+ class_desc->push_color(theme_cache.headline_color);
_add_text(constants[i].name);
class_desc->pop();
- class_desc->push_color(symbol_color);
+ class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text(" = ");
class_desc->pop();
- class_desc->push_color(value_color);
+ class_desc->push_color(theme_cache.value_color);
_add_text(_fix_constant(constants[i].value));
class_desc->pop();
- class_desc->pop();
+ _pop_code_font();
if (constants[i].is_deprecated) {
DEPRECATED_DOC_TAG;
@@ -1396,10 +1406,10 @@ void EditorHelp::_update_doc() {
class_desc->add_newline();
if (!constants[i].description.strip_edges().is_empty()) {
- class_desc->push_font(doc_font);
- class_desc->push_color(comment_color);
+ class_desc->push_color(theme_cache.comment_color);
+ _push_normal_font();
_add_text(DTR(constants[i].description));
- class_desc->pop();
+ _pop_normal_font();
class_desc->pop();
if (DTR(constants[i].description).find("\n") > 0) {
class_desc->add_newline();
@@ -1421,13 +1431,9 @@ void EditorHelp::_update_doc() {
}
section_line.push_back(Pair<String, int>(TTR("Annotations"), class_desc->get_paragraph_count() - 2));
- class_desc->push_color(title_color);
- class_desc->push_font(doc_title_font);
- class_desc->push_font_size(doc_title_font_size);
+ _push_title_font();
class_desc->add_text(TTR("Annotations"));
- class_desc->pop(); // font size
- class_desc->pop(); // font
- class_desc->pop(); // color
+ _pop_title_font();
class_desc->add_newline();
class_desc->add_newline();
@@ -1437,18 +1443,18 @@ void EditorHelp::_update_doc() {
for (int i = 0; i < cd.annotations.size(); i++) {
annotation_line[cd.annotations[i].name] = class_desc->get_paragraph_count() - 2; // Gets overridden if description.
- class_desc->push_font(doc_code_font); // monofont
+ _push_code_font();
_add_bulletpoint();
- class_desc->push_color(headline_color);
+ class_desc->push_color(theme_cache.headline_color);
_add_text(cd.annotations[i].name);
class_desc->pop();
if (cd.annotations[i].arguments.size() > 0) {
- class_desc->push_color(symbol_color);
+ class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text("(");
class_desc->pop();
for (int j = 0; j < cd.annotations[i].arguments.size(); j++) {
- class_desc->push_color(text_color);
+ class_desc->push_color(theme_cache.text_color);
if (j > 0) {
class_desc->add_text(", ");
}
@@ -1457,7 +1463,7 @@ void EditorHelp::_update_doc() {
class_desc->add_text(": ");
_add_type(cd.annotations[i].arguments[j].type);
if (!cd.annotations[i].arguments[j].default_value.is_empty()) {
- class_desc->push_color(symbol_color);
+ class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text(" = ");
class_desc->pop();
_add_text(cd.annotations[i].arguments[j].default_value);
@@ -1467,43 +1473,43 @@ void EditorHelp::_update_doc() {
}
if (cd.annotations[i].qualifiers.contains("vararg")) {
- class_desc->push_color(text_color);
+ class_desc->push_color(theme_cache.text_color);
if (cd.annotations[i].arguments.size()) {
class_desc->add_text(", ");
}
- class_desc->push_color(symbol_color);
+ class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text("...");
class_desc->pop();
class_desc->pop();
}
- class_desc->push_color(symbol_color);
+ class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text(")");
class_desc->pop();
}
if (!cd.annotations[i].qualifiers.is_empty()) {
- class_desc->push_color(qualifier_color);
+ class_desc->push_color(theme_cache.qualifier_color);
class_desc->add_text(" ");
_add_text(cd.annotations[i].qualifiers);
class_desc->pop();
}
- class_desc->pop(); // end monofont
+ _pop_code_font();
if (!cd.annotations[i].description.strip_edges().is_empty()) {
- class_desc->push_font(doc_font);
- class_desc->push_color(comment_color);
+ class_desc->push_color(theme_cache.comment_color);
+ _push_normal_font();
class_desc->push_indent(1);
_add_text(DTR(cd.annotations[i].description));
class_desc->pop(); // indent
- class_desc->pop();
- class_desc->pop(); // font
+ _pop_normal_font();
+ class_desc->pop(); // color
} else {
class_desc->push_indent(1);
class_desc->add_image(get_theme_icon(SNAME("Error"), SNAME("EditorIcons")));
class_desc->add_text(" ");
- class_desc->push_color(comment_color);
+ class_desc->push_color(theme_cache.comment_color);
if (cd.is_script_doc) {
class_desc->append_text(TTR("There is currently no description for this annotation."));
} else {
@@ -1523,13 +1529,9 @@ void EditorHelp::_update_doc() {
// Property descriptions
if (has_properties) {
section_line.push_back(Pair<String, int>(TTR("Property Descriptions"), class_desc->get_paragraph_count() - 2));
- class_desc->push_color(title_color);
- class_desc->push_font(doc_title_font);
- class_desc->push_font_size(doc_title_font_size);
+ _push_title_font();
class_desc->add_text(TTR("Property Descriptions"));
- class_desc->pop(); // font size
- class_desc->pop(); // font
- class_desc->pop(); // color
+ _pop_title_font();
class_desc->add_newline();
class_desc->add_newline();
@@ -1538,6 +1540,10 @@ void EditorHelp::_update_doc() {
if (cd.properties[i].overridden) {
continue;
}
+ // Ignore undocumented private.
+ if (cd.properties[i].name.begins_with("_") && cd.properties[i].description.strip_edges().is_empty()) {
+ continue;
+ }
property_line[cd.properties[i].name] = class_desc->get_paragraph_count() - 2;
@@ -1545,30 +1551,30 @@ void EditorHelp::_update_doc() {
class_desc->set_table_column_expand(1, true);
class_desc->push_cell();
- class_desc->push_font(doc_code_font);
+ _push_code_font();
_add_bulletpoint();
_add_type(cd.properties[i].type, cd.properties[i].enumeration);
class_desc->add_text(" ");
- class_desc->pop(); // font
+ _pop_code_font();
class_desc->pop(); // cell
class_desc->push_cell();
- class_desc->push_font(doc_code_font);
- class_desc->push_color(headline_color);
+ _push_code_font();
+ class_desc->push_color(theme_cache.headline_color);
_add_text(cd.properties[i].name);
class_desc->pop(); // color
if (!cd.properties[i].default_value.is_empty()) {
- class_desc->push_color(symbol_color);
+ class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text(" [" + TTR("default:") + " ");
class_desc->pop(); // color
- class_desc->push_color(value_color);
+ class_desc->push_color(theme_cache.value_color);
_add_text(_fix_constant(cd.properties[i].default_value));
class_desc->pop(); // color
- class_desc->push_color(symbol_color);
+ class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text("]");
class_desc->pop(); // color
}
@@ -1581,32 +1587,32 @@ void EditorHelp::_update_doc() {
}
if (cd.is_script_doc && (!cd.properties[i].setter.is_empty() || !cd.properties[i].getter.is_empty())) {
- class_desc->push_color(symbol_color);
+ class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text(" [" + TTR("property:") + " ");
class_desc->pop(); // color
if (!cd.properties[i].setter.is_empty()) {
- class_desc->push_color(value_color);
+ class_desc->push_color(theme_cache.value_color);
class_desc->add_text("setter");
class_desc->pop(); // color
}
if (!cd.properties[i].getter.is_empty()) {
if (!cd.properties[i].setter.is_empty()) {
- class_desc->push_color(symbol_color);
+ class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text(", ");
class_desc->pop(); // color
}
- class_desc->push_color(value_color);
+ class_desc->push_color(theme_cache.value_color);
class_desc->add_text("getter");
class_desc->pop(); // color
}
- class_desc->push_color(symbol_color);
+ class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text("]");
class_desc->pop(); // color
}
- class_desc->pop(); // font
+ _pop_code_font();
class_desc->pop(); // cell
// Script doc doesn't have setter, getter.
@@ -1621,8 +1627,9 @@ void EditorHelp::_update_doc() {
class_desc->pop(); // cell
class_desc->push_cell();
- class_desc->push_font(doc_code_font);
- class_desc->push_color(text_color);
+ _push_code_font();
+ class_desc->push_color(theme_cache.text_color);
+
if (method_map[cd.properties[i].setter].arguments.size() > 1) {
// Setters with additional arguments are exposed in the method list, so we link them here for quick access.
class_desc->push_meta("@method " + cd.properties[i].setter);
@@ -1631,12 +1638,14 @@ void EditorHelp::_update_doc() {
} else {
class_desc->add_text(cd.properties[i].setter + TTR("(value)"));
}
+
class_desc->pop(); // color
- class_desc->push_color(comment_color);
+ class_desc->push_color(theme_cache.comment_color);
class_desc->add_text(" setter");
class_desc->pop(); // color
- class_desc->pop(); // font
+ _pop_code_font();
class_desc->pop(); // cell
+
method_line[cd.properties[i].setter] = property_line[cd.properties[i].name];
}
@@ -1645,8 +1654,9 @@ void EditorHelp::_update_doc() {
class_desc->pop(); // cell
class_desc->push_cell();
- class_desc->push_font(doc_code_font);
- class_desc->push_color(text_color);
+ _push_code_font();
+ class_desc->push_color(theme_cache.text_color);
+
if (method_map[cd.properties[i].getter].arguments.size() > 0) {
// Getters with additional arguments are exposed in the method list, so we link them here for quick access.
class_desc->push_meta("@method " + cd.properties[i].getter);
@@ -1655,12 +1665,14 @@ void EditorHelp::_update_doc() {
} else {
class_desc->add_text(cd.properties[i].getter + "()");
}
- class_desc->pop(); //color
- class_desc->push_color(comment_color);
+
+ class_desc->pop(); // color
+ class_desc->push_color(theme_cache.comment_color);
class_desc->add_text(" getter");
- class_desc->pop(); //color
- class_desc->pop(); //font
- class_desc->pop(); //cell
+ class_desc->pop(); // color
+ _pop_code_font();
+ class_desc->pop(); // cell
+
method_line[cd.properties[i].getter] = property_line[cd.properties[i].name];
}
}
@@ -1670,15 +1682,15 @@ void EditorHelp::_update_doc() {
class_desc->add_newline();
class_desc->add_newline();
- class_desc->push_color(text_color);
- class_desc->push_font(doc_font);
+ class_desc->push_color(theme_cache.text_color);
+ _push_normal_font();
class_desc->push_indent(1);
if (!cd.properties[i].description.strip_edges().is_empty()) {
_add_text(DTR(cd.properties[i].description));
} else {
class_desc->add_image(get_theme_icon(SNAME("Error"), SNAME("EditorIcons")));
class_desc->add_text(" ");
- class_desc->push_color(comment_color);
+ class_desc->push_color(theme_cache.comment_color);
if (cd.is_script_doc) {
class_desc->append_text(TTR("There is currently no description for this property."));
} else {
@@ -1687,8 +1699,9 @@ void EditorHelp::_update_doc() {
class_desc->pop();
}
class_desc->pop();
+ _pop_normal_font();
class_desc->pop();
- class_desc->pop();
+
class_desc->add_newline();
class_desc->add_newline();
class_desc->add_newline();
@@ -1698,30 +1711,30 @@ void EditorHelp::_update_doc() {
// Constructor descriptions
if (!cd.constructors.is_empty()) {
section_line.push_back(Pair<String, int>(TTR("Constructor Descriptions"), class_desc->get_paragraph_count() - 2));
- class_desc->push_color(title_color);
- class_desc->push_font(doc_title_font);
- class_desc->push_font_size(doc_title_font_size);
+ _push_title_font();
class_desc->add_text(TTR("Constructor Descriptions"));
+ _pop_title_font();
+
_update_method_descriptions(cd, cd.constructors, "constructor");
}
// Method descriptions
if (!methods.is_empty()) {
section_line.push_back(Pair<String, int>(TTR("Method Descriptions"), class_desc->get_paragraph_count() - 2));
- class_desc->push_color(title_color);
- class_desc->push_font(doc_title_font);
- class_desc->push_font_size(doc_title_font_size);
+ _push_title_font();
class_desc->add_text(TTR("Method Descriptions"));
+ _pop_title_font();
+
_update_method_descriptions(cd, methods, "method");
}
// Operator descriptions
if (!cd.operators.is_empty()) {
section_line.push_back(Pair<String, int>(TTR("Operator Descriptions"), class_desc->get_paragraph_count() - 2));
- class_desc->push_color(title_color);
- class_desc->push_font(doc_title_font);
- class_desc->push_font_size(doc_title_font_size);
+ _push_title_font();
class_desc->add_text(TTR("Operator Descriptions"));
+ _pop_title_font();
+
_update_method_descriptions(cd, cd.operators, "operator");
}
@@ -1816,6 +1829,9 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt, Control
Ref<Font> doc_code_font = p_owner_node->get_theme_font(SNAME("doc_source"), SNAME("EditorFonts"));
Ref<Font> doc_kbd_font = p_owner_node->get_theme_font(SNAME("doc_keyboard"), SNAME("EditorFonts"));
+ int doc_code_font_size = p_owner_node->get_theme_font_size(SNAME("doc_source_size"), SNAME("EditorFonts"));
+ int doc_kbd_font_size = p_owner_node->get_theme_font_size(SNAME("doc_keyboard_size"), SNAME("EditorFonts"));
+
const Color type_color = p_owner_node->get_theme_color(SNAME("type_color"), SNAME("EditorHelp"));
const Color code_color = p_owner_node->get_theme_color(SNAME("code_color"), SNAME("EditorHelp"));
const Color kbd_color = p_owner_node->get_theme_color(SNAME("kbd_color"), SNAME("EditorHelp"));
@@ -1939,10 +1955,12 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt, Control
if (tag != "/img") {
p_rt->pop();
if (code_tag) {
+ p_rt->pop(); // font size
// Pop both color and background color.
p_rt->pop();
p_rt->pop();
} else if (codeblock_tag) {
+ p_rt->pop(); // font size
// Pop color, cell and table.
p_rt->pop();
p_rt->pop();
@@ -1964,6 +1982,7 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt, Control
// Use monospace font to make clickable references
// easier to distinguish from inline code and other text.
p_rt->push_font(doc_code_font);
+ p_rt->push_font_size(doc_code_font_size);
Color target_color = link_color;
if (link_tag == "method") {
@@ -1978,7 +1997,9 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt, Control
p_rt->add_text(link_target + (link_tag == "method" ? "()" : ""));
p_rt->pop();
p_rt->pop();
- p_rt->pop();
+
+ p_rt->pop(); // font size
+ p_rt->pop(); // font
pos = brk_end + 1;
} else if (tag.begins_with("param ")) {
@@ -1987,13 +2008,16 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt, Control
// Use monospace font with translucent background color to make code easier to distinguish from other text.
p_rt->push_font(doc_code_font);
+ p_rt->push_font_size(doc_code_font_size);
+
p_rt->push_bgcolor(param_bg_color);
p_rt->push_color(code_color);
p_rt->add_text(param_name);
p_rt->pop();
p_rt->pop();
- p_rt->pop();
+ p_rt->pop(); // font size
+ p_rt->pop(); // font
pos = brk_end + 1;
} else if (doc->class_list.has(tag)) {
@@ -2001,29 +2025,37 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt, Control
// Use monospace font to make clickable references
// easier to distinguish from inline code and other text.
p_rt->push_font(doc_code_font);
+ p_rt->push_font_size(doc_code_font_size);
+
p_rt->push_color(type_color);
p_rt->push_meta("#" + tag);
p_rt->add_text(tag);
p_rt->pop();
p_rt->pop();
- p_rt->pop();
+
+ p_rt->pop(); // font size
+ p_rt->pop(); // font
pos = brk_end + 1;
} else if (tag == "b") {
// Use bold font.
p_rt->push_font(doc_bold_font);
+
pos = brk_end + 1;
tag_stack.push_front(tag);
} else if (tag == "i") {
// Use italics font.
p_rt->push_font(doc_italic_font);
+
pos = brk_end + 1;
tag_stack.push_front(tag);
} else if (tag == "code") {
// Use monospace font with darkened background color to make code easier to distinguish from other text.
p_rt->push_font(doc_code_font);
+ p_rt->push_font_size(doc_code_font_size);
p_rt->push_bgcolor(code_bg_color);
p_rt->push_color(code_color.lerp(p_owner_node->get_theme_color(SNAME("error_color"), SNAME("Editor")), 0.6));
+
code_tag = true;
pos = brk_end + 1;
tag_stack.push_front(tag);
@@ -2032,22 +2064,28 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt, Control
// Use a single-column table with cell row background color instead of `[bgcolor]`.
// This makes the background color highlight cover the entire block, rather than individual lines.
p_rt->push_font(doc_code_font);
+ p_rt->push_font_size(doc_code_font_size);
+
p_rt->push_table(1);
p_rt->push_cell();
p_rt->set_cell_row_background_color(code_bg_color, Color(code_bg_color, 0.99));
p_rt->set_cell_padding(Rect2(10 * EDSCALE, 10 * EDSCALE, 10 * EDSCALE, 10 * EDSCALE));
p_rt->push_color(code_dark_color);
+
codeblock_tag = true;
pos = brk_end + 1;
tag_stack.push_front(tag);
} else if (tag == "kbd") {
// Use keyboard font with custom color and background color.
p_rt->push_font(doc_kbd_font);
+ p_rt->push_font_size(doc_kbd_font_size);
p_rt->push_bgcolor(kbd_bg_color);
p_rt->push_color(kbd_color);
+
code_tag = true; // Though not strictly a code tag, logic is similar.
pos = brk_end + 1;
tag_stack.push_front(tag);
+
} else if (tag == "center") {
// Align to center.
p_rt->push_paragraph(HORIZONTAL_ALIGNMENT_CENTER, Control::TEXT_DIRECTION_AUTO, "");
@@ -2081,6 +2119,7 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt, Control
} else if (tag.begins_with("url=")) {
String url = tag.substr(4, tag.length());
p_rt->push_meta(url);
+
pos = brk_end + 1;
tag_stack.push_front("url");
} else if (tag == "img") {
@@ -2101,6 +2140,7 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt, Control
String col = tag.substr(6, tag.length());
Color color = Color::from_string(col, Color());
p_rt->push_color(color);
+
pos = brk_end + 1;
tag_stack.push_front("color");
@@ -2163,6 +2203,11 @@ void EditorHelp::_toggle_scripts_pressed() {
void EditorHelp::_notification(int p_what) {
switch (p_what) {
+ case NOTIFICATION_POSTINITIALIZE: {
+ // Requires theme to be up to date.
+ _class_desc_resized(false);
+ } break;
+
case NOTIFICATION_READY:
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
_wait_for_thread();
@@ -2275,13 +2320,11 @@ EditorHelp::EditorHelp() {
add_child(class_desc);
class_desc->set_threaded(true);
class_desc->set_v_size_flags(SIZE_EXPAND_FILL);
- class_desc->add_theme_color_override("selection_color", get_theme_color(SNAME("accent_color"), SNAME("Editor")) * Color(1, 1, 1, 0.4));
class_desc->connect("finished", callable_mp(this, &EditorHelp::_class_desc_finished));
class_desc->connect("meta_clicked", callable_mp(this, &EditorHelp::_class_desc_select));
class_desc->connect("gui_input", callable_mp(this, &EditorHelp::_class_desc_input));
class_desc->connect("resized", callable_mp(this, &EditorHelp::_class_desc_resized).bind(false));
- _class_desc_resized(false);
// Added second so it opens at the bottom so it won't offset the entire widget.
find_bar = memnew(FindBar);
@@ -2431,7 +2474,6 @@ void FindBar::popup_search() {
void FindBar::_notification(int p_what) {
switch (p_what) {
- case NOTIFICATION_ENTER_TREE:
case NOTIFICATION_THEME_CHANGED: {
find_prev->set_icon(get_theme_icon(SNAME("MoveUp"), SNAME("EditorIcons")));
find_next->set_icon(get_theme_icon(SNAME("MoveDown"), SNAME("EditorIcons")));
diff --git a/editor/editor_help.h b/editor/editor_help.h
index 81cd6d6674..b2ffe3bc29 100644
--- a/editor/editor_help.h
+++ b/editor/editor_help.h
@@ -125,25 +125,33 @@ class EditorHelp : public VBoxContainer {
String base_path;
- Color text_color;
- Color title_color;
- Color headline_color;
- Color comment_color;
- Color symbol_color;
- Color value_color;
- Color qualifier_color;
- Color type_color;
-
- Ref<Font> doc_font;
- Ref<Font> doc_bold_font;
- Ref<Font> doc_title_font;
- Ref<Font> doc_code_font;
-
- int doc_title_font_size;
+ struct ThemeCache {
+ Ref<StyleBox> background_style;
+
+ Color text_color;
+ Color title_color;
+ Color headline_color;
+ Color comment_color;
+ Color symbol_color;
+ Color value_color;
+ Color qualifier_color;
+ Color type_color;
+
+ Ref<Font> doc_font;
+ Ref<Font> doc_bold_font;
+ Ref<Font> doc_italic_font;
+ Ref<Font> doc_title_font;
+ Ref<Font> doc_code_font;
+ Ref<Font> doc_kbd_font;
+
+ int doc_font_size = 0;
+ int doc_title_font_size = 0;
+ int doc_code_font_size = 0;
+ int doc_kbd_font_size = 0;
+ } theme_cache;
int scroll_to = -1;
- void _update_theme();
void _help_callback(const String &p_topic);
void _add_text(const String &p_bbcode);
@@ -156,6 +164,13 @@ class EditorHelp : public VBoxContainer {
void _add_bulletpoint();
+ void _push_normal_font();
+ void _pop_normal_font();
+ void _push_title_font();
+ void _pop_title_font();
+ void _push_code_font();
+ void _pop_code_font();
+
void _class_desc_finished();
void _class_list_select(const String &p_select);
void _class_desc_select(const String &p_select);
@@ -181,6 +196,8 @@ class EditorHelp : public VBoxContainer {
static void _gen_doc_thread(void *p_udata);
protected:
+ virtual void _update_theme_item_cache() override;
+
void _notification(int p_what);
static void _bind_methods();
diff --git a/editor/editor_inspector.cpp b/editor/editor_inspector.cpp
index 275e47e370..4533bcc51c 100644
--- a/editor/editor_inspector.cpp
+++ b/editor/editor_inspector.cpp
@@ -693,7 +693,7 @@ void EditorProperty::gui_input(const Ref<InputEvent> &p_event) {
bool is_valid_revert = false;
Variant revert_value = EditorPropertyRevert::get_property_revert_value(object, property, &is_valid_revert);
ERR_FAIL_COND(!is_valid_revert);
- emit_changed(property, revert_value);
+ emit_changed(_get_revert_property(), revert_value);
update_property();
}
@@ -2566,12 +2566,13 @@ bool EditorInspector::_is_property_disabled_by_feature_profile(const StringName
}
void EditorInspector::update_tree() {
- //to update properly if all is refreshed
+ // Store currently selected and focused elements to restore after the update.
+ // TODO: Can be useful to store more context for the focusable, such as the caret position in LineEdit.
StringName current_selected = property_selected;
int current_focusable = -1;
if (property_focusable != -1) {
- //check focusable is really focusable
+ // Check that focusable is actually focusable.
bool restore_focus = false;
Control *focused = get_viewport() ? get_viewport()->gui_get_focus_owner() : nullptr;
if (focused) {
@@ -2579,8 +2580,8 @@ void EditorInspector::update_tree() {
while (parent) {
EditorInspector *inspector = Object::cast_to<EditorInspector>(parent);
if (inspector) {
- restore_focus = inspector == this; //may be owned by another inspector
- break; //exit after the first inspector is found, since there may be nested ones
+ restore_focus = inspector == this; // May be owned by another inspector.
+ break; // Exit after the first inspector is found, since there may be nested ones.
}
parent = parent->get_parent();
}
@@ -2591,7 +2592,9 @@ void EditorInspector::update_tree() {
}
}
- _clear();
+ // Only hide plugins if we are not editing any object.
+ // This should be handled outside of the update_tree call anyway (see EditorInspector::edit), but might as well keep it safe.
+ _clear(!object);
if (!object) {
return;
@@ -3301,17 +3304,19 @@ void EditorInspector::update_property(const String &p_prop) {
}
}
-void EditorInspector::_clear() {
+void EditorInspector::_clear(bool p_hide_plugins) {
while (main_vbox->get_child_count()) {
memdelete(main_vbox->get_child(0));
}
+
property_selected = StringName();
property_focusable = -1;
editor_property_map.clear();
sections.clear();
pending.clear();
restart_request_props.clear();
- if (_is_main_editor_inspector()) {
+
+ if (p_hide_plugins && _is_main_editor_inspector()) {
EditorNode::get_singleton()->hide_unused_editors(this);
}
}
@@ -3405,7 +3410,6 @@ void EditorInspector::register_text_enter(Node *p_line_edit) {
}
void EditorInspector::_filter_changed(const String &p_text) {
- _clear();
update_tree();
}
diff --git a/editor/editor_inspector.h b/editor/editor_inspector.h
index eab495ef3d..37ff2e9b52 100644
--- a/editor/editor_inspector.h
+++ b/editor/editor_inspector.h
@@ -451,7 +451,7 @@ class EditorInspector : public ScrollContainer {
List<EditorInspectorSection *> sections;
HashSet<StringName> pending;
- void _clear();
+ void _clear(bool p_hide_plugins = true);
Object *object = nullptr;
//
diff --git a/editor/editor_locale_dialog.cpp b/editor/editor_locale_dialog.cpp
index fbf3c99690..13b4a8c128 100644
--- a/editor/editor_locale_dialog.cpp
+++ b/editor/editor_locale_dialog.cpp
@@ -294,7 +294,7 @@ void EditorLocaleDialog::_update_tree() {
if (!is_edit_mode) {
TreeItem *t = script_list->create_item(s_root);
- t->set_text(0, "[Default]");
+ t->set_text(0, TTR("[Default]"));
t->set_metadata(0, "");
}
@@ -404,7 +404,7 @@ EditorLocaleDialog::EditorLocaleDialog() {
}
{
edit_filters = memnew(CheckButton);
- edit_filters->set_text("Edit Filters");
+ edit_filters->set_text(TTR("Edit Filters"));
edit_filters->set_toggle_mode(true);
edit_filters->set_pressed(false);
edit_filters->connect("toggled", callable_mp(this, &EditorLocaleDialog::_edit_filters));
@@ -412,7 +412,7 @@ EditorLocaleDialog::EditorLocaleDialog() {
}
{
advanced = memnew(CheckButton);
- advanced->set_text("Advanced");
+ advanced->set_text(TTR("Advanced"));
advanced->set_toggle_mode(true);
advanced->set_pressed(false);
advanced->connect("toggled", callable_mp(this, &EditorLocaleDialog::_toggle_advanced));
diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp
index 3adebb2f8e..a0e876315c 100644
--- a/editor/editor_node.cpp
+++ b/editor/editor_node.cpp
@@ -691,10 +691,11 @@ void EditorNode::_notification(int p_what) {
bool theme_changed =
EditorSettings::get_singleton()->check_changed_settings_in_group("interface/theme") ||
- EditorSettings::get_singleton()->check_changed_settings_in_group("text_editor/theme") ||
EditorSettings::get_singleton()->check_changed_settings_in_group("interface/editor/font") ||
EditorSettings::get_singleton()->check_changed_settings_in_group("interface/editor/main_font") ||
EditorSettings::get_singleton()->check_changed_settings_in_group("interface/editor/code_font") ||
+ EditorSettings::get_singleton()->check_changed_settings_in_group("text_editor/theme") ||
+ EditorSettings::get_singleton()->check_changed_settings_in_group("text_editor/help/help") ||
EditorSettings::get_singleton()->check_changed_settings_in_group("filesystem/file_dialog/thumbnail_size");
if (theme_changed) {
@@ -3685,7 +3686,7 @@ void EditorNode::_set_main_scene_state(Dictionary p_state, Node *p_for_scene) {
Node *editor_node = SceneTreeDock::get_singleton()->get_tree_editor()->get_selected();
editor_node = editor_node == nullptr ? get_edited_scene() : editor_node;
- if (Object::cast_to<Node2D>(editor_node) || Object::cast_to<Control>(editor_node)) {
+ if (Object::cast_to<CanvasItem>(editor_node)) {
editor_select(EDITOR_2D);
} else if (Object::cast_to<Node3D>(editor_node)) {
editor_select(EDITOR_3D);
diff --git a/editor/editor_properties.cpp b/editor/editor_properties.cpp
index 33bba90c70..30c7d2b85f 100644
--- a/editor/editor_properties.cpp
+++ b/editor/editor_properties.cpp
@@ -4174,9 +4174,12 @@ struct EditorPropertyRangeHint {
bool radians = false;
};
-static EditorPropertyRangeHint _parse_range_hint(PropertyHint p_hint, const String &p_hint_text, double p_default_step) {
+static EditorPropertyRangeHint _parse_range_hint(PropertyHint p_hint, const String &p_hint_text, double p_default_step, bool is_int = false) {
EditorPropertyRangeHint hint;
hint.step = p_default_step;
+ if (is_int) {
+ hint.hide_slider = false; // Always show slider for ints, unless specified in hint range.
+ }
Vector<String> slices = p_hint_text.split(",");
if (p_hint == PROPERTY_HINT_RANGE) {
ERR_FAIL_COND_V_MSG(slices.size() < 2, hint,
@@ -4294,7 +4297,7 @@ EditorProperty *EditorInspectorDefaultPlugin::get_editor_for_property(Object *p_
} else {
EditorPropertyInteger *editor = memnew(EditorPropertyInteger);
- EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, 1);
+ EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, 1, true);
editor->setup(hint.min, hint.max, hint.step, hint.hide_slider, hint.or_greater, hint.or_less, hint.suffix);
return editor;
@@ -4383,7 +4386,7 @@ EditorProperty *EditorInspectorDefaultPlugin::get_editor_for_property(Object *p_
} break;
case Variant::VECTOR2I: {
EditorPropertyVector2i *editor = memnew(EditorPropertyVector2i(p_wide));
- EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, 1);
+ EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, 1, true);
editor->setup(hint.min, hint.max, p_hint == PROPERTY_HINT_LINK, hint.suffix);
return editor;
@@ -4396,7 +4399,7 @@ EditorProperty *EditorInspectorDefaultPlugin::get_editor_for_property(Object *p_
} break;
case Variant::RECT2I: {
EditorPropertyRect2i *editor = memnew(EditorPropertyRect2i(p_wide));
- EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, 1);
+ EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, 1, true);
editor->setup(hint.min, hint.max, hint.suffix);
return editor;
@@ -4410,7 +4413,7 @@ EditorProperty *EditorInspectorDefaultPlugin::get_editor_for_property(Object *p_
} break;
case Variant::VECTOR3I: {
EditorPropertyVector3i *editor = memnew(EditorPropertyVector3i(p_wide));
- EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, 1);
+ EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, 1, true);
editor->setup(hint.min, hint.max, p_hint == PROPERTY_HINT_LINK, hint.suffix);
return editor;
@@ -4424,7 +4427,7 @@ EditorProperty *EditorInspectorDefaultPlugin::get_editor_for_property(Object *p_
} break;
case Variant::VECTOR4I: {
EditorPropertyVector4i *editor = memnew(EditorPropertyVector4i);
- EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, 1);
+ EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, 1, true);
editor->setup(hint.min, hint.max, hint.suffix);
return editor;
diff --git a/editor/editor_properties_array_dict.cpp b/editor/editor_properties_array_dict.cpp
index 24cfa7ad7b..80ebd32295 100644
--- a/editor/editor_properties_array_dict.cpp
+++ b/editor/editor_properties_array_dict.cpp
@@ -1009,6 +1009,14 @@ void EditorPropertyDictionary::update_property() {
prop = memnew(EditorPropertyRID);
} break;
+ case Variant::SIGNAL: {
+ prop = memnew(EditorPropertySignal);
+
+ } break;
+ case Variant::CALLABLE: {
+ prop = memnew(EditorPropertyCallable);
+
+ } break;
case Variant::OBJECT: {
if (Object::cast_to<EncodedObjectAsID>(value)) {
EditorPropertyObjectID *editor = memnew(EditorPropertyObjectID);
diff --git a/editor/editor_property_name_processor.cpp b/editor/editor_property_name_processor.cpp
index a183e62618..b62615adcc 100644
--- a/editor/editor_property_name_processor.cpp
+++ b/editor/editor_property_name_processor.cpp
@@ -137,6 +137,7 @@ EditorPropertyNameProcessor::EditorPropertyNameProcessor() {
capitalize_string_remaps["bptc"] = "BPTC";
capitalize_string_remaps["bvh"] = "BVH";
capitalize_string_remaps["ca"] = "CA";
+ capitalize_string_remaps["ccdik"] = "CCDIK";
capitalize_string_remaps["cd"] = "CD";
capitalize_string_remaps["cpu"] = "CPU";
capitalize_string_remaps["csg"] = "CSG";
@@ -148,6 +149,7 @@ EditorPropertyNameProcessor::EditorPropertyNameProcessor() {
capitalize_string_remaps["erp"] = "ERP";
capitalize_string_remaps["etc"] = "ETC";
capitalize_string_remaps["etc2"] = "ETC2";
+ capitalize_string_remaps["fabrik"] = "FABRIK";
capitalize_string_remaps["fbx"] = "FBX";
capitalize_string_remaps["fbx2gltf"] = "FBX2glTF";
capitalize_string_remaps["fft"] = "FFT";
@@ -165,6 +167,7 @@ EditorPropertyNameProcessor::EditorPropertyNameProcessor() {
capitalize_string_remaps["glb"] = "GLB";
capitalize_string_remaps["gles2"] = "GLES2";
capitalize_string_remaps["gles3"] = "GLES3";
+ capitalize_string_remaps["gltf"] = "glTF";
capitalize_string_remaps["gpu"] = "GPU";
capitalize_string_remaps["gui"] = "GUI";
capitalize_string_remaps["guid"] = "GUID";
@@ -196,6 +199,7 @@ EditorPropertyNameProcessor::EditorPropertyNameProcessor() {
capitalize_string_remaps["lcd"] = "LCD";
capitalize_string_remaps["ldr"] = "LDR";
capitalize_string_remaps["lod"] = "LOD";
+ capitalize_string_remaps["lods"] = "LODs";
capitalize_string_remaps["lowpass"] = "Low-pass";
capitalize_string_remaps["macos"] = "macOS";
capitalize_string_remaps["mb"] = "(MB)"; // Unit.
diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp
index 8eb2551843..23e32dcbd8 100644
--- a/editor/editor_settings.cpp
+++ b/editor/editor_settings.cpp
@@ -384,9 +384,6 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
if (score > 0 && score >= best_score) {
best = locale;
best_score = score;
- if (score == 10) {
- break; // Exact match, skip the rest.
- }
}
}
if (best_score == 0) {
@@ -586,9 +583,9 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
// Help
_initial_set("text_editor/help/show_help_index", true);
- EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "text_editor/help/help_font_size", 15, "8,48,1")
- EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "text_editor/help/help_source_font_size", 14, "8,48,1")
- EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "text_editor/help/help_title_font_size", 23, "8,48,1")
+ EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "text_editor/help/help_font_size", 16, "8,48,1")
+ EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "text_editor/help/help_source_font_size", 15, "8,48,1")
+ EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "text_editor/help/help_title_font_size", 23, "8,64,1")
EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "text_editor/help/class_reference_examples", 0, "GDScript,C#,GDScript and C#")
/* Editors */
diff --git a/editor/event_listener_line_edit.cpp b/editor/event_listener_line_edit.cpp
index ea4a7133bf..ee401810ad 100644
--- a/editor/event_listener_line_edit.cpp
+++ b/editor/event_listener_line_edit.cpp
@@ -105,7 +105,8 @@ String EventListenerLineEdit::get_event_text(const Ref<InputEvent> &p_event, boo
desc = RTR(_joy_axis_descriptions[2 * (size_t)jp_motion->get_axis() + (jp_motion->get_axis_value() < 0 ? 0 : 1)]);
}
- text = vformat("Joypad Axis %s %s (%s)", itos((int64_t)jp_motion->get_axis()), jp_motion->get_axis_value() < 0 ? "-" : "+", desc);
+ // TRANSLATORS: %d is the axis number, the first %s is either "-" or "+", and the second %s is the description of the axis.
+ text = vformat(TTR("Joypad Axis %d %s (%s)"), (int64_t)jp_motion->get_axis(), jp_motion->get_axis_value() < 0 ? "-" : "+", desc);
}
if (p_include_device && (mouse.is_valid() || jp_button.is_valid() || jp_motion.is_valid())) {
String device_string = get_device_string(p_event->get_device());
diff --git a/editor/export/editor_export_platform.cpp b/editor/export/editor_export_platform.cpp
index a46484bb0e..96a8cc8b91 100644
--- a/editor/export/editor_export_platform.cpp
+++ b/editor/export/editor_export_platform.cpp
@@ -1513,7 +1513,7 @@ Error EditorExportPlatform::save_pack(const Ref<EditorExportPreset> &p_preset, b
f = FileAccess::open(p_path, FileAccess::WRITE);
if (f.is_null()) {
DirAccess::remove_file_or_error(tmppath);
- add_message(EXPORT_MESSAGE_ERROR, TTR("Save PCK"), vformat(TTR("Can't open file to read from path \"%s\"."), tmppath));
+ add_message(EXPORT_MESSAGE_ERROR, TTR("Save PCK"), vformat(TTR("Can't open file for writing at path \"%s\"."), p_path));
return ERR_CANT_CREATE;
}
} else {
@@ -1521,7 +1521,7 @@ Error EditorExportPlatform::save_pack(const Ref<EditorExportPreset> &p_preset, b
f = FileAccess::open(p_path, FileAccess::READ_WRITE);
if (f.is_null()) {
DirAccess::remove_file_or_error(tmppath);
- add_message(EXPORT_MESSAGE_ERROR, TTR("Save PCK"), vformat(TTR("Can't open executable file from path \"%s\"."), tmppath));
+ add_message(EXPORT_MESSAGE_ERROR, TTR("Save PCK"), vformat(TTR("Can't open file for reading-writing at path \"%s\"."), p_path));
return ERR_FILE_CANT_OPEN;
}
diff --git a/editor/export/editor_export_platform_pc.cpp b/editor/export/editor_export_platform_pc.cpp
index bbfd73be5e..7f934bc45b 100644
--- a/editor/export/editor_export_platform_pc.cpp
+++ b/editor/export/editor_export_platform_pc.cpp
@@ -33,6 +33,9 @@
#include "core/config/project_settings.h"
void EditorExportPlatformPC::get_preset_features(const Ref<EditorExportPreset> &p_preset, List<String> *r_features) const {
+ if (p_preset->get("texture_format/bptc")) {
+ r_features->push_back("bptc");
+ }
if (p_preset->get("texture_format/s3tc")) {
r_features->push_back("s3tc");
}
diff --git a/editor/icons/ParallaxBackground.svg b/editor/icons/ParallaxBackground.svg
index 71a586eff4..6f25954df3 100644
--- a/editor/icons/ParallaxBackground.svg
+++ b/editor/icons/ParallaxBackground.svg
@@ -1 +1 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -1036.4)"><path d="m2 2a1 1 0 0 0 -1 1v10a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-10a1 1 0 0 0 -1-1zm0 1h12v10h-12zm5 2-3 3 3 3zm2 0v6l3-3z" fill="#e0e0e0" transform="translate(0 1036.4)"/></g></svg>
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1c-1.1046 0-2 .89543-2 2v10c0 1.1046.89543 2 2 2h10c1.1046 0 2-.89543 2-2v-10c0-1.1046-.89543-2-2-2zm0 1h10c.55228.0000096.99999.44772 1 1v10c-.00001.55228-.44772.99999-1 1h-10c-.55228-.00001-.99999-.44772-1-1v-10c.0000096-.55228.44772-.99999 1-1zm4 3-3 3 3 3zm2 0v6l3-3z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/ParallaxLayer.svg b/editor/icons/ParallaxLayer.svg
index 6945798e9c..df177bd7a2 100644
--- a/editor/icons/ParallaxLayer.svg
+++ b/editor/icons/ParallaxLayer.svg
@@ -1 +1 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -1036.4)"><path d="m3 1c-1.1046 0-2 .89543-2 2v10c0 1.1046.89543 2 2 2h10c1.1046 0 2-.89543 2-2v-10c0-1.1046-.89543-2-2-2zm0 1h10c.55228.0000096.99999.44772 1 1v10c-.00001.55228-.44772.99999-1 1h-10c-.55228-.00001-.99999-.44772-1-1v-10c.0000096-.55228.44772-.99999 1-1zm4 3-3 3 3 3zm2 0v6l3-3z" fill="#8da5f3" fill-rule="evenodd" transform="translate(0 1036.4)"/></g></svg>
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1c-1.1079989 0-2 .8920011-2 2v10c0 1.107999.8920011 2 2 2h10c1.107999 0 2-.892001 2-2v-10c0-1.1079989-.892001-2-2-2zm4 4v6l-3-3zm2 0 3 3-3 3z" fill="#8da5f3" fill-rule="evenodd"/></svg>
diff --git a/editor/import/dynamic_font_import_settings.cpp b/editor/import/dynamic_font_import_settings.cpp
index 6e74c42b2c..b34656c481 100644
--- a/editor/import/dynamic_font_import_settings.cpp
+++ b/editor/import/dynamic_font_import_settings.cpp
@@ -36,7 +36,9 @@
#include "editor/editor_inspector.h"
#include "editor/editor_locale_dialog.h"
#include "editor/editor_node.h"
+#include "editor/editor_property_name_processor.h"
#include "editor/editor_scale.h"
+#include "editor/editor_settings.h"
/*************************************************************************/
/* Settings data */
@@ -926,6 +928,15 @@ void DynamicFontImportSettings::_notification(int p_what) {
case NOTIFICATION_THEME_CHANGED: {
add_var->set_icon(get_theme_icon(SNAME("Add"), SNAME("EditorIcons")));
} break;
+
+ case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
+ if (EditorSettings::get_singleton()->check_changed_settings_in_group("interface/editor/localize_settings")) {
+ EditorPropertyNameProcessor::Style style = EditorPropertyNameProcessor::get_singleton()->get_settings_style();
+ inspector_general->set_property_name_style(style);
+ inspector_vars->set_property_name_style(style);
+ inspector_text->set_property_name_style(style);
+ }
+ } break;
}
}
@@ -1334,6 +1345,7 @@ DynamicFontImportSettings::DynamicFontImportSettings() {
inspector_general->set_v_size_flags(Control::SIZE_EXPAND_FILL);
inspector_general->set_custom_minimum_size(Size2(300 * EDSCALE, 250 * EDSCALE));
inspector_general->connect("property_edited", callable_mp(this, &DynamicFontImportSettings::_main_prop_changed));
+ inspector_general->set_property_name_style(EditorPropertyNameProcessor::get_singleton()->get_settings_style());
page1_hb->add_child(inspector_general);
// Page 2 layout: Configurations
@@ -1386,6 +1398,7 @@ DynamicFontImportSettings::DynamicFontImportSettings() {
inspector_vars = memnew(EditorInspector);
inspector_vars->set_v_size_flags(Control::SIZE_EXPAND_FILL);
inspector_vars->connect("property_edited", callable_mp(this, &DynamicFontImportSettings::_variation_changed));
+ inspector_vars->set_property_name_style(EditorPropertyNameProcessor::get_singleton()->get_settings_style());
page2_side_vb->add_child(inspector_vars);
VBoxContainer *preload_pages_vb = memnew(VBoxContainer);
@@ -1461,6 +1474,7 @@ DynamicFontImportSettings::DynamicFontImportSettings() {
inspector_text->set_v_size_flags(Control::SIZE_EXPAND_FILL);
inspector_text->set_custom_minimum_size(Size2(300 * EDSCALE, 250 * EDSCALE));
inspector_text->connect("property_edited", callable_mp(this, &DynamicFontImportSettings::_change_text_opts));
+ inspector_text->set_property_name_style(EditorPropertyNameProcessor::get_singleton()->get_settings_style());
page2_1_hb->add_child(inspector_text);
text_edit = memnew(TextEdit);
diff --git a/editor/import/scene_import_settings.cpp b/editor/import/scene_import_settings.cpp
index 8d26feebf4..6eebb84216 100644
--- a/editor/import/scene_import_settings.cpp
+++ b/editor/import/scene_import_settings.cpp
@@ -64,6 +64,11 @@ class SceneImportSettingsData : public Object {
current[p_name] = p_value;
+ // SceneImportSettings must decide if a new collider should be generated or not
+ if (category == ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_MESH_3D_NODE) {
+ SceneImportSettings::get_singleton()->request_generate_collider();
+ }
+
if (SceneImportSettings::get_singleton()->is_editing_animation()) {
if (category == ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_MAX) {
if (ResourceImporterScene::get_animation_singleton()->get_option_visibility(path, p_name, current)) {
@@ -420,9 +425,9 @@ void SceneImportSettings::_update_view_gizmos() {
return;
}
for (const KeyValue<String, NodeData> &e : node_map) {
- bool generate_collider = false;
+ bool show_collider_view = false;
if (e.value.settings.has(SNAME("generate/physics"))) {
- generate_collider = e.value.settings[SNAME("generate/physics")];
+ show_collider_view = e.value.settings[SNAME("generate/physics")];
}
MeshInstance3D *mesh_node = Object::cast_to<MeshInstance3D>(e.value.node);
@@ -436,7 +441,7 @@ void SceneImportSettings::_update_view_gizmos() {
CRASH_COND_MSG(descendants.is_empty(), "This is unreachable, since the collider view is always created even when the collision is not used! If this is triggered there is a bug on the function `_fill_scene`.");
MeshInstance3D *collider_view = static_cast<MeshInstance3D *>(descendants[0].operator Object *());
- collider_view->set_visible(generate_collider);
+ collider_view->set_visible(show_collider_view);
if (generate_collider) {
// This collider_view doesn't have a mesh so we need to generate a new one.
@@ -466,6 +471,8 @@ void SceneImportSettings::_update_view_gizmos() {
collider_view->set_transform(transform);
}
}
+
+ generate_collider = false;
}
void SceneImportSettings::_update_camera() {
@@ -530,6 +537,10 @@ void SceneImportSettings::_load_default_subresource_settings(HashMap<StringName,
}
}
+void SceneImportSettings::request_generate_collider() {
+ generate_collider = true;
+}
+
void SceneImportSettings::update_view() {
update_view_timer->start();
}
diff --git a/editor/import/scene_import_settings.h b/editor/import/scene_import_settings.h
index 6481221ad6..69bf58b627 100644
--- a/editor/import/scene_import_settings.h
+++ b/editor/import/scene_import_settings.h
@@ -191,6 +191,7 @@ class SceneImportSettings : public ConfirmationDialog {
void _load_default_subresource_settings(HashMap<StringName, Variant> &settings, const String &p_type, const String &p_import_id, ResourceImporterScene::InternalImportCategory p_category);
bool editing_animation = false;
+ bool generate_collider = false;
Timer *update_view_timer = nullptr;
@@ -199,6 +200,7 @@ protected:
public:
bool is_editing_animation() const { return editing_animation; }
+ void request_generate_collider();
void update_view();
void open_settings(const String &p_path, bool p_for_animation = false);
static SceneImportSettings *get_singleton();
diff --git a/editor/input_event_configuration_dialog.cpp b/editor/input_event_configuration_dialog.cpp
index fb450a41d3..c620858439 100644
--- a/editor/input_event_configuration_dialog.cpp
+++ b/editor/input_event_configuration_dialog.cpp
@@ -538,6 +538,8 @@ void InputEventConfigurationDialog::_notification(int p_what) {
icon_cache.joypad_button = get_theme_icon(SNAME("JoyButton"), SNAME("EditorIcons"));
icon_cache.joypad_axis = get_theme_icon(SNAME("JoyAxis"), SNAME("EditorIcons"));
+ event_as_text->add_theme_font_override("font", get_theme_font(SNAME("bold"), SNAME("EditorFonts")));
+
_update_input_list();
} break;
}
@@ -591,7 +593,6 @@ InputEventConfigurationDialog::InputEventConfigurationDialog() {
event_as_text = memnew(Label);
event_as_text->set_autowrap_mode(TextServer::AUTOWRAP_WORD_SMART);
event_as_text->set_horizontal_alignment(HORIZONTAL_ALIGNMENT_CENTER);
- event_as_text->add_theme_font_override("font", get_theme_font(SNAME("bold"), SNAME("EditorFonts")));
event_as_text->add_theme_font_size_override("font_size", 18 * EDSCALE);
main_vbox->add_child(event_as_text);
diff --git a/editor/plugins/mesh_library_editor_plugin.cpp b/editor/plugins/mesh_library_editor_plugin.cpp
index 2981862291..cf8555d07d 100644
--- a/editor/plugins/mesh_library_editor_plugin.cpp
+++ b/editor/plugins/mesh_library_editor_plugin.cpp
@@ -232,8 +232,8 @@ void MeshLibraryEditor::_menu_cbk(int p_option) {
} break;
case MENU_OPTION_REMOVE_ITEM: {
String p = InspectorDock::get_inspector_singleton()->get_selected_path();
- if (p.begins_with("/MeshLibrary/item") && p.get_slice_count("/") >= 3) {
- to_erase = p.get_slice("/", 3).to_int();
+ if (p.begins_with("item") && p.get_slice_count("/") >= 2) {
+ to_erase = p.get_slice("/", 1).to_int();
cd_remove->set_text(vformat(TTR("Remove item %d?"), to_erase));
cd_remove->popup_centered(Size2(300, 60));
}
diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp
index b001b4f766..fc1d8936d5 100644
--- a/editor/plugins/node_3d_editor_plugin.cpp
+++ b/editor/plugins/node_3d_editor_plugin.cpp
@@ -3392,7 +3392,6 @@ void Node3DEditorViewport::_menu_option(int p_option) {
VIEW_DISPLAY_SHADELESS,
VIEW_DISPLAY_LIGHTING,
VIEW_DISPLAY_NORMAL_BUFFER,
- VIEW_DISPLAY_WIREFRAME,
VIEW_DISPLAY_DEBUG_SHADOW_ATLAS,
VIEW_DISPLAY_DEBUG_DIRECTIONAL_SHADOW_ATLAS,
VIEW_DISPLAY_DEBUG_VOXEL_GI_ALBEDO,
@@ -3422,7 +3421,6 @@ void Node3DEditorViewport::_menu_option(int p_option) {
Viewport::DEBUG_DRAW_UNSHADED,
Viewport::DEBUG_DRAW_LIGHTING,
Viewport::DEBUG_DRAW_NORMAL_BUFFER,
- Viewport::DEBUG_DRAW_WIREFRAME,
Viewport::DEBUG_DRAW_SHADOW_ATLAS,
Viewport::DEBUG_DRAW_DIRECTIONAL_SHADOW_ATLAS,
Viewport::DEBUG_DRAW_VOXEL_GI_ALBEDO,
@@ -3445,9 +3443,7 @@ void Node3DEditorViewport::_menu_option(int p_option) {
Viewport::DEBUG_DRAW_MOTION_VECTORS,
};
- int idx = 0;
-
- while (display_options[idx] != VIEW_MAX) {
+ for (int idx = 0; display_options[idx] != VIEW_MAX; idx++) {
int id = display_options[idx];
int item_idx = view_menu->get_popup()->get_item_index(id);
if (item_idx != -1) {
@@ -3461,7 +3457,6 @@ void Node3DEditorViewport::_menu_option(int p_option) {
if (id == p_option) {
viewport->set_debug_draw(debug_draw_modes[idx]);
}
- idx++;
}
} break;
}
diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp
index e515b46b1e..ccbc7c3d74 100644
--- a/editor/plugins/script_editor_plugin.cpp
+++ b/editor/plugins/script_editor_plugin.cpp
@@ -33,6 +33,7 @@
#include "core/config/project_settings.h"
#include "core/input/input.h"
#include "core/io/file_access.h"
+#include "core/io/json.h"
#include "core/io/resource_loader.h"
#include "core/os/keyboard.h"
#include "core/os/os.h"
@@ -209,6 +210,27 @@ Ref<EditorSyntaxHighlighter> EditorPlainTextSyntaxHighlighter::_create() const {
return syntax_highlighter;
}
+////
+
+void EditorJSONSyntaxHighlighter::_update_cache() {
+ highlighter->set_text_edit(text_edit);
+ highlighter->clear_keyword_colors();
+ highlighter->clear_member_keyword_colors();
+ highlighter->clear_color_regions();
+
+ highlighter->set_symbol_color(EDITOR_GET("text_editor/theme/highlighting/symbol_color"));
+ highlighter->set_number_color(EDITOR_GET("text_editor/theme/highlighting/number_color"));
+
+ const Color string_color = EDITOR_GET("text_editor/theme/highlighting/string_color");
+ highlighter->add_color_region("\"", "\"", string_color);
+}
+
+Ref<EditorSyntaxHighlighter> EditorJSONSyntaxHighlighter::_create() const {
+ Ref<EditorJSONSyntaxHighlighter> syntax_highlighter;
+ syntax_highlighter.instantiate();
+ return syntax_highlighter;
+}
+
////////////////////////////////////////////////////////////////////////////////
/*** SCRIPT EDITOR ****/
@@ -702,9 +724,10 @@ void ScriptEditor::_open_recent_script(int p_idx) {
if (FileAccess::exists(path)) {
List<String> extensions;
ResourceLoader::get_recognized_extensions_for_type("Script", &extensions);
+ ResourceLoader::get_recognized_extensions_for_type("JSON", &extensions);
if (extensions.find(path.get_extension())) {
- Ref<Script> scr = ResourceLoader::load(path);
+ Ref<Resource> scr = ResourceLoader::load(path);
if (scr.is_valid()) {
edit(scr, true);
return;
@@ -1182,6 +1205,7 @@ void ScriptEditor::_menu_option(int p_option) {
List<String> extensions;
ResourceLoader::get_recognized_extensions_for_type("Script", &extensions);
+ ResourceLoader::get_recognized_extensions_for_type("JSON", &extensions);
bool built_in = !path.is_resource_file();
if (extensions.find(path.get_extension()) || built_in) {
@@ -1196,7 +1220,7 @@ void ScriptEditor::_menu_option(int p_option) {
}
}
- Ref<Script> scr = ResourceLoader::load(path);
+ Ref<Resource> scr = ResourceLoader::load(path);
if (!scr.is_valid()) {
EditorNode::get_singleton()->show_warning(TTR("Could not load file at:") + "\n\n" + path, TTR("Error!"));
file_dialog_option = -1;
@@ -2319,12 +2343,23 @@ bool ScriptEditor::edit(const Ref<Resource> &p_resource, int p_line, int p_col,
}
se->add_syntax_highlighter(highlighter);
- if (scr != nullptr && !highlighter_set) {
- PackedStringArray languages = highlighter->_get_supported_languages();
+ if (highlighter_set) {
+ continue;
+ }
+
+ PackedStringArray languages = highlighter->_get_supported_languages();
+ // If script try language, else use extension.
+ if (scr != nullptr) {
if (languages.has(scr->get_language()->get_name())) {
se->set_syntax_highlighter(highlighter);
highlighter_set = true;
}
+ continue;
+ }
+
+ if (languages.has(p_resource->get_path().get_extension())) {
+ se->set_syntax_highlighter(highlighter);
+ highlighter_set = true;
}
}
@@ -2483,7 +2518,7 @@ void ScriptEditor::save_all_scripts() {
} else {
// For built-in scripts, save their scenes instead.
const String scene_path = edited_res->get_path().get_slice("::", 0);
- if (!scenes_to_save.has(scene_path)) {
+ if (!scene_path.is_empty() && !scenes_to_save.has(scene_path)) {
scenes_to_save.push_back(scene_path);
}
}
@@ -2528,7 +2563,7 @@ void ScriptEditor::reload_scripts(bool p_refresh_only) {
}
Ref<Script> scr = edited_res;
- if (scr != nullptr) {
+ if (scr.is_valid()) {
Ref<Script> rel_scr = ResourceLoader::load(scr->get_path(), scr->get_class(), ResourceFormatLoader::CACHE_MODE_IGNORE);
ERR_CONTINUE(!rel_scr.is_valid());
scr->set_source_code(rel_scr->get_source_code());
@@ -2536,13 +2571,17 @@ void ScriptEditor::reload_scripts(bool p_refresh_only) {
scr->reload(true);
}
+ Ref<JSON> json = edited_res;
+ if (json != nullptr) {
+ Ref<JSON> rel_json = ResourceLoader::load(json->get_path(), json->get_class(), ResourceFormatLoader::CACHE_MODE_IGNORE);
+ ERR_CONTINUE(!rel_json.is_valid());
+ json->parse(rel_json->get_parsed_text(), true);
+ json->set_last_modified_time(rel_json->get_last_modified_time());
+ }
+
Ref<TextFile> text_file = edited_res;
- if (text_file != nullptr) {
- Error err;
- Ref<TextFile> rel_text_file = _load_text_file(text_file->get_path(), &err);
- ERR_CONTINUE(!rel_text_file.is_valid());
- text_file->set_text(rel_text_file->get_text());
- text_file->set_last_modified_time(rel_text_file->get_last_modified_time());
+ if (text_file.is_valid()) {
+ text_file->reload_from_file();
}
}
@@ -2568,8 +2607,9 @@ void ScriptEditor::open_text_file_create_dialog(const String &p_base_path, const
Ref<Resource> ScriptEditor::open_file(const String &p_file) {
List<String> extensions;
ResourceLoader::get_recognized_extensions_for_type("Script", &extensions);
+ ResourceLoader::get_recognized_extensions_for_type("JSON", &extensions);
if (extensions.find(p_file.get_extension())) {
- Ref<Script> scr = ResourceLoader::load(p_file);
+ Ref<Resource> scr = ResourceLoader::load(p_file);
if (!scr.is_valid()) {
EditorNode::get_singleton()->show_warning(TTR("Could not load file at:") + "\n\n" + p_file, TTR("Error!"));
return Ref<Resource>();
@@ -2870,8 +2910,8 @@ bool ScriptEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_data
if (file.is_empty() || !FileAccess::exists(file)) {
continue;
}
- if (ResourceLoader::exists(file, "Script")) {
- Ref<Script> scr = ResourceLoader::load(file);
+ if (ResourceLoader::exists(file, "Script") || ResourceLoader::exists(file, "JSON")) {
+ Ref<Resource> scr = ResourceLoader::load(file);
if (scr.is_valid()) {
return true;
}
@@ -2951,7 +2991,7 @@ void ScriptEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Co
continue;
}
- if (!ResourceLoader::exists(file, "Script") && !textfile_extensions.has(file.get_extension())) {
+ if (!ResourceLoader::exists(file, "Script") && !ResourceLoader::exists(file, "JSON") && !textfile_extensions.has(file.get_extension())) {
continue;
}
@@ -3109,6 +3149,7 @@ void ScriptEditor::set_window_layout(Ref<ConfigFile> p_layout) {
HashSet<String> loaded_scripts;
List<String> extensions;
ResourceLoader::get_recognized_extensions_for_type("Script", &extensions);
+ ResourceLoader::get_recognized_extensions_for_type("JSON", &extensions);
for (int i = 0; i < scripts.size(); i++) {
String path = scripts[i];
@@ -3127,7 +3168,7 @@ void ScriptEditor::set_window_layout(Ref<ConfigFile> p_layout) {
loaded_scripts.insert(path);
if (extensions.find(path.get_extension())) {
- Ref<Script> scr = ResourceLoader::load(path);
+ Ref<Resource> scr = ResourceLoader::load(path);
if (!scr.is_valid()) {
continue;
}
@@ -3481,6 +3522,12 @@ void ScriptEditor::_open_script_request(const String &p_path) {
return;
}
+ Ref<JSON> json = ResourceLoader::load(p_path);
+ if (json.is_valid()) {
+ script_editor->edit(json, false);
+ return;
+ }
+
Error err;
Ref<TextFile> text_file = script_editor->_load_text_file(p_path, &err);
if (text_file.is_valid()) {
@@ -3543,7 +3590,8 @@ void ScriptEditor::_on_find_in_files_result_selected(String fpath, int line_numb
return;
} else {
Ref<Script> scr = res;
- if (scr.is_valid()) {
+ Ref<JSON> json = res;
+ if (scr.is_valid() || json.is_valid()) {
edit(scr);
ScriptTextEditor *ste = Object::cast_to<ScriptTextEditor>(_get_current_editor());
@@ -3946,6 +3994,10 @@ ScriptEditor::ScriptEditor() {
add_theme_style_override("panel", EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("ScriptEditorPanel"), SNAME("EditorStyles")));
tab_container->add_theme_style_override("panel", EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("ScriptEditor"), SNAME("EditorStyles")));
+
+ Ref<EditorJSONSyntaxHighlighter> json_syntax_highlighter;
+ json_syntax_highlighter.instantiate();
+ register_syntax_highlighter(json_syntax_highlighter);
}
ScriptEditor::~ScriptEditor() {
@@ -3967,6 +4019,8 @@ void ScriptEditorPlugin::edit(Object *p_object) {
}
}
script_editor->edit(p_script);
+ } else if (Object::cast_to<JSON>(p_object)) {
+ script_editor->edit(Object::cast_to<JSON>(p_object));
} else if (Object::cast_to<TextFile>(p_object)) {
script_editor->edit(Object::cast_to<TextFile>(p_object));
}
@@ -3981,6 +4035,10 @@ bool ScriptEditorPlugin::handles(Object *p_object) const {
return true;
}
+ if (Object::cast_to<JSON>(p_object)) {
+ return true;
+ }
+
return p_object->is_class("Script");
}
diff --git a/editor/plugins/script_editor_plugin.h b/editor/plugins/script_editor_plugin.h
index 988d07621c..f8e684ae34 100644
--- a/editor/plugins/script_editor_plugin.h
+++ b/editor/plugins/script_editor_plugin.h
@@ -96,6 +96,24 @@ public:
virtual Ref<EditorSyntaxHighlighter> _create() const override;
};
+class EditorJSONSyntaxHighlighter : public EditorSyntaxHighlighter {
+ GDCLASS(EditorJSONSyntaxHighlighter, EditorSyntaxHighlighter)
+
+private:
+ Ref<CodeHighlighter> highlighter;
+
+public:
+ virtual void _update_cache() override;
+ virtual Dictionary _get_line_syntax_highlighting_impl(int p_line) override { return highlighter->get_line_syntax_highlighting(p_line); }
+
+ virtual PackedStringArray _get_supported_languages() const override { return PackedStringArray{ "json" }; }
+ virtual String _get_name() const override { return TTR("JSON"); }
+
+ virtual Ref<EditorSyntaxHighlighter> _create() const override;
+
+ EditorJSONSyntaxHighlighter() { highlighter.instantiate(); }
+};
+
///////////////////////////////////////////////////////////////////////////////
class ScriptEditorQuickOpen : public ConfirmationDialog {
diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp
index 6b4e7184d9..9fe1d8af99 100644
--- a/editor/plugins/script_text_editor.cpp
+++ b/editor/plugins/script_text_editor.cpp
@@ -1362,11 +1362,36 @@ void ScriptTextEditor::_edit_option(int p_op) {
code_editor->remove_all_bookmarks();
} break;
case DEBUG_TOGGLE_BREAKPOINT: {
- for (int caret_idx = 0; caret_idx < tx->get_caret_count(); caret_idx++) {
- int line = tx->get_caret_line(caret_idx);
- bool dobreak = !tx->is_line_breakpointed(line);
- tx->set_line_as_breakpoint(line, dobreak);
- EditorDebuggerNode::get_singleton()->set_breakpoint(script->get_path(), line + 1, dobreak);
+ Vector<int> caret_edit_order = tx->get_caret_index_edit_order();
+ caret_edit_order.reverse();
+ int last_line = -1;
+ for (const int &c : caret_edit_order) {
+ int from = tx->has_selection(c) ? tx->get_selection_from_line(c) : tx->get_caret_line(c);
+ from += from == last_line ? 1 : 0;
+ int to = tx->has_selection(c) ? tx->get_selection_to_line(c) : tx->get_caret_line(c);
+ if (to < from) {
+ continue;
+ }
+ // Check first if there's any lines with breakpoints in the selection.
+ bool selection_has_breakpoints = false;
+ for (int line = from; line <= to; line++) {
+ if (tx->is_line_breakpointed(line)) {
+ selection_has_breakpoints = true;
+ break;
+ }
+ }
+
+ // Set breakpoint on caret or remove all bookmarks from the selection.
+ if (!selection_has_breakpoints) {
+ if (tx->get_caret_line(c) != last_line) {
+ tx->set_line_as_breakpoint(tx->get_caret_line(c), true);
+ }
+ } else {
+ for (int line = from; line <= to; line++) {
+ tx->set_line_as_breakpoint(line, false);
+ }
+ }
+ last_line = to;
}
} break;
case DEBUG_REMOVE_ALL_BREAKPOINTS: {
@@ -1820,30 +1845,72 @@ void ScriptTextEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) {
color_position.x = row;
color_position.y = col;
- int begin = 0;
- int end = 0;
- bool valid = false;
+ int begin = -1;
+ int end = -1;
+ enum EXPRESSION_PATTERNS {
+ NOT_PARSED,
+ RGBA_PARAMETER, // Color(float,float,float) or Color(float,float,float,float)
+ COLOR_NAME, // Color.COLOR_NAME
+ } expression_pattern = NOT_PARSED;
+
for (int i = col; i < line.length(); i++) {
if (line[i] == '(') {
+ if (expression_pattern == NOT_PARSED) {
+ begin = i;
+ expression_pattern = RGBA_PARAMETER;
+ } else {
+ // Method call or '(' appearing twice.
+ expression_pattern = NOT_PARSED;
+
+ break;
+ }
+ } else if (expression_pattern == RGBA_PARAMETER && line[i] == ')' && end < 0) {
+ end = i + 1;
+
+ break;
+ } else if (expression_pattern == NOT_PARSED && line[i] == '.') {
begin = i;
+ expression_pattern = COLOR_NAME;
+ } else if (expression_pattern == COLOR_NAME && end < 0 && (line[i] == ' ' || line[i] == '\t')) {
+ // Including '.' and spaces.
continue;
- } else if (line[i] == ')') {
- end = i + 1;
- valid = true;
+ } else if (expression_pattern == COLOR_NAME && !(line[i] == '_' || ('A' <= line[i] && line[i] <= 'Z'))) {
+ end = i;
+
break;
}
}
- if (valid) {
- color_args = line.substr(begin, end - begin);
- String stripped = color_args.replace(" ", "").replace("(", "").replace(")", "");
- PackedFloat64Array color = stripped.split_floats(",");
- if (color.size() > 2) {
- float alpha = color.size() > 3 ? color[3] : 1.0f;
- color_picker->set_pick_color(Color(color[0], color[1], color[2], alpha));
- }
+
+ switch (expression_pattern) {
+ case RGBA_PARAMETER: {
+ color_args = line.substr(begin, end - begin);
+ String stripped = color_args.replace(" ", "").replace("\t", "").replace("(", "").replace(")", "");
+ PackedFloat64Array color = stripped.split_floats(",");
+ if (color.size() > 2) {
+ float alpha = color.size() > 3 ? color[3] : 1.0f;
+ color_picker->set_pick_color(Color(color[0], color[1], color[2], alpha));
+ }
+ } break;
+ case COLOR_NAME: {
+ if (end < 0) {
+ end = line.length();
+ }
+ color_args = line.substr(begin, end - begin);
+ const String color_name = color_args.replace(" ", "").replace("\t", "").replace(".", "");
+ const int color_index = Color::find_named_color(color_name);
+ if (0 <= color_index) {
+ const Color color_constant = Color::get_named_color(color_index);
+ color_picker->set_pick_color(color_constant);
+ } else {
+ has_color = false;
+ }
+ } break;
+ default:
+ has_color = false;
+ break;
+ }
+ if (has_color) {
color_panel->set_position(get_screen_position() + local_pos);
- } else {
- has_color = false;
}
}
_make_context_menu(tx->has_selection(), has_color, foldable, open_docs, goto_definition, local_pos);
diff --git a/editor/plugins/skeleton_3d_editor_plugin.cpp b/editor/plugins/skeleton_3d_editor_plugin.cpp
index 7f43de3240..120cfbdefb 100644
--- a/editor/plugins/skeleton_3d_editor_plugin.cpp
+++ b/editor/plugins/skeleton_3d_editor_plugin.cpp
@@ -1276,8 +1276,6 @@ int Skeleton3DGizmoPlugin::subgizmos_intersect_ray(const EditorNode3DGizmo *p_gi
}
if (closest_idx >= 0) {
- WARN_PRINT("ray:");
- WARN_PRINT(itos(closest_idx));
se->select_bone(closest_idx);
return closest_idx;
}
diff --git a/editor/plugins/text_editor.cpp b/editor/plugins/text_editor.cpp
index a376699e54..ceb170d7d8 100644
--- a/editor/plugins/text_editor.cpp
+++ b/editor/plugins/text_editor.cpp
@@ -30,6 +30,7 @@
#include "text_editor.h"
+#include "core/io/json.h"
#include "core/os/keyboard.h"
#include "editor/editor_node.h"
#include "editor/editor_settings.h"
@@ -67,12 +68,12 @@ void TextEditor::_load_theme_settings() {
String TextEditor::get_name() {
String name;
- name = text_file->get_path().get_file();
+ name = edited_res->get_path().get_file();
if (name.is_empty()) {
// This appears for newly created built-in text_files before saving the scene.
name = TTR("[unsaved]");
- } else if (text_file->is_built_in()) {
- const String &text_file_name = text_file->get_name();
+ } else if (edited_res->is_built_in()) {
+ const String &text_file_name = edited_res->get_name();
if (!text_file_name.is_empty()) {
// If the built-in text_file has a custom resource name defined,
// display the built-in text_file name as follows: `ResourceName (scene_file.tscn)`
@@ -88,20 +89,29 @@ String TextEditor::get_name() {
}
Ref<Texture2D> TextEditor::get_theme_icon() {
- return EditorNode::get_singleton()->get_object_icon(text_file.ptr(), "");
+ return EditorNode::get_singleton()->get_object_icon(edited_res.ptr(), "TextFile");
}
Ref<Resource> TextEditor::get_edited_resource() const {
- return text_file;
+ return edited_res;
}
void TextEditor::set_edited_resource(const Ref<Resource> &p_res) {
- ERR_FAIL_COND(text_file.is_valid());
+ ERR_FAIL_COND(edited_res.is_valid());
ERR_FAIL_COND(p_res.is_null());
- text_file = p_res;
+ edited_res = p_res;
+
+ Ref<TextFile> text_file = edited_res;
+ if (text_file != nullptr) {
+ code_editor->get_text_editor()->set_text(text_file->get_text());
+ }
+
+ Ref<JSON> json_file = edited_res;
+ if (json_file != nullptr) {
+ code_editor->get_text_editor()->set_text(json_file->get_parsed_text());
+ }
- code_editor->get_text_editor()->set_text(text_file->get_text());
code_editor->get_text_editor()->clear_undo_history();
code_editor->get_text_editor()->tag_saved_version();
@@ -118,6 +128,8 @@ void TextEditor::enable_editor(Control *p_shortcut_context) {
_load_theme_settings();
+ _validate_script();
+
if (p_shortcut_context) {
for (int i = 0; i < edit_hb->get_child_count(); ++i) {
Control *c = cast_to<Control>(edit_hb->get_child(i));
@@ -143,7 +155,7 @@ PackedInt32Array TextEditor::get_breakpoints() {
}
void TextEditor::reload_text() {
- ERR_FAIL_COND(text_file.is_null());
+ ERR_FAIL_COND(edited_res.is_null());
CodeEdit *te = code_editor->get_text_editor();
int column = te->get_caret_column();
@@ -151,7 +163,16 @@ void TextEditor::reload_text() {
int h = te->get_h_scroll();
int v = te->get_v_scroll();
- te->set_text(text_file->get_text());
+ Ref<TextFile> text_file = edited_res;
+ if (text_file != nullptr) {
+ te->set_text(text_file->get_text());
+ }
+
+ Ref<JSON> json_file = edited_res;
+ if (json_file != nullptr) {
+ te->set_text(json_file->get_parsed_text());
+ }
+
te->set_caret_line(row);
te->set_caret_column(column);
te->set_h_scroll(h);
@@ -166,6 +187,20 @@ void TextEditor::reload_text() {
void TextEditor::_validate_script() {
emit_signal(SNAME("name_changed"));
emit_signal(SNAME("edited_script_changed"));
+
+ Ref<JSON> json_file = edited_res;
+ if (json_file != nullptr) {
+ CodeEdit *te = code_editor->get_text_editor();
+
+ te->set_line_background_color(code_editor->get_error_pos().x, Color(0, 0, 0, 0));
+ code_editor->set_error("");
+
+ if (json_file->parse(te->get_text(), true) != OK) {
+ code_editor->set_error(json_file->get_error_message());
+ code_editor->set_error_pos(json_file->get_error_line(), 0);
+ te->set_line_background_color(code_editor->get_error_pos().x, EDITOR_GET("text_editor/theme/highlighting/mark_color"));
+ }
+ }
}
void TextEditor::_update_bookmark_list() {
@@ -204,13 +239,22 @@ void TextEditor::_bookmark_item_pressed(int p_idx) {
}
void TextEditor::apply_code() {
- text_file->set_text(code_editor->get_text_editor()->get_text());
+ Ref<TextFile> text_file = edited_res;
+ if (text_file != nullptr) {
+ text_file->set_text(code_editor->get_text_editor()->get_text());
+ }
+
+ Ref<JSON> json_file = edited_res;
+ if (json_file != nullptr) {
+ json_file->parse(code_editor->get_text_editor()->get_text(), true);
+ }
+ code_editor->get_text_editor()->get_syntax_highlighter()->update_cache();
}
bool TextEditor::is_unsaved() {
const bool unsaved =
code_editor->get_text_editor()->get_version() != code_editor->get_text_editor()->get_saved_version() ||
- text_file->get_path().is_empty(); // In memory.
+ edited_res->get_path().is_empty(); // In memory.
return unsaved;
}
@@ -431,7 +475,7 @@ void TextEditor::_convert_case(CodeTextEditor::CaseStyle p_case) {
}
static ScriptEditorBase *create_editor(const Ref<Resource> &p_resource) {
- if (Object::cast_to<TextFile>(*p_resource)) {
+ if (Object::cast_to<TextFile>(*p_resource) || Object::cast_to<JSON>(*p_resource)) {
return memnew(TextEditor);
}
return nullptr;
@@ -656,4 +700,5 @@ TextEditor::~TextEditor() {
}
void TextEditor::validate() {
+ this->code_editor->validate_script();
}
diff --git a/editor/plugins/text_editor.h b/editor/plugins/text_editor.h
index 6db81508b3..85e0fee627 100644
--- a/editor/plugins/text_editor.h
+++ b/editor/plugins/text_editor.h
@@ -41,7 +41,7 @@ class TextEditor : public ScriptEditorBase {
private:
CodeTextEditor *code_editor = nullptr;
- Ref<TextFile> text_file;
+ Ref<Resource> edited_res;
bool editor_enabled = false;
HBoxContainer *edit_hb = nullptr;
diff --git a/editor/plugins/theme_editor_plugin.cpp b/editor/plugins/theme_editor_plugin.cpp
index 14ff59b442..073adb467a 100644
--- a/editor/plugins/theme_editor_plugin.cpp
+++ b/editor/plugins/theme_editor_plugin.cpp
@@ -3705,82 +3705,13 @@ ThemeEditor::ThemeEditor() {
void ThemeEditorPlugin::edit(Object *p_node) {
if (Object::cast_to<Theme>(p_node)) {
theme_editor->edit(Object::cast_to<Theme>(p_node));
- } else if (Object::cast_to<Font>(p_node) || Object::cast_to<StyleBox>(p_node) || Object::cast_to<Texture2D>(p_node)) {
- // Do nothing, keep editing the existing theme.
} else {
theme_editor->edit(Ref<Theme>());
}
}
bool ThemeEditorPlugin::handles(Object *p_node) const {
- if (Object::cast_to<Theme>(p_node)) {
- return true;
- }
-
- Ref<Theme> edited_theme = theme_editor->get_edited_theme();
- if (edited_theme.is_null()) {
- return false;
- }
-
- // If we are editing a theme already and this particular resource happens to belong to it,
- // then we just keep editing it, despite not being able to directly handle it.
- // This only goes one layer deep, but if required this can be extended to support, say, Font inside of Font.
- bool belongs_to_theme = false;
-
- if (Object::cast_to<Font>(p_node)) {
- Ref<Font> font_item = Object::cast_to<Font>(p_node);
- List<StringName> types;
- List<StringName> names;
-
- edited_theme->get_font_type_list(&types);
- for (const StringName &E : types) {
- names.clear();
- edited_theme->get_font_list(E, &names);
-
- for (const StringName &F : names) {
- if (font_item == edited_theme->get_font(F, E)) {
- belongs_to_theme = true;
- break;
- }
- }
- }
- } else if (Object::cast_to<StyleBox>(p_node)) {
- Ref<StyleBox> stylebox_item = Object::cast_to<StyleBox>(p_node);
- List<StringName> types;
- List<StringName> names;
-
- edited_theme->get_stylebox_type_list(&types);
- for (const StringName &E : types) {
- names.clear();
- edited_theme->get_stylebox_list(E, &names);
-
- for (const StringName &F : names) {
- if (stylebox_item == edited_theme->get_stylebox(F, E)) {
- belongs_to_theme = true;
- break;
- }
- }
- }
- } else if (Object::cast_to<Texture2D>(p_node)) {
- Ref<Texture2D> icon_item = Object::cast_to<Texture2D>(p_node);
- List<StringName> types;
- List<StringName> names;
-
- edited_theme->get_icon_type_list(&types);
- for (const StringName &E : types) {
- names.clear();
- edited_theme->get_icon_list(E, &names);
-
- for (const StringName &F : names) {
- if (icon_item == edited_theme->get_icon(F, E)) {
- belongs_to_theme = true;
- break;
- }
- }
- }
- }
-
- return belongs_to_theme;
+ return Object::cast_to<Theme>(p_node) != nullptr;
}
void ThemeEditorPlugin::make_visible(bool p_visible) {
diff --git a/editor/plugins/tiles/tile_atlas_view.cpp b/editor/plugins/tiles/tile_atlas_view.cpp
index fd651dd507..43c6d1a48b 100644
--- a/editor/plugins/tiles/tile_atlas_view.cpp
+++ b/editor/plugins/tiles/tile_atlas_view.cpp
@@ -404,13 +404,16 @@ void TileAtlasView::_draw_background_right() {
}
void TileAtlasView::set_atlas_source(TileSet *p_tile_set, TileSetAtlasSource *p_tile_set_atlas_source, int p_source_id) {
- ERR_FAIL_COND(!p_tile_set);
- ERR_FAIL_COND(!p_tile_set_atlas_source);
+ tile_set = p_tile_set;
+ tile_set_atlas_source = p_tile_set_atlas_source;
+
+ if (!tile_set) {
+ return;
+ }
+
ERR_FAIL_COND(p_source_id < 0);
ERR_FAIL_COND(p_tile_set->get_source(p_source_id) != p_tile_set_atlas_source);
- tile_set = p_tile_set;
- tile_set_atlas_source = p_tile_set_atlas_source;
source_id = p_source_id;
// Show or hide the view.
diff --git a/editor/plugins/tiles/tile_map_editor.cpp b/editor/plugins/tiles/tile_map_editor.cpp
index f0a02a3768..4d9e2db682 100644
--- a/editor/plugins/tiles/tile_map_editor.cpp
+++ b/editor/plugins/tiles/tile_map_editor.cpp
@@ -571,14 +571,14 @@ bool TileMapEditorTilesPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p
case DRAG_TYPE_PAINT: {
HashMap<Vector2i, TileMapCell> to_draw = _draw_line(drag_start_mouse_pos, drag_last_mouse_pos, mpos, drag_erasing);
for (const KeyValue<Vector2i, TileMapCell> &E : to_draw) {
- if (!drag_erasing && E.value.source_id == TileSet::INVALID_SOURCE) {
- continue;
- }
Vector2i coords = E.key;
if (!drag_modified.has(coords)) {
drag_modified.insert(coords, tile_map->get_cell(tile_map_layer, coords));
+ if (!drag_erasing && E.value.source_id == TileSet::INVALID_SOURCE) {
+ continue;
+ }
+ tile_map->set_cell(tile_map_layer, coords, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile);
}
- tile_map->set_cell(tile_map_layer, coords, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile);
}
_fix_invalid_tiles_in_tile_map_selection();
} break;
@@ -588,14 +588,14 @@ bool TileMapEditorTilesPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p
if (!drag_modified.has(line[i])) {
HashMap<Vector2i, TileMapCell> to_draw = _draw_bucket_fill(line[i], bucket_contiguous_checkbox->is_pressed(), drag_erasing);
for (const KeyValue<Vector2i, TileMapCell> &E : to_draw) {
- if (!drag_erasing && E.value.source_id == TileSet::INVALID_SOURCE) {
- continue;
- }
Vector2i coords = E.key;
if (!drag_modified.has(coords)) {
drag_modified.insert(coords, tile_map->get_cell(tile_map_layer, coords));
+ if (!drag_erasing && E.value.source_id == TileSet::INVALID_SOURCE) {
+ continue;
+ }
+ tile_map->set_cell(tile_map_layer, coords, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile);
}
- tile_map->set_cell(tile_map_layer, coords, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile);
}
}
}
@@ -684,14 +684,14 @@ bool TileMapEditorTilesPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p
if (!drag_modified.has(line[i])) {
HashMap<Vector2i, TileMapCell> to_draw = _draw_bucket_fill(line[i], bucket_contiguous_checkbox->is_pressed(), drag_erasing);
for (const KeyValue<Vector2i, TileMapCell> &E : to_draw) {
- if (!drag_erasing && E.value.source_id == TileSet::INVALID_SOURCE) {
- continue;
- }
Vector2i coords = E.key;
if (!drag_modified.has(coords)) {
drag_modified.insert(coords, tile_map->get_cell(tile_map_layer, coords));
+ if (!drag_erasing && E.value.source_id == TileSet::INVALID_SOURCE) {
+ continue;
+ }
+ tile_map->set_cell(tile_map_layer, coords, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile);
}
- tile_map->set_cell(tile_map_layer, coords, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile);
}
}
}
@@ -1277,7 +1277,7 @@ void TileMapEditorTilesPlugin::_stop_dragging() {
tile_map->set_cell(tile_map_layer, kv.key, kv.value.source_id, kv.value.get_atlas_coords(), kv.value.alternative_tile);
}
- if (EditorNode::get_singleton()->is_resource_read_only(tile_set)) {
+ if (!EditorNode::get_singleton()->is_resource_read_only(tile_set)) {
// Creating a pattern in the pattern list.
select_last_pattern = true;
int new_pattern_index = tile_set->get_patterns_count();
@@ -2055,7 +2055,7 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() {
select_tool_button->set_flat(true);
select_tool_button->set_toggle_mode(true);
select_tool_button->set_button_group(tool_buttons_group);
- select_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/selection_tool", "Selection", Key::S));
+ select_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/selection_tool", TTR("Selection"), Key::S));
select_tool_button->connect("pressed", callable_mp(this, &TileMapEditorTilesPlugin::_update_toolbar));
tilemap_tiles_tools_buttons->add_child(select_tool_button);
@@ -2063,7 +2063,7 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() {
paint_tool_button->set_flat(true);
paint_tool_button->set_toggle_mode(true);
paint_tool_button->set_button_group(tool_buttons_group);
- paint_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/paint_tool", "Paint", Key::D));
+ paint_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/paint_tool", TTR("Paint"), Key::D));
paint_tool_button->set_tooltip_text(TTR("Shift: Draw line.") + "\n" + TTR("Shift+Ctrl: Draw rectangle."));
paint_tool_button->connect("pressed", callable_mp(this, &TileMapEditorTilesPlugin::_update_toolbar));
tilemap_tiles_tools_buttons->add_child(paint_tool_button);
@@ -2072,7 +2072,8 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() {
line_tool_button->set_flat(true);
line_tool_button->set_toggle_mode(true);
line_tool_button->set_button_group(tool_buttons_group);
- line_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/line_tool", "Line", Key::L));
+ // TRANSLATORS: This refers to the line tool in the tilemap editor.
+ line_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/line_tool", TTR("Line", "Tool"), Key::L));
line_tool_button->connect("pressed", callable_mp(this, &TileMapEditorTilesPlugin::_update_toolbar));
tilemap_tiles_tools_buttons->add_child(line_tool_button);
@@ -2080,7 +2081,7 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() {
rect_tool_button->set_flat(true);
rect_tool_button->set_toggle_mode(true);
rect_tool_button->set_button_group(tool_buttons_group);
- rect_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/rect_tool", "Rect", Key::R));
+ rect_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/rect_tool", TTR("Rect"), Key::R));
rect_tool_button->connect("pressed", callable_mp(this, &TileMapEditorTilesPlugin::_update_toolbar));
tilemap_tiles_tools_buttons->add_child(rect_tool_button);
@@ -2088,7 +2089,7 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() {
bucket_tool_button->set_flat(true);
bucket_tool_button->set_toggle_mode(true);
bucket_tool_button->set_button_group(tool_buttons_group);
- bucket_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/bucket_tool", "Bucket", Key::B));
+ bucket_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/bucket_tool", TTR("Bucket"), Key::B));
bucket_tool_button->connect("pressed", callable_mp(this, &TileMapEditorTilesPlugin::_update_toolbar));
tilemap_tiles_tools_buttons->add_child(bucket_tool_button);
toolbar->add_child(tilemap_tiles_tools_buttons);
@@ -2104,7 +2105,7 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() {
picker_button = memnew(Button);
picker_button->set_flat(true);
picker_button->set_toggle_mode(true);
- picker_button->set_shortcut(ED_SHORTCUT("tiles_editor/picker", "Picker", Key::P));
+ picker_button->set_shortcut(ED_SHORTCUT("tiles_editor/picker", TTR("Picker"), Key::P));
picker_button->set_tooltip_text(TTR("Alternatively hold Ctrl with other tools to pick tile."));
picker_button->connect("pressed", callable_mp(CanvasItemEditor::get_singleton(), &CanvasItemEditor::update_viewport));
tools_settings->add_child(picker_button);
@@ -2113,7 +2114,7 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() {
erase_button = memnew(Button);
erase_button->set_flat(true);
erase_button->set_toggle_mode(true);
- erase_button->set_shortcut(ED_SHORTCUT("tiles_editor/eraser", "Eraser", Key::E));
+ erase_button->set_shortcut(ED_SHORTCUT("tiles_editor/eraser", TTR("Eraser"), Key::E));
erase_button->set_tooltip_text(TTR("Alternatively use RMB to erase tiles."));
erase_button->connect("pressed", callable_mp(CanvasItemEditor::get_singleton(), &CanvasItemEditor::update_viewport));
tools_settings->add_child(erase_button);
@@ -2141,7 +2142,7 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() {
scatter_controls_container = memnew(HBoxContainer);
scatter_label = memnew(Label);
- scatter_label->set_tooltip_text(TTR("Defines the probability of painting nothing instead of a randomly selected tile."));
+ scatter_label->set_tooltip_text(TTR("Modifies the chance of painting nothing instead of a randomly selected tile."));
scatter_label->set_text(TTR("Scattering:"));
scatter_controls_container->add_child(scatter_label);
@@ -2149,7 +2150,7 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() {
scatter_spinbox->set_min(0.0);
scatter_spinbox->set_max(1000);
scatter_spinbox->set_step(0.001);
- scatter_spinbox->set_tooltip_text(TTR("Defines the probability of painting nothing instead of a randomly selected tile."));
+ scatter_spinbox->set_tooltip_text(TTR("Modifies the chance of painting nothing instead of a randomly selected tile."));
scatter_spinbox->get_line_edit()->add_theme_constant_override("minimum_character_width", 4);
scatter_spinbox->connect("value_changed", callable_mp(this, &TileMapEditorTilesPlugin::_on_scattering_spinbox_changed));
scatter_controls_container->add_child(scatter_spinbox);
@@ -3180,7 +3181,7 @@ void TileMapEditorTerrainsPlugin::_update_terrains_tree() {
terrain_set_tree_item->set_icon(0, main_vbox_container->get_theme_icon(SNAME("TerrainMatchSides"), SNAME("EditorIcons")));
matches = String(TTR("Matches Sides Only"));
}
- terrain_set_tree_item->set_text(0, vformat("Terrain Set %d (%s)", terrain_set_index, matches));
+ terrain_set_tree_item->set_text(0, vformat(TTR("Terrain Set %d (%s)"), terrain_set_index, matches));
terrain_set_tree_item->set_selectable(0, false);
for (int terrain_index = 0; terrain_index < tile_set->get_terrains_count(terrain_set_index); terrain_index++) {
@@ -3329,7 +3330,7 @@ TileMapEditorTerrainsPlugin::TileMapEditorTerrainsPlugin() {
main_vbox_container = memnew(VBoxContainer);
main_vbox_container->connect("tree_entered", callable_mp(this, &TileMapEditorTerrainsPlugin::_update_theme));
main_vbox_container->connect("theme_changed", callable_mp(this, &TileMapEditorTerrainsPlugin::_update_theme));
- main_vbox_container->set_name("Terrains");
+ main_vbox_container->set_name(TTR("Terrains"));
HSplitContainer *tilemap_tab_terrains = memnew(HSplitContainer);
tilemap_tab_terrains->set_h_size_flags(Control::SIZE_EXPAND_FILL);
@@ -3365,7 +3366,7 @@ TileMapEditorTerrainsPlugin::TileMapEditorTerrainsPlugin() {
paint_tool_button->set_toggle_mode(true);
paint_tool_button->set_button_group(tool_buttons_group);
paint_tool_button->set_pressed(true);
- paint_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/paint_tool", "Paint", Key::D));
+ paint_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/paint_tool", TTR("Paint"), Key::D));
paint_tool_button->connect("pressed", callable_mp(this, &TileMapEditorTerrainsPlugin::_update_toolbar));
tilemap_tiles_tools_buttons->add_child(paint_tool_button);
@@ -3373,7 +3374,7 @@ TileMapEditorTerrainsPlugin::TileMapEditorTerrainsPlugin() {
line_tool_button->set_flat(true);
line_tool_button->set_toggle_mode(true);
line_tool_button->set_button_group(tool_buttons_group);
- line_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/line_tool", "Line", Key::L));
+ line_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/line_tool", TTR("Line"), Key::L));
line_tool_button->connect("pressed", callable_mp(this, &TileMapEditorTerrainsPlugin::_update_toolbar));
tilemap_tiles_tools_buttons->add_child(line_tool_button);
@@ -3381,7 +3382,7 @@ TileMapEditorTerrainsPlugin::TileMapEditorTerrainsPlugin() {
rect_tool_button->set_flat(true);
rect_tool_button->set_toggle_mode(true);
rect_tool_button->set_button_group(tool_buttons_group);
- rect_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/rect_tool", "Rect", Key::R));
+ rect_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/rect_tool", TTR("Rect"), Key::R));
rect_tool_button->connect("pressed", callable_mp(this, &TileMapEditorTerrainsPlugin::_update_toolbar));
tilemap_tiles_tools_buttons->add_child(rect_tool_button);
@@ -3389,7 +3390,7 @@ TileMapEditorTerrainsPlugin::TileMapEditorTerrainsPlugin() {
bucket_tool_button->set_flat(true);
bucket_tool_button->set_toggle_mode(true);
bucket_tool_button->set_button_group(tool_buttons_group);
- bucket_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/bucket_tool", "Bucket", Key::B));
+ bucket_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/bucket_tool", TTR("Bucket"), Key::B));
bucket_tool_button->connect("pressed", callable_mp(this, &TileMapEditorTerrainsPlugin::_update_toolbar));
tilemap_tiles_tools_buttons->add_child(bucket_tool_button);
@@ -3406,7 +3407,7 @@ TileMapEditorTerrainsPlugin::TileMapEditorTerrainsPlugin() {
picker_button = memnew(Button);
picker_button->set_flat(true);
picker_button->set_toggle_mode(true);
- picker_button->set_shortcut(ED_SHORTCUT("tiles_editor/picker", "Picker", Key::P));
+ picker_button->set_shortcut(ED_SHORTCUT("tiles_editor/picker", TTR("Picker"), Key::P));
picker_button->connect("pressed", callable_mp(CanvasItemEditor::get_singleton(), &CanvasItemEditor::update_viewport));
tools_settings->add_child(picker_button);
@@ -3414,7 +3415,7 @@ TileMapEditorTerrainsPlugin::TileMapEditorTerrainsPlugin() {
erase_button = memnew(Button);
erase_button->set_flat(true);
erase_button->set_toggle_mode(true);
- erase_button->set_shortcut(ED_SHORTCUT("tiles_editor/eraser", "Eraser", Key::E));
+ erase_button->set_shortcut(ED_SHORTCUT("tiles_editor/eraser", TTR("Eraser"), Key::E));
erase_button->connect("pressed", callable_mp(CanvasItemEditor::get_singleton(), &CanvasItemEditor::update_viewport));
tools_settings->add_child(erase_button);
diff --git a/editor/plugins/tiles/tile_set_atlas_source_editor.cpp b/editor/plugins/tiles/tile_set_atlas_source_editor.cpp
index 912fdb03a9..fcefbb7d06 100644
--- a/editor/plugins/tiles/tile_set_atlas_source_editor.cpp
+++ b/editor/plugins/tiles/tile_set_atlas_source_editor.cpp
@@ -34,6 +34,7 @@
#include "editor/editor_inspector.h"
#include "editor/editor_node.h"
+#include "editor/editor_property_name_processor.h"
#include "editor/editor_scale.h"
#include "editor/editor_settings.h"
#include "editor/editor_undo_redo_manager.h"
@@ -106,13 +107,13 @@ bool TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::_get(const StringN
void TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::_get_property_list(List<PropertyInfo> *p_list) const {
p_list->push_back(PropertyInfo(Variant::NIL, TTR("Atlas"), PROPERTY_HINT_NONE, String(), PROPERTY_USAGE_CATEGORY));
- p_list->push_back(PropertyInfo(Variant::INT, "id", PROPERTY_HINT_RANGE, "0," + itos(INT_MAX) + ",1"));
- p_list->push_back(PropertyInfo(Variant::STRING, "name", PROPERTY_HINT_NONE, ""));
- p_list->push_back(PropertyInfo(Variant::OBJECT, "texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D"));
- p_list->push_back(PropertyInfo(Variant::VECTOR2I, "margins", PROPERTY_HINT_NONE, "suffix:px"));
- p_list->push_back(PropertyInfo(Variant::VECTOR2I, "separation", PROPERTY_HINT_NONE));
- p_list->push_back(PropertyInfo(Variant::VECTOR2I, "texture_region_size", PROPERTY_HINT_NONE, "suffix:px"));
- p_list->push_back(PropertyInfo(Variant::BOOL, "use_texture_padding", PROPERTY_HINT_NONE, ""));
+ p_list->push_back(PropertyInfo(Variant::INT, PNAME("id"), PROPERTY_HINT_RANGE, "0," + itos(INT_MAX) + ",1"));
+ p_list->push_back(PropertyInfo(Variant::STRING, PNAME("name")));
+ p_list->push_back(PropertyInfo(Variant::OBJECT, PNAME("texture"), PROPERTY_HINT_RESOURCE_TYPE, "Texture2D"));
+ p_list->push_back(PropertyInfo(Variant::VECTOR2I, PNAME("margins"), PROPERTY_HINT_NONE, "suffix:px"));
+ p_list->push_back(PropertyInfo(Variant::VECTOR2I, PNAME("separation")));
+ p_list->push_back(PropertyInfo(Variant::VECTOR2I, PNAME("texture_region_size"), PROPERTY_HINT_NONE, "suffix:px"));
+ p_list->push_back(PropertyInfo(Variant::BOOL, PNAME("use_texture_padding")));
}
void TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::_bind_methods() {
@@ -120,10 +121,9 @@ void TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::_bind_methods() {
}
void TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::edit(Ref<TileSet> p_tile_set, TileSetAtlasSource *p_tile_set_atlas_source, int p_source_id) {
- ERR_FAIL_COND(!p_tile_set.is_valid());
ERR_FAIL_COND(!p_tile_set_atlas_source);
ERR_FAIL_COND(p_source_id < 0);
- ERR_FAIL_COND(p_tile_set->get_source(p_source_id) != p_tile_set_atlas_source);
+ ERR_FAIL_COND(p_tile_set.is_valid() && p_tile_set->get_source(p_source_id) != p_tile_set_atlas_source);
if (p_tile_set == tile_set && p_tile_set_atlas_source == tile_set_atlas_source && p_source_id == source_id) {
return;
@@ -393,11 +393,11 @@ void TileSetAtlasSourceEditor::AtlasTileProxyObject::_get_property_list(List<Pro
if (tiles.size() == 1) {
if (tiles.front()->get().alternative == 0) {
p_list->push_back(PropertyInfo(Variant::NIL, TTR("Base Tile"), PROPERTY_HINT_NONE, String(), PROPERTY_USAGE_CATEGORY));
- p_list->push_back(PropertyInfo(Variant::VECTOR2I, "atlas_coords"));
- p_list->push_back(PropertyInfo(Variant::VECTOR2I, "size_in_atlas"));
+ p_list->push_back(PropertyInfo(Variant::VECTOR2I, PNAME("atlas_coords")));
+ p_list->push_back(PropertyInfo(Variant::VECTOR2I, PNAME("size_in_atlas")));
} else {
p_list->push_back(PropertyInfo(Variant::NIL, TTR("Alternative Tile"), PROPERTY_HINT_NONE, String(), PROPERTY_USAGE_CATEGORY));
- p_list->push_back(PropertyInfo(Variant::INT, "alternative_id"));
+ p_list->push_back(PropertyInfo(Variant::INT, PNAME("alternative_id")));
}
} else {
p_list->push_back(PropertyInfo(Variant::NIL, TTR("Tiles"), PROPERTY_HINT_NONE, String(), PROPERTY_USAGE_CATEGORY));
@@ -414,17 +414,17 @@ void TileSetAtlasSourceEditor::AtlasTileProxyObject::_get_property_list(List<Pro
}
if (all_alternatve_id_zero) {
- p_list->push_back(PropertyInfo(Variant::NIL, "Animation", PROPERTY_HINT_NONE, "animation_", PROPERTY_USAGE_GROUP));
- p_list->push_back(PropertyInfo(Variant::INT, "animation_columns", PROPERTY_HINT_NONE, ""));
- p_list->push_back(PropertyInfo(Variant::VECTOR2I, "animation_separation", PROPERTY_HINT_NONE, ""));
- p_list->push_back(PropertyInfo(Variant::FLOAT, "animation_speed", PROPERTY_HINT_NONE, ""));
- p_list->push_back(PropertyInfo(Variant::INT, "animation_frames_count", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_ARRAY, "Frames,animation_frame_"));
+ p_list->push_back(PropertyInfo(Variant::NIL, GNAME("Animation", "animation_"), PROPERTY_HINT_NONE, "animation_", PROPERTY_USAGE_GROUP));
+ p_list->push_back(PropertyInfo(Variant::INT, PNAME("animation_columns")));
+ p_list->push_back(PropertyInfo(Variant::VECTOR2I, PNAME("animation_separation")));
+ p_list->push_back(PropertyInfo(Variant::FLOAT, PNAME("animation_speed")));
+ p_list->push_back(PropertyInfo(Variant::INT, PNAME("animation_frames_count"), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_ARRAY, "Frames,animation_frame_"));
// Not optimal, but returns value for the first tile. This is similar to what MultiNodeEdit does.
if (tile_set_atlas_source->get_tile_animation_frames_count(tiles.front()->get().tile) == 1) {
p_list->push_back(PropertyInfo(Variant::FLOAT, "animation_frame_0/duration", PROPERTY_HINT_NONE, "suffix:s", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_READ_ONLY));
} else {
for (int i = 0; i < tile_set_atlas_source->get_tile_animation_frames_count(tiles.front()->get().tile); i++) {
- p_list->push_back(PropertyInfo(Variant::FLOAT, vformat("animation_frame_%d/duration", i), PROPERTY_HINT_NONE, "suffix:s"));
+ p_list->push_back(PropertyInfo(Variant::FLOAT, vformat("animation_frame_%d/%s", i, PNAME("duration")), PROPERTY_HINT_NONE, "suffix:s"));
}
}
}
@@ -611,6 +611,10 @@ void TileSetAtlasSourceEditor::_update_tile_data_editors() {
tile_data_editors_tree->clear();
+ if (tile_set.is_null()) {
+ return;
+ }
+
TreeItem *root = tile_data_editors_tree->create_item();
TreeItem *group;
@@ -638,9 +642,9 @@ void TileSetAtlasSourceEditor::_update_tile_data_editors() {
// List of editors.
// --- Rendering ---
- ADD_TILE_DATA_EDITOR_GROUP("Rendering");
+ ADD_TILE_DATA_EDITOR_GROUP(TTR("Rendering"));
- ADD_TILE_DATA_EDITOR(group, "Texture Origin", "texture_origin");
+ ADD_TILE_DATA_EDITOR(group, TTR("Texture Origin"), "texture_origin");
if (!tile_data_editors.has("texture_origin")) {
TileDataTextureOriginEditor *tile_data_texture_origin_editor = memnew(TileDataTextureOriginEditor);
tile_data_texture_origin_editor->hide();
@@ -650,7 +654,7 @@ void TileSetAtlasSourceEditor::_update_tile_data_editors() {
tile_data_editors["texture_origin"] = tile_data_texture_origin_editor;
}
- ADD_TILE_DATA_EDITOR(group, "Modulate", "modulate");
+ ADD_TILE_DATA_EDITOR(group, TTR("Modulate"), "modulate");
if (!tile_data_editors.has("modulate")) {
TileDataDefaultEditor *tile_data_modulate_editor = memnew(TileDataDefaultEditor());
tile_data_modulate_editor->hide();
@@ -660,7 +664,7 @@ void TileSetAtlasSourceEditor::_update_tile_data_editors() {
tile_data_editors["modulate"] = tile_data_modulate_editor;
}
- ADD_TILE_DATA_EDITOR(group, "Z Index", "z_index");
+ ADD_TILE_DATA_EDITOR(group, TTR("Z Index"), "z_index");
if (!tile_data_editors.has("z_index")) {
TileDataDefaultEditor *tile_data_z_index_editor = memnew(TileDataDefaultEditor());
tile_data_z_index_editor->hide();
@@ -670,7 +674,7 @@ void TileSetAtlasSourceEditor::_update_tile_data_editors() {
tile_data_editors["z_index"] = tile_data_z_index_editor;
}
- ADD_TILE_DATA_EDITOR(group, "Y Sort Origin", "y_sort_origin");
+ ADD_TILE_DATA_EDITOR(group, TTR("Y Sort Origin"), "y_sort_origin");
if (!tile_data_editors.has("y_sort_origin")) {
TileDataYSortEditor *tile_data_y_sort_editor = memnew(TileDataYSortEditor);
tile_data_y_sort_editor->hide();
@@ -681,7 +685,7 @@ void TileSetAtlasSourceEditor::_update_tile_data_editors() {
}
for (int i = 0; i < tile_set->get_occlusion_layers_count(); i++) {
- ADD_TILE_DATA_EDITOR(group, vformat("Occlusion Layer %d", i), vformat("occlusion_layer_%d", i));
+ ADD_TILE_DATA_EDITOR(group, vformat(TTR("Occlusion Layer %d"), i), vformat("occlusion_layer_%d", i));
if (!tile_data_editors.has(vformat("occlusion_layer_%d", i))) {
TileDataOcclusionShapeEditor *tile_data_occlusion_shape_editor = memnew(TileDataOcclusionShapeEditor());
tile_data_occlusion_shape_editor->hide();
@@ -697,7 +701,7 @@ void TileSetAtlasSourceEditor::_update_tile_data_editors() {
}
// --- Rendering ---
- ADD_TILE_DATA_EDITOR(root, "Terrains", "terrain_set");
+ ADD_TILE_DATA_EDITOR(root, TTR("Terrains"), "terrain_set");
if (!tile_data_editors.has("terrain_set")) {
TileDataTerrainsEditor *tile_data_terrains_editor = memnew(TileDataTerrainsEditor);
tile_data_terrains_editor->hide();
@@ -707,7 +711,7 @@ void TileSetAtlasSourceEditor::_update_tile_data_editors() {
}
// --- Miscellaneous ---
- ADD_TILE_DATA_EDITOR(root, "Probability", "probability");
+ ADD_TILE_DATA_EDITOR(root, TTR("Probability"), "probability");
if (!tile_data_editors.has("probability")) {
TileDataDefaultEditor *tile_data_probability_editor = memnew(TileDataDefaultEditor());
tile_data_probability_editor->hide();
@@ -718,9 +722,9 @@ void TileSetAtlasSourceEditor::_update_tile_data_editors() {
}
// --- Physics ---
- ADD_TILE_DATA_EDITOR_GROUP("Physics");
+ ADD_TILE_DATA_EDITOR_GROUP(TTR("Physics"));
for (int i = 0; i < tile_set->get_physics_layers_count(); i++) {
- ADD_TILE_DATA_EDITOR(group, vformat("Physics Layer %d", i), vformat("physics_layer_%d", i));
+ ADD_TILE_DATA_EDITOR(group, vformat(TTR("Physics Layer %d"), i), vformat("physics_layer_%d", i));
if (!tile_data_editors.has(vformat("physics_layer_%d", i))) {
TileDataCollisionEditor *tile_data_collision_editor = memnew(TileDataCollisionEditor());
tile_data_collision_editor->hide();
@@ -736,9 +740,9 @@ void TileSetAtlasSourceEditor::_update_tile_data_editors() {
}
// --- Navigation ---
- ADD_TILE_DATA_EDITOR_GROUP("Navigation");
+ ADD_TILE_DATA_EDITOR_GROUP(TTR("Navigation"));
for (int i = 0; i < tile_set->get_navigation_layers_count(); i++) {
- ADD_TILE_DATA_EDITOR(group, vformat("Navigation Layer %d", i), vformat("navigation_layer_%d", i));
+ ADD_TILE_DATA_EDITOR(group, vformat(TTR("Navigation Layer %d"), i), vformat("navigation_layer_%d", i));
if (!tile_data_editors.has(vformat("navigation_layer_%d", i))) {
TileDataNavigationEditor *tile_data_navigation_editor = memnew(TileDataNavigationEditor());
tile_data_navigation_editor->hide();
@@ -754,14 +758,14 @@ void TileSetAtlasSourceEditor::_update_tile_data_editors() {
}
// --- Custom Data ---
- ADD_TILE_DATA_EDITOR_GROUP("Custom Data");
+ ADD_TILE_DATA_EDITOR_GROUP(TTR("Custom Data"));
for (int i = 0; i < tile_set->get_custom_data_layers_count(); i++) {
String editor_name = vformat("custom_data_%d", i);
String prop_name = tile_set->get_custom_data_layer_name(i);
Variant::Type prop_type = tile_set->get_custom_data_layer_type(i);
if (prop_name.is_empty()) {
- ADD_TILE_DATA_EDITOR(group, vformat("Custom Data %d", i), editor_name);
+ ADD_TILE_DATA_EDITOR(group, vformat(TTR("Custom Data %d"), i), editor_name);
} else {
ADD_TILE_DATA_EDITOR(group, prop_name, editor_name);
}
@@ -919,6 +923,10 @@ void TileSetAtlasSourceEditor::_update_atlas_view() {
alternative_tiles_control->get_child(i)->queue_free();
}
+ if (tile_set.is_null()) {
+ return;
+ }
+
Vector2i pos;
Vector2 texture_region_base_size = tile_set_atlas_source->get_texture_region_size();
int texture_region_base_size_min = MIN(texture_region_base_size.x, texture_region_base_size.y);
@@ -2407,6 +2415,14 @@ void TileSetAtlasSourceEditor::_notification(int p_what) {
}
}
} break;
+
+ case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
+ if (EditorSettings::get_singleton()->check_changed_settings_in_group("interface/editor/localize_settings")) {
+ EditorPropertyNameProcessor::Style style = EditorPropertyNameProcessor::get_singleton()->get_settings_style();
+ atlas_source_inspector->set_property_name_style(style);
+ tile_inspector->set_property_name_style(style);
+ }
+ } break;
}
}
@@ -2476,6 +2492,7 @@ TileSetAtlasSourceEditor::TileSetAtlasSourceEditor() {
tile_inspector->edit(tile_proxy_object);
tile_inspector->set_use_folding(true);
tile_inspector->connect("property_selected", callable_mp(this, &TileSetAtlasSourceEditor::_inspector_property_selected));
+ tile_inspector->set_property_name_style(EditorPropertyNameProcessor::get_singleton()->get_settings_style());
middle_vbox_container->add_child(tile_inspector);
tile_inspector_no_tile_selected_label = memnew(Label);
@@ -2527,6 +2544,7 @@ TileSetAtlasSourceEditor::TileSetAtlasSourceEditor() {
atlas_source_inspector->set_v_size_flags(SIZE_EXPAND_FILL);
atlas_source_inspector->set_show_categories(true);
atlas_source_inspector->edit(atlas_source_proxy_object);
+ atlas_source_inspector->set_property_name_style(EditorPropertyNameProcessor::get_singleton()->get_settings_style());
middle_vbox_container->add_child(atlas_source_inspector);
// -- Right side --
diff --git a/editor/plugins/tiles/tile_set_editor.cpp b/editor/plugins/tiles/tile_set_editor.cpp
index 39d17c718e..358cc47977 100644
--- a/editor/plugins/tiles/tile_set_editor.cpp
+++ b/editor/plugins/tiles/tile_set_editor.cpp
@@ -687,7 +687,7 @@ void TileSetEditor::_undo_redo_inspector_callback(Object *p_undo_redo, Object *p
void TileSetEditor::edit(Ref<TileSet> p_tile_set) {
bool new_read_only_state = false;
- if (tile_set.is_valid()) {
+ if (p_tile_set.is_valid()) {
new_read_only_state = EditorNode::get_singleton()->is_resource_read_only(p_tile_set);
}
diff --git a/editor/plugins/tiles/tile_set_scenes_collection_source_editor.cpp b/editor/plugins/tiles/tile_set_scenes_collection_source_editor.cpp
index cc276597fa..101ec5f66c 100644
--- a/editor/plugins/tiles/tile_set_scenes_collection_source_editor.cpp
+++ b/editor/plugins/tiles/tile_set_scenes_collection_source_editor.cpp
@@ -32,6 +32,7 @@
#include "editor/editor_file_system.h"
#include "editor/editor_node.h"
+#include "editor/editor_property_name_processor.h"
#include "editor/editor_resource_preview.h"
#include "editor/editor_scale.h"
#include "editor/editor_settings.h"
@@ -362,6 +363,14 @@ void TileSetScenesCollectionSourceEditor::_notification(int p_what) {
_update_scenes_list();
_update_action_buttons();
} break;
+
+ case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
+ if (EditorSettings::get_singleton()->check_changed_settings_in_group("interface/editor/localize_settings")) {
+ EditorPropertyNameProcessor::Style style = EditorPropertyNameProcessor::get_singleton()->get_settings_style();
+ scenes_collection_source_inspector->set_property_name_style(style);
+ tile_inspector->set_property_name_style(style);
+ }
+ } break;
}
}
@@ -503,6 +512,7 @@ TileSetScenesCollectionSourceEditor::TileSetScenesCollectionSourceEditor() {
scenes_collection_source_inspector = memnew(EditorInspector);
scenes_collection_source_inspector->set_vertical_scroll_mode(ScrollContainer::SCROLL_MODE_DISABLED);
scenes_collection_source_inspector->edit(scenes_collection_source_proxy_object);
+ scenes_collection_source_inspector->set_property_name_style(EditorPropertyNameProcessor::get_singleton()->get_settings_style());
middle_vbox_container->add_child(scenes_collection_source_inspector);
// Tile inspector.
@@ -519,6 +529,7 @@ TileSetScenesCollectionSourceEditor::TileSetScenesCollectionSourceEditor() {
tile_inspector->set_vertical_scroll_mode(ScrollContainer::SCROLL_MODE_DISABLED);
tile_inspector->edit(tile_proxy_object);
tile_inspector->set_use_folding(true);
+ tile_inspector->set_property_name_style(EditorPropertyNameProcessor::get_singleton()->get_settings_style());
middle_vbox_container->add_child(tile_inspector);
// Scenes list.
diff --git a/editor/plugins/tiles/tiles_editor_plugin.cpp b/editor/plugins/tiles/tiles_editor_plugin.cpp
index fad36660d9..78522dfa73 100644
--- a/editor/plugins/tiles/tiles_editor_plugin.cpp
+++ b/editor/plugins/tiles/tiles_editor_plugin.cpp
@@ -117,7 +117,7 @@ void TilesEditorPlugin::_thread() {
tile_map->set_position(-(scale * encompassing_rect.get_center()) + thumbnail_size2 / 2);
// Add the viewport at the last moment to avoid rendering too early.
- EditorNode::get_singleton()->add_child(viewport);
+ EditorNode::get_singleton()->call_deferred("add_child", viewport);
RS::get_singleton()->connect(SNAME("frame_pre_draw"), callable_mp(const_cast<TilesEditorPlugin *>(this), &TilesEditorPlugin::_preview_frame_started), Object::CONNECT_ONE_SHOT);
diff --git a/editor/project_converter_3_to_4.cpp b/editor/project_converter_3_to_4.cpp
index 706466a974..d1f3c3902a 100644
--- a/editor/project_converter_3_to_4.cpp
+++ b/editor/project_converter_3_to_4.cpp
@@ -32,1781 +32,19 @@
#ifndef DISABLE_DEPRECATED
-const int ERROR_CODE = 77;
-
#include "modules/modules_enabled.gen.h" // For regex.
#ifdef MODULE_REGEX_ENABLED
-#include "modules/regex/regex.h"
-
+#include "core/error/error_macros.h"
#include "core/io/dir_access.h"
+#include "core/io/file_access.h"
+#include "core/object/ref_counted.h"
#include "core/os/time.h"
#include "core/templates/hash_map.h"
#include "core/templates/list.h"
-#include "core/templates/local_vector.h"
-
-const char *ProjectConverter3To4::enum_renames[][2] = {
- //// constants
- { "TYPE_COLOR_ARRAY", "TYPE_PACKED_COLOR_ARRAY" },
- { "TYPE_FLOAT64_ARRAY", "TYPE_PACKED_FLOAT64_ARRAY" },
- { "TYPE_INT64_ARRAY", "TYPE_PACKED_INT64_ARRAY" },
- { "TYPE_INT_ARRAY", "TYPE_PACKED_INT32_ARRAY" },
- { "TYPE_QUAT", "TYPE_QUATERNION" },
- { "TYPE_RAW_ARRAY", "TYPE_PACKED_BYTE_ARRAY" },
- { "TYPE_REAL", "TYPE_FLOAT" },
- { "TYPE_REAL_ARRAY", "TYPE_PACKED_FLOAT32_ARRAY" },
- { "TYPE_STRING_ARRAY", "TYPE_PACKED_STRING_ARRAY" },
- { "TYPE_TRANSFORM", "TYPE_TRANSFORM3D" },
- { "TYPE_VECTOR2_ARRAY", "TYPE_PACKED_VECTOR2_ARRAY" },
- { "TYPE_VECTOR3_ARRAY", "TYPE_PACKED_VECTOR3_ARRAY" },
-
- // {"FLAG_MAX", "PARTICLE_FLAG_MAX"}, // CPUParticles2D - used in more classes
- { "ALIGN_BEGIN", "ALIGNMENT_BEGIN" }, //AspectRatioContainer
- { "ALIGN_CENTER", "ALIGNMENT_CENTER" }, //AspectRatioContainer
- { "ALIGN_END", "ALIGNMENT_END" }, //AspectRatioContainer
- { "ARRAY_COMPRESS_BASE", "ARRAY_COMPRESS_FLAGS_BASE" }, // Mesh
- { "ARVR_AR", "XR_AR" }, // XRInterface
- { "ARVR_EXCESSIVE_MOTION", "XR_EXCESSIVE_MOTION" }, // XRInterface
- { "ARVR_EXTERNAL", "XR_EXTERNAL" }, // XRInterface
- { "ARVR_INSUFFICIENT_FEATURES", "XR_INSUFFICIENT_FEATURES" }, // XRInterface
- { "ARVR_MONO", "XR_MONO" }, // XRInterface
- { "ARVR_NONE", "XR_NONE" }, // XRInterface
- { "ARVR_NORMAL_TRACKING", "XR_NORMAL_TRACKING" }, // XRInterface
- { "ARVR_NOT_TRACKING", "XR_NOT_TRACKING" }, // XRInterface
- { "ARVR_STEREO", "XR_STEREO" }, // XRInterface
- { "ARVR_UNKNOWN_TRACKING", "XR_UNKNOWN_TRACKING" }, // XRInterface
- { "BAKE_ERROR_INVALID_MESH", "BAKE_ERROR_MESHES_INVALID" }, // LightmapGI
- { "BODY_MODE_CHARACTER", "BODY_MODE_RIGID_LINEAR" }, // PhysicsServer
- { "BUTTON_LEFT", "MOUSE_BUTTON_LEFT" }, // Globals
- { "BUTTON_MASK_LEFT", "MOUSE_BUTTON_MASK_LEFT" }, // Globals
- { "BUTTON_MASK_MIDDLE", "MOUSE_BUTTON_MASK_MIDDLE" }, // Globals
- { "BUTTON_MASK_RIGHT", "MOUSE_BUTTON_MASK_RIGHT" }, // Globals
- { "BUTTON_MASK_XBUTTON1", "MOUSE_BUTTON_MASK_XBUTTON1" }, // Globals
- { "BUTTON_MASK_XBUTTON2", "MOUSE_BUTTON_MASK_XBUTTON2" }, // Globals
- { "BUTTON_MIDDLE", "MOUSE_BUTTON_MIDDLE" }, // Globals
- { "BUTTON_RIGHT", "MOUSE_BUTTON_RIGHT" }, // Globals
- { "BUTTON_WHEEL_DOWN", "MOUSE_BUTTON_WHEEL_DOWN" }, // Globals
- { "BUTTON_WHEEL_LEFT", "MOUSE_BUTTON_WHEEL_LEFT" }, // Globals
- { "BUTTON_WHEEL_RIGHT", "MOUSE_BUTTON_WHEEL_RIGHT" }, // Globals
- { "BUTTON_WHEEL_UP", "MOUSE_BUTTON_WHEEL_UP" }, // Globals
- { "BUTTON_XBUTTON1", "MOUSE_BUTTON_XBUTTON1" }, // Globals
- { "BUTTON_XBUTTON2", "MOUSE_BUTTON_XBUTTON2" }, // Globals
- { "CLEAR_MODE_ONLY_NEXT_FRAME", "CLEAR_MODE_ONCE" }, // SubViewport
- { "COMPRESS_PVRTC4", "COMPRESS_PVRTC1_4" }, // Image
- { "CONNECT_ONESHOT", "CONNECT_ONE_SHOT" }, // Object
- { "CONTAINER_PROPERTY_EDITOR_BOTTOM", "CONTAINER_INSPECTOR_BOTTOM" }, // EditorPlugin
- { "CUBEMAP_BACK", "CUBEMAP_LAYER_BACK" }, // RenderingServer
- { "CUBEMAP_BOTTOM", "CUBEMAP_LAYER_BOTTOM" }, // RenderingServer
- { "CUBEMAP_FRONT", "CUBEMAP_LAYER_FRONT" }, // RenderingServer
- { "CUBEMAP_LEFT", "CUBEMAP_LAYER_LEFT" }, // RenderingServer
- { "CUBEMAP_RIGHT", "CUBEMAP_LAYER_RIGHT" }, // RenderingServer
- { "CUBEMAP_TOP", "CUBEMAP_LAYER_TOP" }, // RenderingServer
- { "DAMPED_STRING_DAMPING", "DAMPED_SPRING_DAMPING" }, // PhysicsServer2D
- { "DAMPED_STRING_REST_LENGTH", "DAMPED_SPRING_REST_LENGTH" }, // PhysicsServer2D
- { "DAMPED_STRING_STIFFNESS", "DAMPED_SPRING_STIFFNESS" }, // PhysicsServer2D
- { "FLAG_ALIGN_Y_TO_VELOCITY", "PARTICLE_FLAG_ALIGN_Y_TO_VELOCITY" }, // CPUParticles2D
- { "FLAG_DISABLE_Z", "PARTICLE_FLAG_DISABLE_Z" }, // CPUParticles2D
- { "FLAG_ROTATE_Y", "PARTICLE_FLAG_ROTATE_Y" }, // CPUParticles2D
- { "FLAG_USE_BAKED_LIGHT", "GI_MODE_BAKED" }, // GeometryInstance3D
- { "FORMAT_PVRTC2", "FORMAT_PVRTC1_2" }, // Image
- { "FORMAT_PVRTC2A", "FORMAT_PVRTC1_2A" }, // Image
- { "FORMAT_PVRTC4", "FORMAT_PVRTC1_4" }, // Image
- { "FORMAT_PVRTC4A", "FORMAT_PVRTC1_4A" }, // Image
- { "FUNC_FRAC", "FUNC_FRACT" }, // VisualShaderNodeVectorFunc
- { "INSTANCE_LIGHTMAP_CAPTURE", "INSTANCE_LIGHTMAP" }, // RenderingServer
- { "JOINT_6DOF", "JOINT_TYPE_6DOF" }, // PhysicsServer3D
- { "JOINT_CONE_TWIST", "JOINT_TYPE_CONE_TWIST" }, // PhysicsServer3D
- { "JOINT_DAMPED_SPRING", "JOINT_TYPE_DAMPED_SPRING" }, // PhysicsServer2D
- { "JOINT_GROOVE", "JOINT_TYPE_GROOVE" }, // PhysicsServer2D
- { "JOINT_HINGE", "JOINT_TYPE_HINGE" }, // PhysicsServer3D
- { "JOINT_PIN", "JOINT_TYPE_PIN" }, // PhysicsServer2D
- { "JOINT_SLIDER", "JOINT_TYPE_SLIDER" }, // PhysicsServer3D
- { "KEY_CONTROL", "KEY_CTRL" }, // Globals
- { "LOOP_PING_PONG", "LOOP_PINGPONG" }, // AudioStreamWAV
- { "MODE_KINEMATIC", "FREEZE_MODE_KINEMATIC" }, // RigidBody
- { "MODE_OPEN_ANY", "FILE_MODE_OPEN_ANY" }, // FileDialog
- { "MODE_OPEN_DIR", "FILE_MODE_OPEN_DIR" }, // FileDialog
- { "MODE_OPEN_FILE", "FILE_MODE_OPEN_FILE" }, // FileDialog
- { "MODE_OPEN_FILES", "FILE_MODE_OPEN_FILES" }, // FileDialog
- { "MODE_SAVE_FILE", "FILE_MODE_SAVE_FILE" }, // FileDialog
- { "MODE_STATIC", "FREEZE_MODE_STATIC" }, // RigidBody
- { "NOTIFICATION_APP_PAUSED", "NOTIFICATION_APPLICATION_PAUSED" }, // MainLoop
- { "NOTIFICATION_APP_RESUMED", "NOTIFICATION_APPLICATION_RESUMED" }, // MainLoop
- { "NOTIFICATION_INSTANCED", "NOTIFICATION_SCENE_INSTANTIATED" }, // Node
- { "NOTIFICATION_PATH_CHANGED", "NOTIFICATION_PATH_RENAMED" }, //Node
- { "NOTIFICATION_WM_FOCUS_IN", "NOTIFICATION_APPLICATION_FOCUS_IN" }, // MainLoop
- { "NOTIFICATION_WM_FOCUS_OUT", "NOTIFICATION_APPLICATION_FOCUS_OUT" }, // MainLoop
- { "NOTIFICATION_WM_UNFOCUS_REQUEST", "NOTIFICATION_WM_WINDOW_FOCUS_OUT" }, //Node
- { "PAUSE_MODE_INHERIT", "PROCESS_MODE_INHERIT" }, // Node
- { "PAUSE_MODE_PROCESS", "PROCESS_MODE_ALWAYS" }, // Node
- { "PAUSE_MODE_STOP", "PROCESS_MODE_PAUSABLE" }, // Node
- { "RENDER_DRAW_CALLS_IN_FRAME", "RENDER_TOTAL_DRAW_CALLS_IN_FRAME" }, // Performance
- { "RENDER_OBJECTS_IN_FRAME", "RENDER_TOTAL_OBJECTS_IN_FRAME" }, // Performance
- { "SIDE_BOTTOM", "MARGIN_BOTTOM" }, // Globals
- { "SIDE_LEFT", "MARGIN_LEFT" }, // Globals
- { "SIDE_RIGHT", "MARGIN_RIGHT" }, // Globals
- { "SIDE_TOP", "MARGIN_TOP" }, // Globals
- { "TEXTURE_TYPE_2D_ARRAY", "TEXTURE_LAYERED_2D_ARRAY" }, // RenderingServer
- { "TEXTURE_TYPE_CUBEMAP", "TEXTURE_LAYERED_CUBEMAP_ARRAY" }, // RenderingServer
- { "TRACKER_LEFT_HAND", "TRACKER_HAND_LEFT" }, // XRPositionalTracker
- { "TRACKER_RIGHT_HAND", "TRACKER_HAND_RIGHT" }, // XRPositionalTracker
- { "TYPE_NORMALMAP", "TYPE_NORMAL_MAP" }, // VisualShaderNodeCubemap
-
- /// enums
- { "AlignMode", "AlignmentMode" }, //AspectRatioContainer
- { "AnimationProcessMode", "AnimationProcessCallback" }, // AnimationTree, AnimationPlayer
- { "Camera2DProcessMode", "Camera2DProcessCallback" }, // Camera2D
- { "CubeMapSide", "CubeMapLayer" }, // RenderingServer
- { "DampedStringParam", "DampedSpringParam" }, // PhysicsServer2D
- { "FFT_Size", "FFTSize" }, // AudioEffectPitchShift,AudioEffectSpectrumAnalyzer
- { "PauseMode", "ProcessMode" }, // Node
- { "TimerProcessMode", "TimerProcessCallback" }, // Timer
- { "Tracking_status", "TrackingStatus" }, // XRInterface
- { nullptr, nullptr },
-};
-
-const char *ProjectConverter3To4::gdscript_function_renames[][2] = {
- // { "_set_name", "get_tracker_name"}, // XRPositionalTracker - CameraFeed use this
- // { "_unhandled_input", "_unhandled_key_input"}, // BaseButton, ViewportContainer broke Node, FileDialog,SubViewportContainer
- // { "create_gizmo", "_create_gizmo"}, // EditorNode3DGizmoPlugin - may be used
- // { "get_dependencies", "_get_dependencies" }, // ResourceFormatLoader broke ResourceLoader
- // { "get_extents", "get_size" }, // BoxShape, RectangleShape broke Decal, VoxelGI, GPUParticlesCollisionBox, GPUParticlesCollisionSDF, GPUParticlesCollisionHeightField, GPUParticlesAttractorBox, GPUParticlesAttractorVectorField, FogVolume
- // { "get_h_offset", "get_drag_horizontal_offset"}, // Camera2D, broke PathFollow, Camera
- // { "get_mode", "get_file_mode"}, // FileDialog broke Panel, Shader, CSGPolygon, Tilemap
- // { "get_motion", "get_travel"}, // PhysicsTestMotionResult2D broke ParalaxLayer
- // { "get_name", "get_tracker_name"}, // XRPositionalTracker broke OS, Node
- // { "get_network_connected_peers", "get_peers"}, // MultiplayerAPI broke SceneTree
- // { "get_network_peer", "has_multiplayer_peer"}, // MultiplayerAPI broke SceneTree
- // { "get_network_unique_id", "get_unique_id"}, // MultiplayerAPI broke SceneTree
- // { "get_offset", "get_position_offset" }, // GraphNode broke Gradient
- // { "get_peer_port", "get_peer" }, // ENetMultiplayerPeer broke WebSocketServer
- // { "get_process_mode", "get_process_callback" }, // ClippedCamera3D broke Node, Sky
- // { "get_render_info", "get_rendering_info" }, // RenderingServer broke Viewport
- // { "get_type", "get_tracker_type"}, // XRPositionalTracker broke GLTFAccessor, GLTFLight
- // { "get_v_offset", "get_drag_vertical_offset"}, // Camera2D, broke PathFollow, Camera
- // { "has_network_peer", "has_multiplayer_peer"}, // MultiplayerAPI broke SceneTree
- // { "instance", "instantiate" }, // PackedScene, ClassDB - Broke FileSystemDock signal and also tscn files - [instance=ExtResource( 17 )] - this is implemented as custom rule
- // { "is_listening", "is_bound"}, // PacketPeerUDP broke TCPServer, UDPServer
- // { "is_refusing_new_network_connections", "is_refusing_new_connections"}, // MultiplayerAPI broke SceneTree
- // { "is_valid", "has_valid_event" }, // Shortcut broke e.g. Callable
- // { "listen", "bound"}, // PacketPeerUDP broke TCPServer, UDPServer
- // { "load", "_load"}, // ResourceFormatLoader broke ConfigFile, Image, StreamTexture2D
- // { "make_current", "set_current" }, // Camera2D broke Camera3D, Listener2D
- // { "process", "_process" }, // AnimationNode - This word is commonly used
- // { "save", "_save"}, // ResourceFormatLoader broke ConfigFile, Image, StreamTexture2D
- // { "set_autowrap", "set_autowrap_mode" }, // AcceptDialog broke Label - Cyclic Rename
- // { "set_color", "surface_set_color"}, // ImmediateMesh broke Light2D, Theme, SurfaceTool
- // { "set_event", "set_shortcut" }, // BaseButton - Cyclic Rename
- // { "set_extents", "set_size"}, // BoxShape, RectangleShape broke ReflectionProbe
- // { "set_flag", "set_particle_flag"}, // ParticleProcessMaterial broke Window, HingeJoint3D
- // { "set_h_offset", "set_drag_horizontal_offset" }, // Camera2D broke Camera3D, PathFollow3D, PathFollow2D
- // { "set_margin", "set_offset" }, // Control broke Shape3D, AtlasTexture
- // { "set_mode", "set_mode_file_mode" }, // FileDialog broke Panel, Shader, CSGPolygon, Tilemap
- // { "set_normal", "surface_set_normal"}, // ImmediateGeometry broke SurfaceTool, WorldMarginShape2D
- // { "set_offset", "set_progress" }, // PathFollow2D, PathFollow3D - Too common
- // { "set_process_mode", "set_process_callback" }, // AnimationTree broke Node, Tween, Sky
- // { "set_refuse_new_network_connections", "set_refuse_new_connections"}, // MultiplayerAPI broke SceneTree
- // { "set_tooltip", "set_tooltip_text" }, // Control, breaks TreeItem, at least for now.
- // { "set_uv", "surface_set_uv" }, // ImmediateMesh broke Polygon2D
- // { "set_v_offset", "set_drag_vertical_offset" }, // Camera2D broke Camera3D, PathFollow3D, PathFollow2D
- // {"get_points","get_points_id"},// Astar, broke Line2D, Convexpolygonshape
- // {"get_v_scroll","get_v_scroll_bar"},//ItemList, broke TextView
- // { "get_stylebox", "get_theme_stylebox" }, // Control - Will rename the method in Theme as well, skipping
- { "_about_to_show", "_about_to_popup" }, // ColorPickerButton
- { "_get_configuration_warning", "_get_configuration_warnings" }, // Node
- { "_set_current", "set_current" }, // Camera2D
- { "_set_editor_description", "set_editor_description" }, // Node
- { "_toplevel_raise_self", "_top_level_raise_self" }, // CanvasItem
- { "_update_wrap_at", "_update_wrap_at_column" }, // TextEdit
- { "add_animation", "add_animation_library" }, // AnimationPlayer
- { "add_cancel", "add_cancel_button" }, // AcceptDialog
- { "add_central_force", "apply_central_force" }, //RigidBody2D
- { "add_child_below_node", "add_sibling" }, // Node
- { "add_color_override", "add_theme_color_override" }, // Control
- { "add_constant_override", "add_theme_constant_override" }, // Control
- { "add_font_override", "add_theme_font_override" }, // Control
- { "add_force", "apply_force" }, //RigidBody2D
- { "add_icon_override", "add_theme_icon_override" }, // Control
- { "add_scene_import_plugin", "add_scene_format_importer_plugin" }, //EditorPlugin
- { "add_spatial_gizmo_plugin", "add_node_3d_gizmo_plugin" }, // EditorPlugin
- { "add_stylebox_override", "add_theme_stylebox_override" }, // Control
- { "add_torque", "apply_torque" }, //RigidBody2D
- { "agent_set_neighbor_dist", "agent_set_neighbor_distance" }, // NavigationServer2D, NavigationServer3D
- { "apply_changes", "_apply_changes" }, // EditorPlugin
- { "body_add_force", "body_apply_force" }, // PhysicsServer2D
- { "body_add_torque", "body_apply_torque" }, // PhysicsServer2D
- { "bumpmap_to_normalmap", "bump_map_to_normal_map" }, // Image
- { "can_be_hidden", "_can_be_hidden" }, // EditorNode3DGizmoPlugin
- { "can_drop_data", "_can_drop_data" }, // Control
- { "can_generate_small_preview", "_can_generate_small_preview" }, // EditorResourcePreviewGenerator
- { "can_instance", "can_instantiate" }, // PackedScene, Script
- { "canvas_light_set_scale", "canvas_light_set_texture_scale" }, // RenderingServer
- { "capture_get_device", "get_input_device" }, // AudioServer
- { "capture_get_device_list", "get_input_device_list" }, // AudioServer
- { "capture_set_device", "set_input_device" }, // AudioServer
- { "center_viewport_to_cursor", "center_viewport_to_caret" }, // TextEdit
- { "change_scene", "change_scene_to_file" }, // SceneTree
- { "change_scene_to", "change_scene_to_packed" }, // SceneTree
- { "clip_polygons_2d", "clip_polygons" }, // Geometry2D
- { "clip_polyline_with_polygon_2d", "clip_polyline_with_polygon" }, //Geometry2D
- { "commit_handle", "_commit_handle" }, // EditorNode3DGizmo
- { "convex_hull_2d", "convex_hull" }, // Geometry2D
- { "create_gizmo", "_create_gizmo" }, // EditorNode3DGizmoPlugin
- { "cursor_get_blink_speed", "get_caret_blink_interval" }, // TextEdit
- { "cursor_get_column", "get_caret_column" }, // TextEdit
- { "cursor_get_line", "get_caret_line" }, // TextEdit
- { "cursor_set_blink_enabled", "set_caret_blink_enabled" }, // TextEdit
- { "cursor_set_blink_speed", "set_caret_blink_interval" }, // TextEdit
- { "cursor_set_column", "set_caret_column" }, // TextEdit
- { "cursor_set_line", "set_caret_line" }, // TextEdit
- { "damped_spring_joint_create", "joint_make_damped_spring" }, // PhysicsServer2D
- { "damped_string_joint_get_param", "damped_spring_joint_get_param" }, // PhysicsServer2D
- { "damped_string_joint_set_param", "damped_spring_joint_set_param" }, // PhysicsServer2D
- { "dectime", "move_toward" }, // GDScript, Math functions
- { "delete_char_at_cursor", "delete_char_at_caret" }, // LineEdit
- { "deselect_items", "deselect_all" }, // FileDialog
- { "disable_plugin", "_disable_plugin" }, // EditorPlugin
- { "drop_data", "_drop_data" }, // Control
- { "exclude_polygons_2d", "exclude_polygons" }, // Geometry2D
- { "find_node", "find_child" }, // Node
- { "find_scancode_from_string", "find_keycode_from_string" }, // OS
- { "forward_canvas_draw_over_viewport", "_forward_canvas_draw_over_viewport" }, // EditorPlugin
- { "forward_canvas_force_draw_over_viewport", "_forward_canvas_force_draw_over_viewport" }, // EditorPlugin
- { "forward_canvas_gui_input", "_forward_canvas_gui_input" }, // EditorPlugin
- { "forward_spatial_draw_over_viewport", "_forward_3d_draw_over_viewport" }, // EditorPlugin
- { "forward_spatial_force_draw_over_viewport", "_forward_3d_force_draw_over_viewport" }, // EditorPlugin
- { "forward_spatial_gui_input", "_forward_3d_gui_input" }, // EditorPlugin
- { "generate_from_path", "_generate_from_path" }, // EditorResourcePreviewGenerator
- { "generate_small_preview_automatically", "_generate_small_preview_automatically" }, // EditorResourcePreviewGenerator
- { "get_action_list", "action_get_events" }, // InputMap
- { "get_alt", "is_alt_pressed" }, // InputEventWithModifiers
- { "get_animation_process_mode", "get_process_callback" }, // AnimationPlayer
- { "get_applied_force", "get_constant_force" }, //RigidBody2D
- { "get_applied_torque", "get_constant_torque" }, //RigidBody2D
- { "get_audio_bus", "get_audio_bus_name" }, // Area3D
- { "get_bound_child_nodes_to_bone", "get_bone_children" }, // Skeleton3D
- { "get_camera", "get_camera_3d" }, // Viewport -> this is also convertible to get_camera_2d, broke GLTFNode
- { "get_cancel", "get_cancel_button" }, // ConfirmationDialog
- { "get_caption", "_get_caption" }, // AnimationNode
- { "get_cast_to", "get_target_position" }, // RayCast2D, RayCast3D
- { "get_child_by_name", "_get_child_by_name" }, // AnimationNode
- { "get_child_nodes", "_get_child_nodes" }, // AnimationNode
- { "get_closest_point_to_segment_2d", "get_closest_point_to_segment" }, // Geometry2D
- { "get_closest_point_to_segment_uncapped_2d", "get_closest_point_to_segment_uncapped" }, // Geometry2D
- { "get_closest_points_between_segments_2d", "get_closest_point_to_segment" }, // Geometry2D
- { "get_collision_layer_bit", "get_collision_layer_value" }, // CSGShape3D and a lot of others like GridMap
- { "get_collision_mask_bit", "get_collision_mask_value" }, // CSGShape3D and a lot of others like GridMap
- { "get_color_types", "get_color_type_list" }, // Theme
- { "get_command", "is_command_or_control_pressed" }, // InputEventWithModifiers
- { "get_constant_types", "get_constant_type_list" }, // Theme
- { "get_control", "is_ctrl_pressed" }, // InputEventWithModifiers
- { "get_cull_mask_bit", "get_cull_mask_value" }, // Camera3D
- { "get_cursor_position", "get_caret_column" }, // LineEdit
- { "get_d", "get_distance" }, // LineShape2D
- { "get_depth_bias_enable", "get_depth_bias_enabled" }, // RDPipelineRasterizationState
- { "get_device", "get_output_device" }, // AudioServer
- { "get_device_list", "get_output_device_list" }, // AudioServer
- { "get_drag_data", "_get_drag_data" }, // Control
- { "get_editor_viewport", "get_editor_main_screen" }, // EditorPlugin
- { "get_enabled_focus_mode", "get_focus_mode" }, // BaseButton
- { "get_endian_swap", "is_big_endian" }, // File
- { "get_error_string", "get_error_message" }, // JSON
- { "get_filename", "get_scene_file_path" }, // Node, WARNING, this may be used in a lot of other places
- { "get_focus_neighbour", "get_focus_neighbor" }, // Control
- { "get_follow_smoothing", "get_position_smoothing_speed" }, // Camera2D
- { "get_font_types", "get_font_type_list" }, // Theme
- { "get_frame_color", "get_color" }, // ColorRect
- { "get_global_rate_scale", "get_playback_speed_scale" }, // AudioServer
- { "get_gravity_distance_scale", "get_gravity_point_unit_distance" }, // Area(2D/3D)
- { "get_gravity_vector", "get_gravity_direction" }, // Area(2D/3D)
- { "get_h_scrollbar", "get_h_scroll_bar" }, //ScrollContainer
- { "get_hand", "get_tracker_hand" }, // XRPositionalTracker
- { "get_handle_name", "_get_handle_name" }, // EditorNode3DGizmo
- { "get_handle_value", "_get_handle_value" }, // EditorNode3DGizmo
- { "get_icon_align", "get_icon_alignment" }, // Button
- { "get_icon_types", "get_icon_type_list" }, // Theme
- { "get_idle_frames", "get_process_frames" }, // Engine
- { "get_import_options", "_get_import_options" }, // EditorImportPlugin
- { "get_import_order", "_get_import_order" }, // EditorImportPlugin
- { "get_importer_name", "_get_importer_name" }, // EditorImportPlugin
- { "get_interior_ambient", "get_ambient_color" }, // ReflectionProbe
- { "get_interior_ambient_energy", "get_ambient_color_energy" }, // ReflectionProbe
- { "get_iterations_per_second", "get_physics_ticks_per_second" }, // Engine
- { "get_last_mouse_speed", "get_last_mouse_velocity" }, // Input
- { "get_layer_mask_bit", "get_layer_mask_value" }, // VisualInstance3D
- { "get_len", "get_length" }, // File
- { "get_max_atlas_size", "get_max_texture_size" }, // LightmapGI
- { "get_metakey", "is_meta_pressed" }, // InputEventWithModifiers
- { "get_mid_height", "get_height" }, // CapsuleMesh
- { "get_motion_remainder", "get_remainder" }, // PhysicsTestMotionResult2D
- { "get_neighbor_dist", "get_neighbor_distance" }, // NavigationAgent2D, NavigationAgent3D
- { "get_network_connected_peers", "get_peers" }, // Multiplayer API
- { "get_network_master", "get_multiplayer_authority" }, // Node
- { "get_network_peer", "get_multiplayer_peer" }, // Multiplayer API
- { "get_network_unique_id", "get_unique_id" }, // Multiplayer API
- { "get_ok", "get_ok_button" }, // AcceptDialog
- { "get_oneshot", "get_one_shot" }, // AnimatedTexture
- { "get_option_visibility", "_get_option_visibility" }, // EditorImportPlugin
- { "get_parameter_default_value", "_get_parameter_default_value" }, // AnimationNode
- { "get_parameter_list", "_get_parameter_list" }, // AnimationNode
- { "get_parent_spatial", "get_parent_node_3d" }, // Node3D
- { "get_pause_mode", "get_process_mode" }, // Node
- { "get_physical_scancode", "get_physical_keycode" }, // InputEventKey
- { "get_physical_scancode_with_modifiers", "get_physical_keycode_with_modifiers" }, // InputEventKey
- { "get_plugin_icon", "_get_plugin_icon" }, // EditorPlugin
- { "get_plugin_name", "_get_plugin_name" }, // EditorPlugin
- { "get_preset_count", "_get_preset_count" }, // EditorImportPlugin
- { "get_preset_name", "_get_preset_name" }, // EditorImportPlugin
- { "get_recognized_extensions", "_get_recognized_extensions" }, // ResourceFormatLoader, EditorImportPlugin broke ResourceSaver
- { "get_render_info", "get_rendering_info" }, // RenderingServer
- { "get_render_targetsize", "get_render_target_size" }, // XRInterface
- { "get_resource_type", "_get_resource_type" }, // ResourceFormatLoader
- { "get_result", "get_data" }, //JSON
- { "get_reverb_bus", "set_reverb_bus_name" }, // Area3D
- { "get_rpc_sender_id", "get_remote_sender_id" }, // Multiplayer API
- { "get_save_extension", "_get_save_extension" }, // EditorImportPlugin
- { "get_scancode", "get_keycode" }, // InputEventKey
- { "get_scancode_string", "get_keycode_string" }, // OS
- { "get_scancode_with_modifiers", "get_keycode_with_modifiers" }, // InputEventKey
- { "get_selected_path", "get_current_directory" }, // EditorInterface
- { "get_shift", "is_shift_pressed" }, // InputEventWithModifiers
- { "get_size_override", "get_size_2d_override" }, // SubViewport
- { "get_slide_count", "get_slide_collision_count" }, // CharacterBody2D, CharacterBody3D
- { "get_slips_on_slope", "get_slide_on_slope" }, // SeparationRayShape2D, SeparationRayShape3D
- { "get_space_override_mode", "get_gravity_space_override_mode" }, // Area2D
- { "get_spatial_node", "get_node_3d" }, // EditorNode3DGizmo
- { "get_speed", "get_velocity" }, // InputEventMouseMotion
- { "get_stylebox_types", "get_stylebox_type_list" }, // Theme
- { "get_surface_material", "get_surface_override_material" }, // MeshInstance3D broke ImporterMesh
- { "get_surface_material_count", "get_surface_override_material_count" }, // MeshInstance3D
- { "get_tab_disabled", "is_tab_disabled" }, // Tab
- { "get_tab_hidden", "is_tab_hidden" }, // Tab
- { "get_text_align", "get_text_alignment" }, // Button
- { "get_theme_item_types", "get_theme_item_type_list" }, // Theme
- { "get_timer_process_mode", "get_timer_process_callback" }, // Timer
- { "get_translation", "get_position" }, // Node3D broke GLTFNode which is used rarely
- { "get_unit_db", "get_volume_db" }, // AudioStreamPlayer3D
- { "get_unit_offset", "get_progress_ratio" }, // PathFollow2D, PathFollow3D
- { "get_use_in_baked_light", "is_baking_navigation" }, // GridMap
- { "get_used_cells_by_id", "get_used_cells" }, // TileMap
- { "get_v_scrollbar", "get_v_scroll_bar" }, //ScrollContainer
- { "get_visible_name", "_get_visible_name" }, // EditorImportPlugin
- { "get_window_layout", "_get_window_layout" }, // EditorPlugin
- { "get_word_under_cursor", "get_word_under_caret" }, // TextEdit
- { "get_world", "get_world_3d" }, // Viewport, Spatial
- { "get_zfar", "get_far" }, // Camera3D broke GLTFCamera
- { "get_znear", "get_near" }, // Camera3D broke GLTFCamera
- { "groove_joint_create", "joint_make_groove" }, // PhysicsServer2D
- { "handle_menu_selected", "_handle_menu_selected" }, // EditorResourcePicker
- { "handles_type", "_handles_type" }, // ResourceFormatLoader
- { "has_color", "has_theme_color" }, // Control broke Theme
- { "has_color_override", "has_theme_color_override" }, // Control broke Theme
- { "has_constant", "has_theme_constant" }, // Control
- { "has_constant_override", "has_theme_constant_override" }, // Control
- { "has_filter", "_has_filter" }, // AnimationNode
- { "has_font", "has_theme_font" }, // Control broke Theme
- { "has_font_override", "has_theme_font_override" }, // Control
- { "has_icon", "has_theme_icon" }, // Control broke Theme
- { "has_icon_override", "has_theme_icon_override" }, // Control
- { "has_main_screen", "_has_main_screen" }, // EditorPlugin
- { "has_network_peer", "has_multiplayer_peer" }, // Multiplayer API
- { "has_stylebox", "has_theme_stylebox" }, // Control broke Theme
- { "has_stylebox_override", "has_theme_stylebox_override" }, // Control
- { "http_escape", "uri_encode" }, // String
- { "http_unescape", "uri_decode" }, // String
- { "import_scene_from_other_importer", "_import_scene" }, //EditorSceneFormatImporter
- { "instance_set_surface_material", "instance_set_surface_override_material" }, // RenderingServer
- { "interpolate", "sample" }, // Curve, Curve2D, Curve3D, Gradient
- { "intersect_polygons_2d", "intersect_polygons" }, // Geometry2D
- { "intersect_polyline_with_polygon_2d", "intersect_polyline_with_polygon" }, // Geometry2D
- { "is_a_parent_of", "is_ancestor_of" }, // Node
- { "is_commiting_action", "is_committing_action" }, // UndoRedo
- { "is_doubleclick", "is_double_click" }, // InputEventMouseButton
- { "is_draw_red", "is_draw_warning" }, // EditorProperty
- { "is_follow_smoothing_enabled", "is_position_smoothing_enabled" }, // Camera2D
- { "is_h_drag_enabled", "is_drag_horizontal_enabled" }, // Camera2D
- { "is_handle_highlighted", "_is_handle_highlighted" }, // EditorNode3DGizmo, EditorNode3DGizmoPlugin
- { "is_inverting_faces", "get_flip_faces" }, // CSGPrimitive3D
- { "is_network_master", "is_multiplayer_authority" }, // Node
- { "is_network_server", "is_server" }, // Multiplayer API
- { "is_normalmap", "is_normal_map" }, // NoiseTexture
- { "is_refusing_new_network_connections", "is_refusing_new_connections" }, // Multiplayer API
- { "is_region", "is_region_enabled" }, // Sprite2D
- { "is_rotating", "is_ignoring_rotation" }, // Camera2D
- { "is_scancode_unicode", "is_keycode_unicode" }, // OS
- { "is_selectable_when_hidden", "_is_selectable_when_hidden" }, // EditorNode3DGizmoPlugin
- { "is_set_as_toplevel", "is_set_as_top_level" }, // CanvasItem
- { "is_shortcut", "matches_event" }, // Shortcut
- { "is_size_override_stretch_enabled", "is_size_2d_override_stretch_enabled" }, // SubViewport
- { "is_sort_enabled", "is_y_sort_enabled" }, // Node2D
- { "is_static_body", "is_able_to_sleep" }, // PhysicalBone3D - TODO - not sure
- { "is_v_drag_enabled", "is_drag_vertical_enabled" }, // Camera2D
- { "joint_create_cone_twist", "joint_make_cone_twist" }, // PhysicsServer3D
- { "joint_create_generic_6dof", "joint_make_generic_6dof" }, // PhysicsServer3D
- { "joint_create_hinge", "joint_make_hinge" }, // PhysicsServer3D
- { "joint_create_pin", "joint_make_pin" }, // PhysicsServer3D
- { "joint_create_slider", "joint_make_slider" }, // PhysicsServer3D
- { "line_intersects_line_2d", "line_intersects_line" }, // Geometry2D
- { "load_from_globals", "load_from_project_settings" }, // InputMap
- { "load_interactive", "load_threaded_request" }, // ResourceLoader - load_threaded_request is alternative, but is used differently
- { "make_convex_from_brothers", "make_convex_from_siblings" }, // CollisionShape3D
- { "make_visible", "_make_visible" }, // EditorPlugin
- { "merge_polygons_2d", "merge_polygons" }, // Geometry2D
- { "mesh_surface_get_format", "mesh_surface_get_format_attribute_stride" }, // RenderingServer
- { "mesh_surface_update_region", "mesh_surface_update_attribute_region" }, // RenderingServer
- { "move_to_bottom", "move_after" }, // Skeleton3D
- { "move_to_top", "move_before" }, // Skeleton3D
- { "multimesh_allocate", "multimesh_allocate_data" }, // RenderingServer
- { "normalmap_to_xy", "normal_map_to_xy" }, // Image
- { "offset_polygon_2d", "offset_polygon" }, // Geometry2D
- { "offset_polyline_2d", "offset_polyline" }, // Geometry2D
- { "percent_decode", "uri_decode" }, // String
- { "percent_encode", "uri_encode" }, // String
- { "pin_joint_create", "joint_make_pin" }, // PhysicsServer2D
- { "popup_centered_minsize", "popup_centered_clamped" }, // Window
- { "post_import", "_post_import" }, // EditorScenePostImport
- { "print_stray_nodes", "print_orphan_nodes" }, // Node
- { "property_list_changed_notify", "notify_property_list_changed" }, // Object
- { "raise", "move_to_front" }, // CanvasItem
- { "recognize", "_recognize" }, // ResourceFormatLoader
- { "regen_normalmaps", "regen_normal_maps" }, // ArrayMesh
- { "remove", "remove_at" }, // Array, broke Directory
- { "remove_animation", "remove_animation_library" }, // AnimationPlayer
- { "remove_color_override", "remove_theme_color_override" }, // Control
- { "remove_constant_override", "remove_theme_constant_override" }, // Control
- { "remove_font_override", "remove_theme_font_override" }, // Control
- { "remove_icon_override", "remove_theme_icon_override" }, // Control
- { "remove_scene_import_plugin", "remove_scene_format_importer_plugin" }, //EditorPlugin
- { "remove_spatial_gizmo_plugin", "remove_node_3d_gizmo_plugin" }, // EditorPlugin
- { "remove_stylebox_override", "remove_theme_stylebox_override" }, // Control
- { "rename_animation", "rename_animation_library" }, // AnimationPlayer
- { "rename_dependencies", "_rename_dependencies" }, // ResourceFormatLoader
- { "save_external_data", "_save_external_data" }, // EditorPlugin
- { "segment_intersects_segment_2d", "segment_intersects_segment" }, // Geometry2D
- { "set_adjustment_enable", "set_adjustment_enabled" }, // Environment
- { "set_alt", "set_alt_pressed" }, // InputEventWithModifiers
- { "set_anchor_and_margin", "set_anchor_and_offset" }, // Control
- { "set_anchors_and_margins_preset", "set_anchors_and_offsets_preset" }, // Control
- { "set_animation_process_mode", "set_process_callback" }, // AnimationPlayer
- { "set_as_bulk_array", "set_buffer" }, // MultiMesh
- { "set_as_normalmap", "set_as_normal_map" }, // NoiseTexture
- { "set_as_toplevel", "set_as_top_level" }, // CanvasItem
- { "set_audio_bus", "set_audio_bus_name" }, // Area3D
- { "set_autowrap", "set_autowrap_mode" }, // Label broke AcceptDialog
- { "set_cast_to", "set_target_position" }, // RayCast2D, RayCast3D
- { "set_collision_layer_bit", "set_collision_layer_value" }, // CSGShape3D and a lot of others like GridMap
- { "set_collision_mask_bit", "set_collision_mask_value" }, // CSGShape3D and a lot of others like GridMap
- { "set_column_min_width", "set_column_custom_minimum_width" }, // Tree
- { "set_command", "set_meta_pressed" }, // InputEventWithModifiers
- { "set_control", "set_ctrl_pressed" }, // InputEventWithModifiers
- { "set_create_options", "_set_create_options" }, // EditorResourcePicker
- { "set_cull_mask_bit", "set_cull_mask_value" }, // Camera3D
- { "set_cursor_position", "set_caret_column" }, // LineEdit
- { "set_d", "set_distance" }, // WorldMarginShape2D
- { "set_depth_bias_enable", "set_depth_bias_enabled" }, // RDPipelineRasterizationState
- { "set_device", "set_output_device" }, // AudioServer
- { "set_doubleclick", "set_double_click" }, // InputEventMouseButton
- { "set_draw_red", "set_draw_warning" }, // EditorProperty
- { "set_enable_follow_smoothing", "set_position_smoothing_enabled" }, // Camera2D
- { "set_enabled_focus_mode", "set_focus_mode" }, // BaseButton
- { "set_endian_swap", "set_big_endian" }, // File
- { "set_expand_to_text_length", "set_expand_to_text_length_enabled" }, // LineEdit
- { "set_filename", "set_scene_file_path" }, // Node, WARNING, this may be used in a lot of other places
- { "set_focus_neighbour", "set_focus_neighbor" }, // Control
- { "set_follow_smoothing", "set_position_smoothing_speed" }, // Camera2D
- { "set_frame_color", "set_color" }, // ColorRect
- { "set_global_rate_scale", "set_playback_speed_scale" }, // AudioServer
- { "set_gravity_distance_scale", "set_gravity_point_unit_distance" }, // Area(2D/3D)
- { "set_gravity_vector", "set_gravity_direction" }, // Area(2D/3D)
- { "set_h_drag_enabled", "set_drag_horizontal_enabled" }, // Camera2D
- { "set_icon_align", "set_icon_alignment" }, // Button
- { "set_interior_ambient", "set_ambient_color" }, // ReflectionProbe
- { "set_interior_ambient_energy", "set_ambient_color_energy" }, // ReflectionProbe
- { "set_invert_faces", "set_flip_faces" }, // CSGPrimitive3D
- { "set_is_initialized", "_is_initialized" }, // XRInterface
- { "set_is_primary", "set_primary" }, // XRInterface
- { "set_iterations_per_second", "set_physics_ticks_per_second" }, // Engine
- { "set_layer_mask_bit", "set_layer_mask_value" }, // VisualInstance3D
- { "set_margins_preset", "set_offsets_preset" }, // Control
- { "set_max_atlas_size", "set_max_texture_size" }, // LightmapGI
- { "set_metakey", "set_meta_pressed" }, // InputEventWithModifiers
- { "set_mid_height", "set_height" }, // CapsuleMesh
- { "set_neighbor_dist", "set_neighbor_distance" }, // NavigationAgent2D, NavigationAgent3D
- { "set_network_master", "set_multiplayer_authority" }, // Node
- { "set_network_peer", "set_multiplayer_peer" }, // Multiplayer API
- { "set_oneshot", "set_one_shot" }, // AnimatedTexture
- { "set_pause_mode", "set_process_mode" }, // Node
- { "set_physical_scancode", "set_physical_keycode" }, // InputEventKey
- { "set_proximity_fade", "set_proximity_fade_enabled" }, // Material
- { "set_refuse_new_network_connections", "set_refuse_new_connections" }, // Multiplayer API
- { "set_region", "set_region_enabled" }, // Sprite2D, Sprite broke AtlasTexture
- { "set_region_filter_clip", "set_region_filter_clip_enabled" }, // Sprite2D
- { "set_reverb_bus", "set_reverb_bus_name" }, // Area3D
- { "set_rotate", "set_rotates" }, // PathFollow2D
- { "set_scancode", "set_keycode" }, // InputEventKey
- { "set_shift", "set_shift_pressed" }, // InputEventWithModifiers
- { "set_size_override", "set_size_2d_override" }, // SubViewport broke ImageTexture
- { "set_size_override_stretch", "set_size_2d_override_stretch" }, // SubViewport
- { "set_slips_on_slope", "set_slide_on_slope" }, // SeparationRayShape2D, SeparationRayShape3D
- { "set_sort_enabled", "set_y_sort_enabled" }, // Node2D
- { "set_space_override_mode", "set_gravity_space_override_mode" }, // Area2D
- { "set_spatial_node", "set_node_3d" }, // EditorNode3DGizmo
- { "set_speed", "set_velocity" }, // InputEventMouseMotion
- { "set_ssao_edge_sharpness", "set_ssao_sharpness" }, // Environment
- { "set_surface_material", "set_surface_override_material" }, // MeshInstance3D broke ImporterMesh
- { "set_tab_align", "set_tab_alignment" }, //TabContainer
- { "set_tangent", "surface_set_tangent" }, // ImmediateGeometry broke SurfaceTool
- { "set_text_align", "set_text_alignment" }, // Button
- { "set_timer_process_mode", "set_timer_process_callback" }, // Timer
- { "set_translation", "set_position" }, // Node3D - this broke GLTFNode which is used rarely
- { "set_unit_db", "set_volume_db" }, // AudioStreamPlayer3D
- { "set_unit_offset", "set_progress_ratio" }, // PathFollow2D, PathFollow3D
- { "set_uv2", "surface_set_uv2" }, // ImmediateMesh broke Surffacetool
- { "set_v_drag_enabled", "set_drag_vertical_enabled" }, // Camera2D
- { "set_valign", "set_vertical_alignment" }, // Label
- { "set_window_layout", "_set_window_layout" }, // EditorPlugin
- { "set_zfar", "set_far" }, // Camera3D broke GLTFCamera
- { "set_znear", "set_near" }, // Camera3D broke GLTFCamera
- { "shortcut_match", "is_match" }, // InputEvent
- { "skeleton_allocate", "skeleton_allocate_data" }, // RenderingServer
- { "surface_update_region", "surface_update_attribute_region" }, // ArrayMesh
- { "targeting_method", "tween_method" }, // Tween
- { "targeting_property", "tween_property" }, // Tween
- { "track_remove_key_at_position", "track_remove_key_at_time" }, // Animation
- { "triangulate_delaunay_2d", "triangulate_delaunay" }, // Geometry2D
- { "unselect", "deselect" }, // ItemList
- { "unselect_all", "deselect_all" }, // ItemList
- { "update_configuration_warning", "update_configuration_warnings" }, // Node
- { "update_gizmo", "update_gizmos" }, // Node3D
- { "viewport_set_use_arvr", "viewport_set_use_xr" }, // RenderingServer
- { "warp_mouse_position", "warp_mouse" }, // Input
- { "world_to_map", "local_to_map" }, // TileMap, GridMap
- { "set_shader_param", "set_shader_parameter" }, // ShaderMaterial
- { "get_shader_param", "get_shader_parameter" }, // ShaderMaterial
- { "set_uniform_name", "set_parameter_name" }, // ParameterRef
- { "get_uniform_name", "get_parameter_name" }, // ParameterRef
-
- // Builtin types
- // Remember to add them to builtin_types_excluded_functions variable, because for now this functions cannot be listed
- // { "empty", "is_empty" }, // Array - Used as custom rule // Be careful, this will be used everywhere
- { "clamped", "clamp" }, // Vector2 // Be careful, this will be used everywhere
- { "get_rotation_quat", "get_rotation_quaternion" }, // Basis
- { "grow_margin", "grow_side" }, // Rect2
- { "invert", "reverse" }, // Array - TODO check // Be careful, this will be used everywhere
- { "is_abs_path", "is_absolute_path" }, // String
- { "is_valid_integer", "is_valid_int" }, // String
- { "linear_interpolate", "lerp" }, // Color
- { "find_last", "rfind" }, // Array, String
- { "to_ascii", "to_ascii_buffer" }, // String
- { "to_utf8", "to_utf8_buffer" }, // String
- { "to_wchar", "to_utf32_buffer" }, // String // TODO - utf32 or utf16?
-
- // @GlobalScope
- // Remember to add them to builtin_types_excluded_functions variable, because for now this functions cannot be listed
- { "bytes2var", "bytes_to_var" },
- { "bytes2var_with_objects", "bytes_to_var_with_objects" },
- { "db2linear", "db_to_linear" },
- { "deg2rad", "deg_to_rad" },
- { "linear2db", "linear_to_db" },
- { "rad2deg", "rad_to_deg" },
- { "rand_range", "randf_range" },
- { "range_lerp", "remap" },
- { "stepify", "snapped" },
- { "str2var", "str_to_var" },
- { "var2str", "var_to_str" },
- { "var2bytes", "var_to_bytes" },
- { "var2bytes_with_objects", "var_to_bytes_with_objects" },
-
- // @GDScript
- // Remember to add them to builtin_types_excluded_functions variable, because for now this functions cannot be listed
- { "dict2inst", "dict_to_inst" },
- { "inst2dict", "inst_to_dict" },
-
- { nullptr, nullptr },
-};
-
-// gdscript_function_renames clone with CamelCase
-const char *ProjectConverter3To4::csharp_function_renames[][2] = {
- // { "_SetName", "GetTrackerName"}, // XRPositionalTracker - CameraFeed use this
- // { "_UnhandledInput", "_UnhandledKeyInput"}, // BaseButton, ViewportContainer broke Node, FileDialog,SubViewportContainer
- // { "CreateGizmo", "_CreateGizmo"}, // EditorNode3DGizmoPlugin - may be used
- // { "GetDependencies", "_GetDependencies" }, // ResourceFormatLoader broke ResourceLoader
- // { "GetExtents", "GetSize" }, // BoxShape, RectangleShape broke Decal, VoxelGI, GPUParticlesCollisionBox, GPUParticlesCollisionSDF, GPUParticlesCollisionHeightField, GPUParticlesAttractorBox, GPUParticlesAttractorVectorField, FogVolume
- // { "GetHOffset", "GetDragHorizontalOffset"}, // Camera2D, broke PathFollow, Camera
- // { "GetMode", "GetFileMode"}, // FileDialog broke Panel, Shader, CSGPolygon, Tilemap
- // { "GetMotion", "GetTravel"}, // PhysicsTestMotionResult2D broke ParalaxLayer
- // { "GetName", "GetTrackerName"}, // XRPositionalTracker broke OS, Node
- // { "GetNetworkConnectedPeers", "GetPeers"}, // MultiplayerAPI broke SceneTree
- // { "GetNetworkPeer", "HasMultiplayerPeer"}, // MultiplayerAPI broke SceneTree
- // { "GetNetworkUniqueId", "GetUniqueId"}, // MultiplayerAPI broke SceneTree
- // { "GetOffset", "GetPositionOffset" }, // GraphNode broke Gradient
- // { "GetPeerPort", "GetPeer" }, // ENetMultiplayerPeer broke WebSocketServer
- // { "GetProcessMode", "GetProcessCallback" }, // ClippedCamera3D broke Node, Sky
- // { "GetRenderInfo", "GetRenderingInfo" }, // RenderingServer broke Viewport
- // { "GetType", "GetTrackerType"}, // XRPositionalTracker broke GLTFAccessor, GLTFLight
- // { "GetVOffset", "GetDragVerticalOffset"}, // Camera2D, broke PathFollow, Camera
- // { "HasNetworkPeer", "HasMultiplayerPeer"}, // MultiplayerAPI broke SceneTree
- // { "Instance", "Instantiate" }, // PackedScene, ClassDB - Broke FileSystemDock signal and also tscn files - [instance=ExtResource( 17 )] - this is implemented as custom rule
- // { "IsListening", "IsBound"}, // PacketPeerUDP broke TCPServer, UDPServer
- // { "IsRefusingNewNetworkConnections", "IsRefusingNewConnections"}, // MultiplayerAPI broke SceneTree
- // { "IsValid", "HasValidEvent" }, // Shortcut broke e.g. Callable
- // { "Listen", "Bound"}, // PacketPeerUDP broke TCPServer, UDPServer
- // { "Load", "_Load"}, // ResourceFormatLoader broke ConfigFile, Image, StreamTexture2D
- // { "MakeCurrent", "SetCurrent" }, // Camera2D broke Camera3D, Listener2D
- // { "Process", "_Process" }, // AnimationNode - This word is commonly used
- // { "Save", "_Save"}, // ResourceFormatLoader broke ConfigFile, Image, StreamTexture2D
- // { "SetAutowrap", "SetAutowrapMode" }, // AcceptDialog broke Label - Cyclic Rename
- // { "SetColor", "SurfaceSetColor"}, // ImmediateMesh broke Light2D, Theme, SurfaceTool
- // { "SetEvent", "SetShortcut" }, // BaseButton - Cyclic Rename
- // { "SetExtents", "SetSize"}, // BoxShape, RectangleShape broke ReflectionProbe
- // { "SetFlag", "SetParticleFlag"}, // ParticleProcessMaterial broke Window, HingeJoint3D
- // { "SetHOffset", "SetDragHorizontalOffset" }, // Camera2D broke Camera3D, PathFollow3D, PathFollow2D
- // { "SetMargin", "SetOffset" }, // Control broke Shape3D, AtlasTexture
- // { "SetMode", "SetModeFileMode" }, // FileDialog broke Panel, Shader, CSGPolygon, Tilemap
- // { "SetNormal", "SurfaceSetNormal"}, // ImmediateGeometry broke SurfaceTool, WorldMarginShape2D
- // { "SetOffset", "SetProgress" }, // PathFollow2D, PathFollow3D - Too common
- // { "SetProcessMode", "SetProcessCallback" }, // AnimationTree broke Node, Tween, Sky
- // { "SetRefuseNewNetworkConnections", "SetRefuseNewConnections"}, // MultiplayerAPI broke SceneTree
- // { "SetTooltip", "SetTooltipText" }, // Control, breaks TreeItem, at least for now.
- // { "SetUv", "SurfaceSetUv" }, // ImmediateMesh broke Polygon2D
- // { "SetVOffset", "SetDragVerticalOffset" }, // Camera2D broke Camera3D, PathFollow3D, PathFollow2D
- // {"GetPoints","GetPointsId"},// Astar, broke Line2D, Convexpolygonshape
- // {"GetVScroll","GetVScrollBar"},//ItemList, broke TextView
- // { "GetStylebox", "GetThemeStylebox" }, // Control - Will rename the method in Theme as well, skipping
- { "AddSpatialGizmoPlugin", "AddNode3dGizmoPlugin" }, // EditorPlugin
- { "RenderingServer", "GetTabAlignment" }, // Tab
- { "_AboutToShow", "_AboutToPopup" }, // ColorPickerButton
- { "_GetConfigurationWarning", "_GetConfigurationWarnings" }, // Node
- { "_SetCurrent", "SetCurrent" }, // Camera2D
- { "_SetEditorDescription", "SetEditorDescription" }, // Node
- { "_SetPlaying", "SetPlaying" }, // AnimatedSprite3D
- { "_ToplevelRaiseSelf", "_TopLevelRaiseSelf" }, // CanvasItem
- { "_UpdateWrapAt", "_UpdateWrapAtColumn" }, // TextEdit
- { "AddAnimation", "AddAnimationLibrary" }, // AnimationPlayer
- { "AddCancel", "AddCancelButton" }, // AcceptDialog
- { "AddCentralForce", "AddConstantCentralForce" }, //RigidBody2D
- { "AddChildBelowNode", "AddSibling" }, // Node
- { "AddColorOverride", "AddThemeColorOverride" }, // Control
- { "AddConstantOverride", "AddThemeConstantOverride" }, // Control
- { "AddFontOverride", "AddThemeFontOverride" }, // Control
- { "AddForce", "AddConstantForce" }, //RigidBody2D
- { "AddIconOverride", "AddThemeIconOverride" }, // Control
- { "AddSceneImportPlugin", "AddSceneFormatImporterPlugin" }, //EditorPlugin
- { "AddStyleboxOverride", "AddThemeStyleboxOverride" }, // Control
- { "AddTorque", "AddConstantTorque" }, //RigidBody2D
- { "AgentSetNeighborDist", "AgentSetNeighborDistance" }, // NavigationServer2D, NavigationServer3D
- { "BindChildNodeToBone", "SetBoneChildren" }, // Skeleton3D
- { "BumpmapToNormalmap", "BumpMapToNormalMap" }, // Image
- { "CanBeHidden", "_CanBeHidden" }, // EditorNode3DGizmoPlugin
- { "CanDropData", "_CanDropData" }, // Control
- { "CanDropDataFw", "_CanDropDataFw" }, // ScriptEditor
- { "CanGenerateSmallPreview", "_CanGenerateSmallPreview" }, // EditorResourcePreviewGenerator
- { "CanInstance", "CanInstantiate" }, // PackedScene, Script
- { "CanvasLightSetScale", "CanvasLightSetTextureScale" }, // RenderingServer
- { "CaptureGetDevice", "GetInputDevice" }, // AudioServer
- { "CaptureGetDeviceList", "GetInputDeviceList" }, // AudioServer
- { "CaptureSetDevice", "SetInputDevice" }, // AudioServer
- { "CenterViewportToCursor", "CenterViewportToCaret" }, // TextEdit
- { "ChangeScene", "ChangeSceneToFile" }, // SceneTree
- { "ChangeSceneTo", "ChangeSceneToPacked" }, // SceneTree
- { "ClipPolygons2d", "ClipPolygons" }, // Geometry2D
- { "ClipPolylineWithPolygon2d", "ClipPolylineWithPolygon" }, //Geometry2D
- { "CommitHandle", "_CommitHandle" }, // EditorNode3DGizmo
- { "ConvexHull2d", "ConvexHull" }, // Geometry2D
- { "CursorGetBlinkSpeed", "GetCaretBlinkInterval" }, // TextEdit
- { "CursorGetColumn", "GetCaretColumn" }, // TextEdit
- { "CursorGetLine", "GetCaretLine" }, // TextEdit
- { "CursorSetBlinkEnabled", "SetCaretBlinkEnabled" }, // TextEdit
- { "CursorSetBlinkSpeed", "SetCaretBlinkInterval" }, // TextEdit
- { "CursorSetColumn", "SetCaretColumn" }, // TextEdit
- { "CursorSetLine", "SetCaretLine" }, // TextEdit
- { "DampedSpringJointCreate", "JointMakeDampedSpring" }, // PhysicsServer2D
- { "DampedStringJointGetParam", "DampedSpringJointGetParam" }, // PhysicsServer2D
- { "DampedStringJointSetParam", "DampedSpringJointSetParam" }, // PhysicsServer2D
- { "DeleteCharAtCursor", "DeleteCharAtCaret" }, // LineEdit
- { "DeselectItems", "DeselectAll" }, // FileDialog
- { "DropData", "_DropData" }, // Control
- { "DropDataFw", "_DropDataFw" }, // ScriptEditor
- { "ExcludePolygons2d", "ExcludePolygons" }, // Geometry2D
- { "FindScancodeFromString", "FindKeycodeFromString" }, // OS
- { "ForwardCanvasDrawOverViewport", "_ForwardCanvasDrawOverViewport" }, // EditorPlugin
- { "ForwardCanvasForceDrawOverViewport", "_ForwardCanvasForceDrawOverViewport" }, // EditorPlugin
- { "ForwardCanvasGuiInput", "_ForwardCanvasGuiInput" }, // EditorPlugin
- { "ForwardSpatialDrawOverViewport", "_Forward3dDrawOverViewport" }, // EditorPlugin
- { "ForwardSpatialForceDrawOverViewport", "_Forward3dForceDrawOverViewport" }, // EditorPlugin
- { "ForwardSpatialGuiInput", "_Forward3dGuiInput" }, // EditorPlugin
- { "GenerateFromPath", "_GenerateFromPath" }, // EditorResourcePreviewGenerator
- { "GenerateSmallPreviewAutomatically", "_GenerateSmallPreviewAutomatically" }, // EditorResourcePreviewGenerator
- { "GetActionList", "ActionGetEvents" }, // InputMap
- { "GetAlt", "IsAltPressed" }, // InputEventWithModifiers
- { "GetAnimationProcessMode", "GetProcessCallback" }, // AnimationPlayer
- { "GetAppliedForce", "GetConstantForce" }, //RigidBody2D
- { "GetAppliedTorque", "GetConstantTorque" }, //RigidBody2D
- { "GetAudioBus", "GetAudioBusName" }, // Area3D
- { "GetBoundChildNodesToBone", "GetBoneChildren" }, // Skeleton3D
- { "GetCamera", "GetCamera3d" }, // Viewport -> this is also convertible to getCamera2d, broke GLTFNode
- { "GetCancel", "GetCancelButton" }, // ConfirmationDialog
- { "GetCaption", "_GetCaption" }, // AnimationNode
- { "GetCastTo", "GetTargetPosition" }, // RayCast2D, RayCast3D
- { "GetChildByName", "_GetChildByName" }, // AnimationNode
- { "GetChildNodes", "_GetChildNodes" }, // AnimationNode
- { "GetClosestPointToSegment2d", "GetClosestPointToSegment" }, // Geometry2D
- { "GetClosestPointToSegmentUncapped2d", "GetClosestPointToSegmentUncapped" }, // Geometry2D
- { "GetClosestPointsBetweenSegments2d", "GetClosestPointToSegment" }, // Geometry2D
- { "GetCollisionLayerBit", "GetCollisionLayerValue" }, // CSGShape3D and a lot of others like GridMap
- { "GetCollisionMaskBit", "GetCollisionMaskValue" }, // CSGShape3D and a lot of others like GridMap
- { "GetColorTypes", "GetColorTypeList" }, // Theme
- { "GetCommand", "IsCommandPressed" }, // InputEventWithModifiers
- { "GetConstantTypes", "GetConstantTypeList" }, // Theme
- { "GetControl", "IsCtrlPressed" }, // InputEventWithModifiers
- { "GetCullMaskBit", "GetCullMaskValue" }, // Camera3D
- { "GetCursorPosition", "GetCaretColumn" }, // LineEdit
- { "GetD", "GetDistance" }, // LineShape2D
- { "GetDepthBiasEnable", "GetDepthBiasEnabled" }, // RDPipelineRasterizationState
- { "GetDevice", "GetOutputDevice" }, // AudioServer
- { "GetDeviceList", "GetOutputDeviceList" }, // AudioServer
- { "GetDragDataFw", "_GetDragDataFw" }, // ScriptEditor
- { "GetEditorViewport", "GetViewport" }, // EditorPlugin
- { "GetEnabledFocusMode", "GetFocusMode" }, // BaseButton
- { "GetEndianSwap", "IsBigEndian" }, // File
- { "GetErrorString", "GetErrorMessage" }, // JSON
- { "GetFocusNeighbour", "GetFocusNeighbor" }, // Control
- { "GetFollowSmoothing", "GetFollowSmoothingSpeed" }, // Camera2D
- { "GetFontTypes", "GetFontTypeList" }, // Theme
- { "GetFrameColor", "GetColor" }, // ColorRect
- { "GetGlobalRateScale", "GetPlaybackSpeedScale" }, // AudioServer
- { "GetGravityDistanceScale", "GetGravityPointDistanceScale" }, //Area2D
- { "GetGravityVector", "GetGravityDirection" }, //Area2D
- { "GetHScrollbar", "GetHScrollBar" }, //ScrollContainer
- { "GetHand", "GetTrackerHand" }, // XRPositionalTracker
- { "GetHandleName", "_GetHandleName" }, // EditorNode3DGizmo
- { "GetHandleValue", "_GetHandleValue" }, // EditorNode3DGizmo
- { "GetIconAlign", "GetIconAlignment" }, // Button
- { "GetIconTypes", "GetIconTypeList" }, // Theme
- { "GetIdleFrames", "GetProcessFrames" }, // Engine
- { "GetImportOptions", "_GetImportOptions" }, // EditorImportPlugin
- { "GetImportOrder", "_GetImportOrder" }, // EditorImportPlugin
- { "GetImporterName", "_GetImporterName" }, // EditorImportPlugin
- { "GetInteriorAmbient", "GetAmbientColor" }, // ReflectionProbe
- { "GetInteriorAmbientEnergy", "GetAmbientColorEnergy" }, // ReflectionProbe
- { "GetIterationsPerSecond", "GetPhysicsTicksPerSecond" }, // Engine
- { "GetLastMouseSpeed", "GetLastMouseVelocity" }, // Input
- { "GetLayerMaskBit", "GetLayerMaskValue" }, // VisualInstance3D
- { "GetLen", "GetLength" }, // File
- { "GetMaxAtlasSize", "GetMaxTextureSize" }, // LightmapGI
- { "GetMetakey", "IsMetaPressed" }, // InputEventWithModifiers
- { "GetMidHeight", "GetHeight" }, // CapsuleMesh
- { "GetMotionRemainder", "GetRemainder" }, // PhysicsTestMotionResult2D
- { "GetNeighborDist", "GetNeighborDistance" }, // NavigationAgent2D, NavigationAgent3D
- { "GetNetworkConnectedPeers", "GetPeers" }, // Multiplayer API
- { "GetNetworkMaster", "GetMultiplayerAuthority" }, // Node
- { "GetNetworkPeer", "GetMultiplayerPeer" }, // Multiplayer API
- { "GetNetworkUniqueId", "GetUniqueId" }, // Multiplayer API
- { "GetOneshot", "GetOneShot" }, // AnimatedTexture
- { "GetOk", "GetOkButton" }, // AcceptDialog
- { "GetOptionVisibility", "_GetOptionVisibility" }, // EditorImportPlugin
- { "GetParameterDefaultValue", "_GetParameterDefaultValue" }, // AnimationNode
- { "GetParameterList", "_GetParameterList" }, // AnimationNode
- { "GetParentSpatial", "GetParentNode3d" }, // Node3D
- { "GetPhysicalScancode", "GetPhysicalKeycode" }, // InputEventKey
- { "GetPhysicalScancodeWithModifiers", "GetPhysicalKeycodeWithModifiers" }, // InputEventKey
- { "GetPluginIcon", "_GetPluginIcon" }, // EditorPlugin
- { "GetPluginName", "_GetPluginName" }, // EditorPlugin
- { "GetPresetCount", "_GetPresetCount" }, // EditorImportPlugin
- { "GetPresetName", "_GetPresetName" }, // EditorImportPlugin
- { "GetRecognizedExtensions", "_GetRecognizedExtensions" }, // ResourceFormatLoader, EditorImportPlugin broke ResourceSaver
- { "GetRenderInfo", "GetRenderingInfo" }, // RenderingServer
- { "GetRenderTargetsize", "GetRenderTargetSize" }, // XRInterface
- { "GetResourceType", "_GetResourceType" }, // ResourceFormatLoader
- { "GetResult", "GetData" }, //JSON
- { "GetReverbBus", "GetReverbBusName" }, // Area3D
- { "GetRpcSenderId", "GetRemoteSenderId" }, // Multiplayer API
- { "GetSaveExtension", "_GetSaveExtension" }, // EditorImportPlugin
- { "GetScancode", "GetKeycode" }, // InputEventKey
- { "GetScancodeString", "GetKeycodeString" }, // OS
- { "GetScancodeWithModifiers", "GetKeycodeWithModifiers" }, // InputEventKey
- { "GetShift", "IsShiftPressed" }, // InputEventWithModifiers
- { "GetSizeOverride", "GetSize2dOverride" }, // SubViewport
- { "GetSlipsOnSlope", "GetSlideOnSlope" }, // SeparationRayShape2D, SeparationRayShape3D
- { "GetSpaceOverrideMode", "GetGravitySpaceOverrideMode" }, // Area2D
- { "GetSpatialNode", "GetNode3d" }, // EditorNode3DGizmo
- { "GetSpeed", "GetVelocity" }, // InputEventMouseMotion
- { "GetStyleboxTypes", "GetStyleboxTypeList" }, // Theme
- { "GetSurfaceMaterial", "GetSurfaceOverrideMaterial" }, // MeshInstance3D broke ImporterMesh
- { "GetSurfaceMaterialCount", "GetSurfaceOverrideMaterialCount" }, // MeshInstance3D
- { "GetTabDisabled", "IsTabDisabled" }, // Tab
- { "GetTabHidden", "IsTabHidden" }, // Tab
- { "GetTextAlign", "GetTextAlignment" }, // Button
- { "GetThemeItemTypes", "GetThemeItemTypeList" }, // Theme
- { "GetTimerProcessMode", "GetTimerProcessCallback" }, // Timer
- { "GetTranslation", "GetPosition" }, // Node3D broke GLTFNode which is used rarely
- { "GetUnitDb", "GetVolumeDb" }, // AudioStreamPlayer3D
- { "GetUnitOffset", "GetProgressRatio" }, // PathFollow2D, PathFollow3D
- { "GetUseInBakedLight", "IsBakingNavigation" }, // GridMap
- { "GetUsedCellsById", "GetUsedCells" }, // TileMap
- { "GetVScrollbar", "GetVScrollBar" }, //ScrollContainer
- { "GetVisibleName", "_GetVisibleName" }, // EditorImportPlugin
- { "GetWindowLayout", "_GetWindowLayout" }, // EditorPlugin
- { "GetWordUnderCursor", "GetWordUnderCaret" }, // TextEdit
- { "GetWorld", "GetWorld3d" }, // Viewport, Spatial
- { "GetZfar", "GetFar" }, // Camera3D broke GLTFCamera
- { "GetZnear", "GetNear" }, // Camera3D broke GLTFCamera
- { "GrooveJointCreate", "JointMakeGroove" }, // PhysicsServer2D
- { "HandleMenuSelected", "_HandleMenuSelected" }, // EditorResourcePicker
- { "HandlesType", "_HandlesType" }, // ResourceFormatLoader
- { "HasColor", "HasThemeColor" }, // Control broke Theme
- { "HasColorOverride", "HasThemeColorOverride" }, // Control broke Theme
- { "HasConstant", "HasThemeConstant" }, // Control
- { "HasConstantOverride", "HasThemeConstantOverride" }, // Control
- { "HasFilter", "_HasFilter" }, // AnimationNode
- { "HasFont", "HasThemeFont" }, // Control broke Theme
- { "HasFontOverride", "HasThemeFontOverride" }, // Control
- { "HasIcon", "HasThemeIcon" }, // Control broke Theme
- { "HasIconOverride", "HasThemeIconOverride" }, // Control
- { "HasMainScreen", "_HasMainScreen" }, // EditorPlugin
- { "HasNetworkPeer", "HasMultiplayerPeer" }, // Multiplayer API
- { "HasStylebox", "HasThemeStylebox" }, // Control broke Theme
- { "HasStyleboxOverride", "HasThemeStyleboxOverride" }, // Control
- { "HttpEscape", "UriEncode" }, // String
- { "HttpUnescape", "UriDecode" }, // String
- { "ImportAnimationFromOtherImporter", "_ImportAnimation" }, //EditorSceneFormatImporter
- { "ImportSceneFromOtherImporter", "_ImportScene" }, //EditorSceneFormatImporter
- { "InstanceSetSurfaceMaterial", "InstanceSetSurfaceOverrideMaterial" }, // RenderingServer
- { "IntersectPolygons2d", "IntersectPolygons" }, // Geometry2D
- { "IntersectPolylineWithPolygon2d", "IntersectPolylineWithPolygon" }, // Geometry2D
- { "IsAParentOf", "IsAncestorOf" }, // Node
- { "IsCommitingAction", "IsCommittingAction" }, // UndoRedo
- { "IsDoubleclick", "IsDoubleClick" }, // InputEventMouseButton
- { "IsFollowSmoothingEnabled", "IsPositionSmoothingEnabled" }, // Camera2D
- { "IsHDragEnabled", "IsDragHorizontalEnabled" }, // Camera2D
- { "IsHandleHighlighted", "_IsHandleHighlighted" }, // EditorNode3DGizmo, EditorNode3DGizmoPlugin
- { "IsNetworkMaster", "IsMultiplayerAuthority" }, // Node
- { "IsNetworkServer", "IsServer" }, // Multiplayer API
- { "IsNormalmap", "IsNormalMap" }, // NoiseTexture
- { "IsRefusingNewNetworkConnections", "IsRefusingNewConnections" }, // Multiplayer API
- { "IsRegion", "IsRegionEnabled" }, // Sprite2D
- { "IsRotating", "IsIgnoringRotation" }, // Camera2D
- { "IsScancodeUnicode", "IsKeycodeUnicode" }, // OS
- { "IsSelectableWhenHidden", "_IsSelectableWhenHidden" }, // EditorNode3DGizmoPlugin
- { "IsSetAsToplevel", "IsSetAsTopLevel" }, // CanvasItem
- { "IsShortcut", "MatchesEvent" }, // Shortcut
- { "IsSizeOverrideStretchEnabled", "IsSize2dOverrideStretchEnabled" }, // SubViewport
- { "IsSortEnabled", "IsYSortEnabled" }, // Node2D
- { "IsStaticBody", "IsAbleToSleep" }, // PhysicalBone3D - TODO - not sure
- { "IsVDragEnabled", "IsDragVerticalEnabled" }, // Camera2D
- { "JointCreateConeTwist", "JointMakeConeTwist" }, // PhysicsServer3D
- { "JointCreateGeneric6dof", "JointMakeGeneric6dof" }, // PhysicsServer3D
- { "JointCreateHinge", "JointMakeHinge" }, // PhysicsServer3D
- { "JointCreatePin", "JointMakePin" }, // PhysicsServer3D
- { "JointCreateSlider", "JointMakeSlider" }, // PhysicsServer3D
- { "LineIntersectsLine2d", "LineIntersectsLine" }, // Geometry2D
- { "LoadFromGlobals", "LoadFromProjectSettings" }, // InputMap
- { "MakeConvexFromBrothers", "MakeConvexFromSiblings" }, // CollisionShape3D
- { "MergePolygons2d", "MergePolygons" }, // Geometry2D
- { "MeshSurfaceGetFormat", "MeshSurfaceGetFormatAttributeStride" }, // RenderingServer
- { "MeshSurfaceUpdateRegion", "MeshSurfaceUpdateAttributeRegion" }, // RenderingServer
- { "MoveToBottom", "MoveAfter" }, // Skeleton3D
- { "MoveToTop", "MoveBefore" }, // Skeleton3D
- { "MultimeshAllocate", "MultimeshAllocateData" }, // RenderingServer
- { "NormalmapToXy", "NormalMapToXy" }, // Image
- { "OffsetPolygon2d", "OffsetPolygon" }, // Geometry2D
- { "OffsetPolyline2d", "OffsetPolyline" }, // Geometry2D
- { "PercentDecode", "UriDecode" }, // String
- { "PercentEncode", "UriEncode" }, // String
- { "PinJointCreate", "JointMakePin" }, // PhysicsServer2D
- { "PopupCenteredMinsize", "PopupCenteredClamped" }, // Window
- { "PostImport", "_PostImport" }, // EditorScenePostImport
- { "PrintStrayNodes", "PrintOrphanNodes" }, // Node
- { "PropertyListChangedNotify", "NotifyPropertyListChanged" }, // Object
- { "Recognize", "_Recognize" }, // ResourceFormatLoader
- { "RegenNormalmaps", "RegenNormalMaps" }, // ArrayMesh
- { "Remove", "RemoveAt" }, // Array, broke Directory
- { "RemoveAnimation", "RemoveAnimationLibrary" }, // AnimationPlayer
- { "RemoveColorOverride", "RemoveThemeColorOverride" }, // Control
- { "RemoveConstantOverride", "RemoveThemeConstantOverride" }, // Control
- { "RemoveFontOverride", "RemoveThemeFontOverride" }, // Control
- { "RemoveSceneImportPlugin", "RemoveSceneFormatImporterPlugin" }, //EditorPlugin
- { "RemoveSpatialGizmoPlugin", "RemoveNode3dGizmoPlugin" }, // EditorPlugin
- { "RemoveStyleboxOverride", "RemoveThemeStyleboxOverride" }, // Control
- { "RenameAnimation", "RenameAnimationLibrary" }, // AnimationPlayer
- { "RenameDependencies", "_RenameDependencies" }, // ResourceFormatLoader
- { "SaveExternalData", "_SaveExternalData" }, // EditorPlugin
- { "SegmentIntersectsSegment2d", "SegmentIntersectsSegment" }, // Geometry2D
- { "SetAdjustmentEnable", "SetAdjustmentEnabled" }, // Environment
- { "SetAlt", "SetAltPressed" }, // InputEventWithModifiers
- { "SetAnchorAndMargin", "SetAnchorAndOffset" }, // Control
- { "SetAnchorsAndMarginsPreset", "SetAnchorsAndOffsetsPreset" }, // Control
- { "SetAnimationProcessMode", "SetProcessCallback" }, // AnimationPlayer
- { "SetAsBulkArray", "SetBuffer" }, // MultiMesh
- { "SetAsNormalmap", "SetAsNormalMap" }, // NoiseTexture
- { "SetAsToplevel", "SetAsTopLevel" }, // CanvasItem
- { "SetAudioBus", "SetAudioBusName" }, // Area3D
- { "SetAutowrap", "SetAutowrapMode" }, // Label broke AcceptDialog
- { "SetCastTo", "SetTargetPosition" }, // RayCast2D, RayCast3D
- { "SetCollisionLayerBit", "SetCollisionLayerValue" }, // CSGShape3D and a lot of others like GridMap
- { "SetCollisionMaskBit", "SetCollisionMaskValue" }, // CSGShape3D and a lot of others like GridMap
- { "SetColumnMinWidth", "SetColumnCustomMinimumWidth" }, // Tree
- { "SetCommand", "SetCommandPressed" }, // InputEventWithModifiers
- { "SetControl", "SetCtrlPressed" }, // InputEventWithModifiers
- { "SetCreateOptions", "_SetCreateOptions" }, // EditorResourcePicker
- { "SetCullMaskBit", "SetCullMaskValue" }, // Camera3D
- { "SetCursorPosition", "SetCaretColumn" }, // LineEdit
- { "SetD", "SetDistance" }, // WorldMarginShape2D
- { "SetDepthBiasEnable", "SetDepthBiasEnabled" }, // RDPipelineRasterizationState
- { "SetDevice", "SetOutputDevice" }, // AudioServer
- { "SetDoubleclick", "SetDoubleClick" }, // InputEventMouseButton
- { "SetEnableFollowSmoothing", "SetFollowSmoothingEnabled" }, // Camera2D
- { "SetEnabledFocusMode", "SetFocusMode" }, // BaseButton
- { "SetEndianSwap", "SetBigEndian" }, // File
- { "SetExpandToTextLength", "SetExpandToTextLengthEnabled" }, // LineEdit
- { "SetFocusNeighbour", "SetFocusNeighbor" }, // Control
- { "SetFollowSmoothing", "SetFollowSmoothingSpeed" }, // Camera2D
- { "SetFrameColor", "SetColor" }, // ColorRect
- { "SetGlobalRateScale", "SetPlaybackSpeedScale" }, // AudioServer
- { "SetGravityDistanceScale", "SetGravityPointDistanceScale" }, // Area2D
- { "SetGravityVector", "SetGravityDirection" }, // Area2D
- { "SetHDragEnabled", "SetDragHorizontalEnabled" }, // Camera2D
- { "SetIconAlign", "SetIconAlignment" }, // Button
- { "SetInteriorAmbient", "SetAmbientColor" }, // ReflectionProbe
- { "SetInteriorAmbientEnergy", "SetAmbientColorEnergy" }, // ReflectionProbe
- { "SetIsInitialized", "_IsInitialized" }, // XRInterface
- { "SetIsPrimary", "SetPrimary" }, // XRInterface
- { "SetIterationsPerSecond", "SetPhysicsTicksPerSecond" }, // Engine
- { "SetLayerMaskBit", "SetLayerMaskValue" }, // VisualInstance3D
- { "SetMarginsPreset", "SetOffsetsPreset" }, // Control
- { "SetMaxAtlasSize", "SetMaxTextureSize" }, // LightmapGI
- { "SetMetakey", "SetMetaPressed" }, // InputEventWithModifiers
- { "SetMidHeight", "SetHeight" }, // CapsuleMesh
- { "SetNeighborDist", "SetNeighborDistance" }, // NavigationAgent2D, NavigationAgent3D
- { "SetNetworkMaster", "SetMultiplayerAuthority" }, // Node
- { "SetNetworkPeer", "SetMultiplayerPeer" }, // Multiplayer API
- { "SetOneshot", "SetOneShot" }, // AnimatedTexture
- { "SetPhysicalScancode", "SetPhysicalKeycode" }, // InputEventKey
- { "SetProximityFade", "SetProximityFadeEnabled" }, // Material
- { "SetRefuseNewNetworkConnections", "SetRefuseNewConnections" }, // Multiplayer API
- { "SetRegion", "SetRegionEnabled" }, // Sprite2D, Sprite broke AtlasTexture
- { "SetRegionFilterClip", "SetRegionFilterClipEnabled" }, // Sprite2D
- { "SetReverbBus", "SetReverbBusName" }, // Area3D
- { "SetRotate", "SetRotates" }, // PathFollow2D
- { "SetScancode", "SetKeycode" }, // InputEventKey
- { "SetShift", "SetShiftPressed" }, // InputEventWithModifiers
- { "SetSizeOverride", "SetSize2dOverride" }, // SubViewport broke ImageTexture
- { "SetSizeOverrideStretch", "SetSize2dOverrideStretch" }, // SubViewport
- { "SetSlipsOnSlope", "SetSlideOnSlope" }, // SeparationRayShape2D, SeparationRayShape3D
- { "SetSortEnabled", "SetYSortEnabled" }, // Node2D
- { "SetSpaceOverrideMode", "SetGravitySpaceOverrideMode" }, // Area2D
- { "SetSpatialNode", "SetNode3d" }, // EditorNode3DGizmo
- { "SetSpeed", "SetVelocity" }, // InputEventMouseMotion
- { "SetSsaoEdgeSharpness", "SetSsaoSharpness" }, // Environment
- { "SetSurfaceMaterial", "SetSurfaceOverrideMaterial" }, // MeshInstance3D broke ImporterMesh
- { "SetTabAlign", "SetTabAlignment" }, //TabContainer
- { "SetTangent", "SurfaceSetTangent" }, // ImmediateGeometry broke SurfaceTool
- { "SetTextAlign", "SetTextAlignment" }, // Button
- { "SetTimerProcessMode", "SetTimerProcessCallback" }, // Timer
- { "SetTonemapAutoExposure", "SetTonemapAutoExposureEnabled" }, // Environment
- { "SetTranslation", "SetPosition" }, // Node3D - this broke GLTFNode which is used rarely
- { "SetUnitDb", "SetVolumeDb" }, // AudioStreamPlayer3D
- { "SetUnitOffset", "SetProgressRatio" }, // PathFollow2D, PathFollow3D
- { "SetUv2", "SurfaceSetUv2" }, // ImmediateMesh broke Surffacetool
- { "SetVDragEnabled", "SetDragVerticalEnabled" }, // Camera2D
- { "SetValign", "SetVerticalAlignment" }, // Label
- { "SetWindowLayout", "_SetWindowLayout" }, // EditorPlugin
- { "SetZfar", "SetFar" }, // Camera3D broke GLTFCamera
- { "SetZnear", "SetNear" }, // Camera3D broke GLTFCamera
- { "ShortcutMatch", "IsMatch" }, // InputEvent
- { "SkeletonAllocate", "SkeletonAllocateData" }, // RenderingServer
- { "SurfaceUpdateRegion", "SurfaceUpdateAttributeRegion" }, // ArrayMesh
- { "TargetingMethod", "TweenMethod" }, // Tween
- { "TargetingProperty", "TweenProperty" }, // Tween
- { "TrackRemoveKeyAtPosition", "TrackRemoveKeyAtTime" }, // Animation
- { "TriangulateDelaunay2d", "TriangulateDelaunay" }, // Geometry2D
- { "UnbindChildNodeFromBone", "RemoveBoneChild" }, // Skeleton3D
- { "Unselect", "Deselect" }, // ItemList
- { "UnselectAll", "DeselectAll" }, // ItemList
- { "UpdateConfigurationWarning", "UpdateConfigurationWarnings" }, // Node
- { "UpdateGizmo", "UpdateGizmos" }, // Node3D
- { "ViewportSetUseArvr", "ViewportSetUseXr" }, // RenderingServer
- { "WarpMousePosition", "WarpMouse" }, // Input
- { "WorldToMap", "LocalToMap" }, // TileMap, GridMap
- { "SetShaderParam", "SetShaderParameter" }, // ShaderMaterial
- { "GetShaderParam", "GetShaderParameter" }, // ShaderMaterial
- { "SetUniformName", "SetParameterName" }, // ParameterRef
- { "GetUniformName", "GetParameterName" }, // ParameterRef
-
- // Builtin types
- // { "Empty", "IsEmpty" }, // Array - Used as custom rule // Be careful, this will be used everywhere
- { "Clamped", "Clamp" }, // Vector2 // Be careful, this will be used everywhere
- { "GetRotationQuat", "GetRotationQuaternion" }, // Basis
- { "GrowMargin", "GrowSide" }, // Rect2
- { "Invert", "Reverse" }, // Array - TODO check // Be careful, this will be used everywhere
- { "IsAbsPath", "IsAbsolutePath" }, // String
- { "IsValidInteger", "IsValidInt" }, // String
- { "LinearInterpolate", "Lerp" }, // Color
- { "ToAscii", "ToAsciiBuffer" }, // String
- { "ToUtf8", "ToUtf8Buffer" }, // String
- { "ToWchar", "ToUtf32Buffer" }, // String // TODO - utf32 or utf16?
-
- // @GlobalScope
- { "Bytes2Var", "BytesToVar" },
- { "Bytes2VarWithObjects", "BytesToVarWithObjects" },
- { "Db2Linear", "DbToLinear" },
- { "Deg2Rad", "DegToRad" },
- { "Linear2Db", "LinearToDb" },
- { "Rad2Deg", "RadToDeg" },
- { "RandRange", "RandfRange" },
- { "RangeLerp", "Remap" },
- { "Stepify", "Snapped" },
- { "Str2Var", "StrToVar" },
- { "Var2Str", "VarToStr" },
- { "Var2Bytes", "VarToBytes" },
- { "Var2BytesWithObjects", "VarToBytesWithObjects" },
-
- // @GDScript
- { "Dict2Inst", "DictToInst" },
- { "Inst2Dict", "InstToDict" },
-
- { nullptr, nullptr },
-};
-
-// Some needs to be disabled, because users can use this names as variables
-const char *ProjectConverter3To4::gdscript_properties_renames[][2] = {
- // // { "d", "distance" }, //WorldMarginShape2D - TODO, looks that polish letters ą ę are treaten as space, not as letter, so `będą` are renamed to `będistanceą`
- // // {"alt","alt_pressed"}, // This may broke a lot of comments and user variables
- // // {"command","command_pressed"},// This may broke a lot of comments and user variables
- // // {"control","ctrl_pressed"},// This may broke a lot of comments and user variables
- // // {"extends","size"}, // BoxShape3D, LightmapGI broke ReflectionProbe
- // // {"meta","meta_pressed"},// This may broke a lot of comments and user variables
- // // {"pause_mode","process_mode"}, // Node - Cyclic rename, look for others
- // // {"rotate","rotates"}, // PathFollow2D - probably function exists with same name
- // // {"offset","progress"}, // PathFollow2D, PathFollow3D - Name is way too vague
- // // {"shift","shift_pressed"},// This may broke a lot of comments and user variables
- // { "autowrap", "autowrap_mode" }, // Label
- // { "cast_to", "target_position" }, // RayCast2D, RayCast3D
- // { "device", "output_device"}, // AudioServer - Too vague, most likely breaks comments & variables
- // { "doubleclick", "double_click" }, // InputEventMouseButton
- // { "group", "button_group" }, // BaseButton
- // { "process_mode", "process_callback" }, // AnimationTree, Camera2D
- // { "scancode", "keycode" }, // InputEventKey
- // { "toplevel", "top_level" }, // Node
- // { "window_title", "title" }, // Window
- // { "wrap_enabled", "wrap_mode" }, // TextEdit
- // { "zfar", "far" }, // Camera3D
- // { "znear", "near" }, // Camera3D
- // { "filename", "scene_file_path" }, // Node
- // { "pressed", "button_pressed" }, // BaseButton - Will also rename the signal, skipping for now
- { "as_normalmap", "as_normal_map" }, // NoiseTexture
- { "bbcode_text", "text" }, // RichTextLabel
- { "bg", "panel" }, // Theme
- { "bg_focus", "focus" }, // Theme
- { "capture_device", "input_device" }, // AudioServer
- { "caret_blink_speed", "caret_blink_interval" }, // TextEdit, LineEdit
- { "caret_moving_by_right_click", "caret_move_on_right_click" }, // TextEdit
- { "caret_position", "caret_column" }, // LineEdit
- { "check_vadjust", "check_v_offset" }, // Theme
- { "close_h_ofs", "close_h_offset" }, // Theme
- { "close_v_ofs", "close_v_offset" }, // Theme
- { "commentfocus", "comment_focus" }, // Theme
- { "contacts_reported", "max_contacts_reported" }, // RigidBody
- { "depth_bias_enable", "depth_bias_enabled" }, // RDPipelineRasterizationState
- { "drag_margin_bottom", "drag_bottom_margin" }, // Camera2D
- { "drag_margin_h_enabled", "drag_horizontal_enabled" }, // Camera2D
- { "drag_margin_left", "drag_left_margin" }, // Camera2D
- { "drag_margin_right", "drag_right_margin" }, // Camera2D
- { "drag_margin_top", "drag_top_margin" }, // Camera2D
- { "drag_margin_v_enabled", "drag_vertical_enabled" }, // Camera2D
- { "enabled_focus_mode", "focus_mode" }, // BaseButton - Removed
- { "extra_spacing_bottom", "spacing_bottom" }, // Font
- { "extra_spacing_top", "spacing_top" }, // Font
- { "focus_neighbour_bottom", "focus_neighbor_bottom" }, // Control
- { "focus_neighbour_left", "focus_neighbor_left" }, // Control
- { "focus_neighbour_right", "focus_neighbor_right" }, // Control
- { "focus_neighbour_top", "focus_neighbor_top" }, // Control
- { "follow_viewport_enable", "follow_viewport_enabled" }, // CanvasItem
- { "file_icon_modulate", "file_icon_color" }, // Theme
- { "files_disabled", "file_disabled_color" }, // Theme
- { "folder_icon_modulate", "folder_icon_color" }, // Theme
- { "global_rate_scale", "playback_speed_scale" }, // AudioServer
- { "gravity_distance_scale", "gravity_point_unit_distance" }, // Area(2D/3D)
- { "gravity_vec", "gravity_direction" }, // Area(2D/3D)
- { "hint_tooltip", "tooltip_text" }, // Control
- { "hseparation", "h_separation" }, // Theme
- { "icon_align", "icon_alignment" }, // Button
- { "iterations_per_second", "physics_ticks_per_second" }, // Engine
- { "invert_enable", "invert_enabled" }, // Polygon2D
- { "margin_bottom", "offset_bottom" }, // Control broke NinePatchRect, StyleBox
- { "margin_left", "offset_left" }, // Control broke NinePatchRect, StyleBox
- { "margin_right", "offset_right" }, // Control broke NinePatchRect, StyleBox
- { "margin_top", "offset_top" }, // Control broke NinePatchRect, StyleBox
- { "mid_height", "height" }, // CapsuleMesh
- { "neighbor_dist", "neighbor_distance" }, // NavigationAgent2D, NavigationAgent3D
- { "offset_h", "drag_horizontal_offset" }, // Camera2D
- { "offset_v", "drag_vertical_offset" }, // Camera2D
- { "off", "unchecked" }, // Theme
- { "off_disabled", "unchecked_disabled" }, // Theme
- { "ofs", "offset" }, // Theme
- { "on", "checked" }, // Theme
- { "on_disabled", "checked_disabled" }, // Theme
- { "oneshot", "one_shot" }, // AnimatedTexture
- { "out_of_range_mode", "max_polyphony" }, // AudioStreamPlayer3D
- { "pause_mode", "process_mode" }, // Node
- { "physical_scancode", "physical_keycode" }, // InputEventKey
- { "popup_exclusive", "exclusive" }, // Window
- { "proximity_fade_enable", "proximity_fade_enabled" }, // Material
- { "rect_position", "position" }, // Control
- { "rect_global_position", "global_position" }, // Control
- { "rect_size", "size" }, // Control
- { "rect_min_size", "custom_minimum_size" }, // Control
- { "rect_rotation", "rotation" }, // Control
- { "rect_scale", "scale" }, // Control
- { "rect_pivot_offset", "pivot_offset" }, // Control
- { "rect_clip_content", "clip_contents" }, // Control
- { "refuse_new_network_connections", "refuse_new_connections" }, // MultiplayerAPI
- { "region_filter_clip", "region_filter_clip_enabled" }, // Sprite2D
- { "reverb_bus_enable", "reverb_bus_enabled" }, // Area3D
- { "selectedframe", "selected_frame" }, // Theme
- { "size_override_stretch", "size_2d_override_stretch" }, // SubViewport
- { "slips_on_slope", "slide_on_slope" }, // SeparationRayShape2D
- { "smoothing_enabled", "follow_smoothing_enabled" }, // Camera2D
- { "smoothing_speed", "position_smoothing_speed" }, // Camera2D
- { "ss_reflections_depth_tolerance", "ssr_depth_tolerance" }, // Environment
- { "ss_reflections_enabled", "ssr_enabled" }, // Environment
- { "ss_reflections_fade_in", "ssr_fade_in" }, // Environment
- { "ss_reflections_fade_out", "ssr_fade_out" }, // Environment
- { "ss_reflections_max_steps", "ssr_max_steps" }, // Environment
- { "state_machine_selectedframe", "state_machine_selected_frame" }, // Theme
- { "syntax_highlighting", "syntax_highlighter" }, // TextEdit
- { "tab_align", "tab_alignment" }, // TabContainer
- { "table_hseparation", "table_h_separation" }, // Theme
- { "table_vseparation", "table_v_separation" }, // Theme
- { "translation", "position" }, // Node3D - broke GLTFNode
- { "unit_db", "volume_db" }, // AudioStreamPlayer3D
- { "unit_offset", "progress_ratio" }, // PathFollow2D, PathFollow3D
- { "vseparation", "v_separation" }, // Theme
- { "frames", "sprite_frames" }, // AnimatedSprite2D, AnimatedSprite3D
-
- { nullptr, nullptr },
-};
-
-// Some needs to be disabled, because users can use this names as variables
-const char *ProjectConverter3To4::csharp_properties_renames[][2] = {
- // // { "D", "Distance" }, //WorldMarginShape2D - TODO, looks that polish letters ą ę are treaten as space, not as letter, so `będą` are renamed to `będistanceą`
- // // {"Alt","AltPressed"}, // This may broke a lot of comments and user variables
- // // {"Command","CommandPressed"},// This may broke a lot of comments and user variables
- // // {"Control","CtrlPressed"},// This may broke a lot of comments and user variables
- // // {"Extends","Size"}, // BoxShape3D, LightmapGI broke ReflectionProbe
- // // {"Meta","MetaPressed"},// This may broke a lot of comments and user variables
- // // {"PauseMode","ProcessMode"}, // Node - Cyclic rename, look for others
- // // {"Rotate","Rotates"}, // PathFollow2D - probably function exists with same name
- // // {"Offset","Progress"}, // PathFollow2D, PathFollow3D - Name is way too vague
- // // {"Shift","ShiftPressed"},// This may broke a lot of comments and user variables
- // { "Autowrap", "AutowrapMode" }, // Label
- // { "CastTo", "TargetPosition" }, // RayCast2D, RayCast3D
- // { "Doubleclick", "DoubleClick" }, // InputEventMouseButton
- // { "Group", "ButtonGroup" }, // BaseButton
- // { "PercentVisible, "ShowPercentage}, // ProgressBar, conflicts with Label and RichTextLabel, but may be a worth it.
- // { "ProcessMode", "ProcessCallback" }, // AnimationTree, Camera2D
- // { "Scancode", "Keycode" }, // InputEventKey
- // { "Toplevel", "TopLevel" }, // Node
- // { "WindowTitle", "Title" }, // Window
- // { "WrapEnabled", "WrapMode" }, // TextEdit
- // { "Zfar", "Far" }, // Camera3D
- // { "Znear", "Near" }, // Camera3D
- // { "Pressed", "ButtonPressed" }, // BaseButton - Will also rename the signal, skipping for now
- { "AsNormalmap", "AsNormalMap" }, // NoiseTexture
- { "BbcodeText", "Text" }, // RichTextLabel
- { "CaretBlinkSpeed", "CaretBlinkInterval" }, // TextEdit, LineEdit
- { "CaretMovingByRightClick", "CaretMoveOnRightClick" }, // TextEdit
- { "CaretPosition", "CaretColumn" }, // LineEdit
- { "CheckVadjust", "CheckVAdjust" }, // Theme
- { "CloseHOfs", "CloseHOffset" }, // Theme
- { "CloseVOfs", "CloseVOffset" }, // Theme
- { "Commentfocus", "CommentFocus" }, // Theme
- { "DepthBiasEnable", "DepthBiasEnabled" }, // RDPipelineRasterizationState
- { "DragMarginBottom", "DragBottomMargin" }, // Camera2D
- { "DragMarginHEnabled", "DragHorizontalEnabled" }, // Camera2D
- { "DragMarginLeft", "DragLeftMargin" }, // Camera2D
- { "DragMarginRight", "DragRightMargin" }, // Camera2D
- { "DragMarginTop", "DragTopMargin" }, // Camera2D
- { "DragMarginVEnabled", "DragVerticalEnabled" }, // Camera2D
- { "EnabledFocusMode", "FocusMode" }, // BaseButton - Removed
- { "ExtraSpacingBottom", "SpacingBottom" }, // Font
- { "ExtraSpacingTop", "SpacingTop" }, // Font
- { "FocusNeighbourBottom", "FocusNeighborBottom" }, // Control
- { "FocusNeighbourLeft", "FocusNeighborLeft" }, // Control
- { "FocusNeighbourRight", "FocusNeighborRight" }, // Control
- { "FocusNeighbourTop", "FocusNeighborTop" }, // Control
- { "FollowViewportEnable", "FollowViewportEnabled" }, // CanvasItem
- { "GlobalRateScale", "PlaybackSpeedScale" }, // AudioServer
- { "GravityDistanceScale", "GravityPointDistanceScale" }, // Area2D
- { "GravityVec", "GravityDirection" }, // Area2D
- { "HintTooltip", "TooltipText" }, // Control
- { "Hseparation", "HSeparation" }, // Theme
- { "IconAlign", "IconAlignment" }, // Button
- { "IterationsPerSecond", "PhysicsTicksPerSecond" }, // Engine
- { "InvertEnable", "InvertEnabled" }, // Polygon2D
- { "MarginBottom", "OffsetBottom" }, // Control broke NinePatchRect, StyleBox
- { "MarginLeft", "OffsetLeft" }, // Control broke NinePatchRect, StyleBox
- { "MarginRight", "OffsetRight" }, // Control broke NinePatchRect, StyleBox
- { "MarginTop", "OffsetTop" }, // Control broke NinePatchRect, StyleBox
- { "MidHeight", "Height" }, // CapsuleMesh
- { "NeighborDist", "NeighborDistance" }, // NavigationAgent2D, NavigationAgent3D
- { "OffsetH", "DragHorizontalOffset" }, // Camera2D
- { "OffsetV", "DragVerticalOffset" }, // Camera2D
- { "Ofs", "Offset" }, // Theme
- { "Oneshot", "OneShot" }, // AnimatedTexture
- { "OutOfRangeMode", "MaxPolyphony" }, // AudioStreamPlayer3D
- { "PauseMode", "ProcessMode" }, // Node
- { "PhysicalScancode", "PhysicalKeycode" }, // InputEventKey
- { "PopupExclusive", "Exclusive" }, // Window
- { "ProximityFadeEnable", "ProximityFadeEnabled" }, // Material
- { "RectPosition", "Position" }, // Control
- { "RectGlobalPosition", "GlobalPosition" }, // Control
- { "RectSize", "Size" }, // Control
- { "RectMinSize", "CustomMinimumSize" }, // Control
- { "RectRotation", "Rotation" }, // Control
- { "RectScale", "Scale" }, // Control
- { "RectPivotOffset", "PivotOffset" }, // Control
- { "RectClipContent", "ClipContents" }, // Control
- { "RefuseNewNetworkConnections", "RefuseNewConnections" }, // MultiplayerAPI
- { "RegionFilterClip", "RegionFilterClipEnabled" }, // Sprite2D
- { "ReverbBusEnable", "ReverbBusEnabled" }, // Area3D
- { "Selectedframe", "SelectedFrame" }, // Theme
- { "SizeOverrideStretch", "Size2dOverrideStretch" }, // SubViewport
- { "SlipsOnSlope", "SlideOnSlope" }, // SeparationRayShape2D
- { "SmoothingEnabled", "FollowSmoothingEnabled" }, // Camera2D
- { "SmoothingSpeed", "FollowSmoothingSpeed" }, // Camera2D
- { "SsReflectionsDepthTolerance", "SsrDepthTolerance" }, // Environment
- { "SsReflectionsEnabled", "SsrEnabled" }, // Environment
- { "SsReflectionsFadeIn", "SsrFadeIn" }, // Environment
- { "SsReflectionsFadeOut", "SsrFadeOut" }, // Environment
- { "SsReflectionsMaxSteps", "SsrMaxSteps" }, // Environment
- { "StateMachineSelectedframe", "StateMachineSelectedFrame" }, // Theme
- { "SyntaxHighlighting", "SyntaxHighlighter" }, // TextEdit
- { "TabAlign", "TabAlignment" }, // TabContainer
- { "TableHseparation", "TableHSeparation" }, // Theme
- { "TableVseparation", "TableVSeparation" }, // Theme
- { "Translation", "Position" }, // Node3D - broke GLTFNode
- { "UnitDb", "VolumeDb" }, // AudioStreamPlayer3D
- { "UnitOffset", "ProgressRatio" }, // PathFollow2D, PathFollow3D
- { "Vseparation", "VSeparation" }, // Theme
-
- { nullptr, nullptr },
-};
-
-const char *ProjectConverter3To4::gdscript_signals_renames[][2] = {
- // {"instantiate","instance"}, // FileSystemDock
- // { "hide", "hidden" }, // CanvasItem - function with same name exists
- // { "tween_all_completed","loop_finished"}, // Tween - TODO, not sure
- // {"changed","settings_changed"}, // EditorSettings
- { "about_to_show", "about_to_popup" }, // Popup
- { "button_release", "button_released" }, // XRController3D
- { "cancelled", "canceled" }, // AcceptDialog
- { "item_double_clicked", "item_icon_double_clicked" }, // Tree
- { "network_peer_connected", "peer_connected" }, // MultiplayerAPI
- { "network_peer_disconnected", "peer_disconnected" }, // MultiplayerAPI
- { "network_peer_packet", "peer_packet" }, // MultiplayerAPI
- { "node_unselected", "node_deselected" }, // GraphEdit
- { "offset_changed", "position_offset_changed" }, // GraphNode
- { "settings_changed", "changed" }, // TileMap broke EditorSettings
- { "skeleton_updated", "pose_updated" }, //
- { "tab_close", "tab_closed" }, // TextEdit
- { "tab_hover", "tab_hovered" }, // TextEdit
- { "text_entered", "text_submitted" }, // LineEdit
- { "tween_completed", "finished" }, // Tween
- { "tween_step", "step_finished" }, // Tween
-
- { nullptr, nullptr },
-};
-
-const char *ProjectConverter3To4::csharp_signals_renames[][2] = {
- // {"Instantiate","Instance"}, // FileSystemDock
- // { "Hide", "Hidden" }, // CanvasItem - function with same name exists
- // { "TweenAllCompleted","LoopFinished"}, // Tween - TODO, not sure
- // {"Changed","SettingsChanged"}, // EditorSettings
- { "AboutToShow", "AboutToPopup" }, // Popup
- { "ButtonRelease", "ButtonReleased" }, // XRController3D
- { "NetworkPeerConnected", "PeerConnected" }, // MultiplayerAPI
- { "NetworkPeerDisconnected", "PeerDisconnected" }, // MultiplayerAPI
- { "NetworkPeerPacket", "PeerPacket" }, // MultiplayerAPI
- { "NodeUnselected", "NodeDeselected" }, // GraphEdit
- { "OffsetChanged", "PositionOffsetChanged" }, // GraphNode
- { "SettingsChanged", "Changed" }, // TileMap broke EditorSettings
- { "SkeletonUpdated", "PoseUpdated" }, //
- { "TabClose", "TabClosed" }, // TextEdit
- { "TabHover", "TabHovered" }, // TextEdit
- { "TextEntered", "TextSubmitted" }, // LineEdit
- { "TweenCompleted", "Finished" }, // Tween
- { "TweenStep", "StepFinished" }, // Tween
-
- { nullptr, nullptr },
-
-};
-
-const char *ProjectConverter3To4::project_settings_renames[][2] = {
- { "audio/channel_disable_threshold_db", "audio/buses/channel_disable_threshold_db" },
- { "audio/channel_disable_time", "audio/buses/channel_disable_time" },
- { "audio/default_bus_layout", "audio/buses/default_bus_layout" },
- { "audio/driver", "audio/driver/driver" },
- { "audio/enable_audio_input", "audio/driver/enable_input" },
- { "audio/mix_rate", "audio/driver/mix_rate" },
- { "audio/output_latency", "audio/driver/output_latency" },
- { "audio/output_latency.web", "audio/driver/output_latency.web" },
- { "audio/video_delay_compensation_ms", "audio/video/video_delay_compensation_ms" },
- { "display/window/vsync/use_vsync", "display/window/vsync/vsync_mode" },
- { "editor/main_run_args", "editor/run/main_run_args" },
- { "gui/common/swap_ok_cancel", "gui/common/swap_cancel_ok" },
- { "network/limits/debugger_stdout/max_chars_per_second", "network/limits/debugger/max_chars_per_second" },
- { "network/limits/debugger_stdout/max_errors_per_second", "network/limits/debugger/max_errors_per_second" },
- { "network/limits/debugger_stdout/max_messages_per_frame", "network/limits/debugger/max_queued_messages" },
- { "network/limits/debugger_stdout/max_warnings_per_second", "network/limits/debugger/max_warnings_per_second" },
- { "network/ssl/certificates", "network/tls/certificate_bundle_override" },
- { "physics/2d/thread_model", "physics/2d/run_on_thread" }, // TODO not sure
- { "rendering/environment/default_clear_color", "rendering/environment/defaults/default_clear_color" },
- { "rendering/environment/default_environment", "rendering/environment/defaults/default_environment" },
- { "rendering/quality/depth_prepass/disable_for_vendors", "rendering/driver/depth_prepass/disable_for_vendors" },
- { "rendering/quality/depth_prepass/enable", "rendering/driver/depth_prepass/enable" },
- { "rendering/quality/shading/force_blinn_over_ggx", "rendering/shading/overrides/force_blinn_over_ggx" },
- { "rendering/quality/shading/force_blinn_over_ggx.mobile", "rendering/shading/overrides/force_blinn_over_ggx.mobile" },
- { "rendering/quality/shading/force_lambert_over_burley", "rendering/shading/overrides/force_lambert_over_burley" },
- { "rendering/quality/shading/force_lambert_over_burley.mobile", "rendering/shading/overrides/force_lambert_over_burley.mobile" },
- { "rendering/quality/shading/force_vertex_shading", "rendering/shading/overrides/force_vertex_shading" },
- { "rendering/quality/shading/force_vertex_shading.mobile", "rendering/shading/overrides/force_vertex_shading.mobile" },
- { "rendering/quality/shadow_atlas/quadrant_0_subdiv", "rendering/lights_and_shadows/shadow_atlas/quadrant_0_subdiv" },
- { "rendering/quality/shadow_atlas/quadrant_1_subdiv", "rendering/lights_and_shadows/shadow_atlas/quadrant_1_subdiv" },
- { "rendering/quality/shadow_atlas/quadrant_2_subdiv", "rendering/lights_and_shadows/shadow_atlas/quadrant_2_subdiv" },
- { "rendering/quality/shadow_atlas/quadrant_3_subdiv", "rendering/lights_and_shadows/shadow_atlas/quadrant_3_subdiv" },
- { "rendering/quality/shadow_atlas/size", "rendering/lights_and_shadows/shadow_atlas/size" },
- { "rendering/quality/shadow_atlas/size.mobile", "rendering/lights_and_shadows/shadow_atlas/size.mobile" },
- { "rendering/vram_compression/import_etc2", "rendering/textures/vram_compression/import_etc2_astc" },
- { "rendering/vram_compression/import_s3tc", "rendering/textures/vram_compression/import_s3tc_bptc" },
- { "window/size/width", "window/size/viewport_width" },
- { "window/size/height", "window/size/viewport_height" },
- { "window/size/test_width", "window/size/window_width_override" },
- { "window/size/test_height", "window/size/window_height_override" },
-
- { nullptr, nullptr },
-};
-
-const char *ProjectConverter3To4::input_map_renames[][2] = {
- { ",\"alt\":", ",\"alt_pressed\":" },
- { ",\"shift\":", ",\"shift_pressed\":" },
- { ",\"control\":", ",\"ctrl_pressed\":" },
- { ",\"meta\":", ",\"meta_pressed\":" },
- { ",\"scancode\":", ",\"keycode\":" },
- { ",\"physical_scancode\":", ",\"physical_keycode\":" },
- { ",\"doubleclick\":", ",\"double_click\":" },
-
- { nullptr, nullptr },
-};
-
-const char *ProjectConverter3To4::builtin_types_renames[][2] = {
- { "PoolByteArray", "PackedByteArray" },
- { "PoolColorArray", "PackedColorArray" },
- { "PoolIntArray", "PackedInt32Array" },
- { "PoolRealArray", "PackedFloat32Array" },
- { "PoolStringArray", "PackedStringArray" },
- { "PoolVector2Array", "PackedVector2Array" },
- { "PoolVector3Array", "PackedVector3Array" },
- { "Quat", "Quaternion" },
- { "Transform", "Transform3D" },
-
- { nullptr, nullptr },
-};
-
-const char *ProjectConverter3To4::shaders_renames[][2] = {
- { "ALPHA_SCISSOR", "ALPHA_SCISSOR_THRESHOLD" },
- { "CAMERA_MATRIX", "INV_VIEW_MATRIX" },
- { "INV_CAMERA_MATRIX", "VIEW_MATRIX" },
- { "NORMALMAP", "NORMAL_MAP" },
- { "NORMALMAP_DEPTH", "NORMAL_MAP_DEPTH" },
- { "TRANSMISSION", "BACKLIGHT" },
- { "WORLD_MATRIX", "MODEL_MATRIX" },
- { "depth_draw_alpha_prepass", "depth_draw_opaque" },
- { "hint_albedo", "source_color" },
- { "hint_aniso", "hint_anisotropy" },
- { "hint_black", "hint_default_black" },
- { "hint_black_albedo", "hint_default_black" },
- { "hint_color", "source_color" },
- { "hint_white", "hint_default_white" },
- { nullptr, nullptr },
-};
-
-const char *ProjectConverter3To4::class_renames[][2] = {
- // { "BulletPhysicsDirectBodyState", "BulletPhysicsDirectBodyState3D" }, // Class is not visible in ClassDB
- // { "BulletPhysicsServer", "BulletPhysicsServer3D" }, // Class is not visible in ClassDB
- // { "GDScriptFunctionState", "Node3D" }, // TODO - not sure to which should be changed
- // { "GDScriptNativeClass", "Node3D" }, // TODO - not sure to which should be changed
- // { "InputDefault",""}, // TODO ?
- // { "Physics2DDirectBodyStateSW", "GodotPhysicsDirectBodyState2D" }, // Class is not visible in ClassDB
- // { "Physics2DShapeQueryResult", "PhysicsShapeQueryResult2D" }, // Class is not visible in ClassDB
- // { "PhysicsShapeQueryResult", "PhysicsShapeQueryResult3D" }, // Class is not visible in ClassDB
- // { "NativeScript","GDExtension"}, ??
- { "ARVRAnchor", "XRAnchor3D" },
- { "ARVRCamera", "XRCamera3D" },
- { "ARVRController", "XRController3D" },
- { "ARVRInterface", "XRInterface" },
- { "ARVRInterfaceGDNative", "Node3D" },
- { "ARVROrigin", "XROrigin3D" },
- { "ARVRPositionalTracker", "XRPositionalTracker" },
- { "ARVRServer", "XRServer" },
- { "AStar", "AStar3D" },
- { "AnimatedSprite", "AnimatedSprite2D" },
- { "AnimationTreePlayer", "AnimationTree" },
- { "Area", "Area3D" }, // Be careful, this will be used everywhere
- { "AudioStreamOGGVorbis", "AudioStreamOggVorbis" },
- { "AudioStreamRandomPitch", "AudioStreamRandomizer" },
- { "AudioStreamSample", "AudioStreamWAV" },
- { "BakedLightmap", "LightmapGI" },
- { "BakedLightmapData", "LightmapGIData" },
- { "BitmapFont", "FontFile" },
- { "BoneAttachment", "BoneAttachment3D" },
- { "BoxShape", "BoxShape3D" },
- { "CPUParticles", "CPUParticles3D" },
- { "CSGBox", "CSGBox3D" },
- { "CSGCombiner", "CSGCombiner3D" },
- { "CSGCylinder", "CSGCylinder3D" },
- { "CSGMesh", "CSGMesh3D" },
- { "CSGPolygon", "CSGPolygon3D" },
- { "CSGPrimitive", "CSGPrimitive3D" },
- { "CSGShape", "CSGShape3D" },
- { "CSGSphere", "CSGSphere3D" },
- { "CSGTorus", "CSGTorus3D" },
- { "Camera", "Camera3D" }, // Be careful, this will be used everywhere
- { "CapsuleShape", "CapsuleShape3D" },
- { "ClippedCamera", "Camera3D" },
- { "CollisionObject", "CollisionObject3D" },
- { "CollisionPolygon", "CollisionPolygon3D" },
- { "CollisionShape", "CollisionShape3D" },
- { "ConcavePolygonShape", "ConcavePolygonShape3D" },
- { "ConeTwistJoint", "ConeTwistJoint3D" },
- { "ConvexPolygonShape", "ConvexPolygonShape3D" },
- { "CubeMap", "Cubemap" },
- { "CubeMesh", "BoxMesh" },
- { "CylinderShape", "CylinderShape3D" },
- { "DirectionalLight", "DirectionalLight3D" },
- { "DynamicFont", "FontFile" },
- { "DynamicFontData", "FontFile" },
- { "EditorNavigationMeshGenerator", "NavigationMeshGenerator" },
- { "EditorSceneImporter", "EditorSceneFormatImporter" },
- { "EditorSceneImporterFBX", "EditorSceneFormatImporterFBX" },
- { "EditorSceneImporterGLTF", "EditorSceneFormatImporterGLTF" },
- { "EditorSpatialGizmo", "EditorNode3DGizmo" },
- { "EditorSpatialGizmoPlugin", "EditorNode3DGizmoPlugin" },
- { "ExternalTexture", "ImageTexture" },
- { "FuncRef", "Callable" },
- { "GIProbe", "VoxelGI" },
- { "GIProbeData", "VoxelGIData" },
- { "Generic6DOFJoint", "Generic6DOFJoint3D" },
- { "Geometry", "Geometry2D" }, // Geometry class is split between Geometry2D and Geometry3D so we need to choose one
- { "GeometryInstance", "GeometryInstance3D" },
- { "GradientTexture", "GradientTexture2D" },
- { "HeightMapShape", "HeightMapShape3D" },
- { "HingeJoint", "HingeJoint3D" },
- { "IP_Unix", "IPUnix" },
- { "ImmediateGeometry", "ImmediateMesh" },
- { "ImmediateGeometry3D", "ImmediateMesh" },
- { "InterpolatedCamera", "Camera3D" },
- { "InterpolatedCamera3D", "Camera3D" },
- { "JSONParseResult", "JSON" },
- { "Joint", "Joint3D" },
- { "KinematicBody", "CharacterBody3D" },
- { "KinematicBody2D", "CharacterBody2D" },
- { "KinematicCollision", "KinematicCollision3D" },
- { "LargeTexture", "ImageTexture" },
- { "Light", "Light3D" },
- { "Light2D", "PointLight2D" },
- { "LineShape2D", "WorldBoundaryShape2D" },
- { "Listener", "AudioListener3D" },
- { "Listener2D", "AudioListener2D" },
- { "MeshInstance", "MeshInstance3D" },
- { "MultiMeshInstance", "MultiMeshInstance3D" },
- { "MultiplayerPeerGDNative", "MultiplayerPeerExtension" },
- { "Navigation", "Node3D" },
- { "Navigation2D", "Node2D" },
- { "Navigation2DServer", "NavigationServer2D" },
- { "Navigation3D", "Node3D" },
- { "NavigationAgent", "NavigationAgent3D" },
- { "NavigationMeshInstance", "NavigationRegion3D" },
- { "NavigationObstacle", "NavigationObstacle3D" },
- { "NavigationPolygonInstance", "NavigationRegion2D" },
- { "NavigationRegion", "NavigationRegion3D" },
- { "NavigationServer", "NavigationServer3D" },
- { "NetworkedMultiplayerENet", "ENetMultiplayerPeer" },
- { "NetworkedMultiplayerPeer", "MultiplayerPeer" },
- { "Occluder", "OccluderInstance3D" },
- { "OmniLight", "OmniLight3D" },
- { "PHashTranslation", "OptimizedTranslation" },
- { "PacketPeerGDNative", "PacketPeerExtension" },
- { "PanoramaSky", "Sky" },
- { "Particles", "GPUParticles3D" }, // Be careful, this will be used everywhere
- { "Particles2D", "GPUParticles2D" },
- { "ParticlesMaterial", "ParticleProcessMaterial" },
- { "Path", "Path3D" }, // Be careful, this will be used everywhere
- { "PathFollow", "PathFollow3D" },
- { "PhysicalBone", "PhysicalBone3D" },
- { "Physics2DDirectBodyState", "PhysicsDirectBodyState2D" },
- { "Physics2DDirectSpaceState", "PhysicsDirectSpaceState2D" },
- { "Physics2DServer", "PhysicsServer2D" },
- { "Physics2DServerSW", "GodotPhysicsServer2D" },
- { "Physics2DShapeQueryParameters", "PhysicsShapeQueryParameters2D" },
- { "Physics2DTestMotionResult", "PhysicsTestMotionResult2D" },
- { "PhysicsBody", "PhysicsBody3D" },
- { "PhysicsDirectBodyState", "PhysicsDirectBodyState3D" },
- { "PhysicsDirectSpaceState", "PhysicsDirectSpaceState3D" },
- { "PhysicsServer", "PhysicsServer3D" },
- { "PhysicsShapeQueryParameters", "PhysicsShapeQueryParameters3D" },
- { "PhysicsTestMotionResult", "PhysicsTestMotionResult3D" },
- { "PinJoint", "PinJoint3D" },
- { "PlaneShape", "WorldBoundaryShape3D" },
- { "PopupDialog", "Popup" },
- { "Position2D", "Marker2D" },
- { "Position3D", "Marker3D" },
- { "ProceduralSky", "Sky" },
- { "RayCast", "RayCast3D" },
- { "RayShape", "SeparationRayShape3D" },
- { "RayShape2D", "SeparationRayShape2D" },
- { "Reference", "RefCounted" }, // Be careful, this will be used everywhere
- { "RemoteTransform", "RemoteTransform3D" },
- { "ResourceInteractiveLoader", "ResourceLoader" },
- { "RigidBody", "RigidBody3D" },
- { "SceneTreeTween", "Tween" },
- { "Shape", "Shape3D" }, // Be careful, this will be used everywhere
- { "ShortCut", "Shortcut" },
- { "Skeleton", "Skeleton3D" },
- { "SkeletonIK", "SkeletonIK3D" },
- { "SliderJoint", "SliderJoint3D" },
- { "SoftBody", "SoftBody3D" },
- { "Spatial", "Node3D" },
- { "SpatialGizmo", "Node3DGizmo" },
- { "SpatialMaterial", "StandardMaterial3D" },
- { "SphereShape", "SphereShape3D" },
- { "SpotLight", "SpotLight3D" },
- { "SpringArm", "SpringArm3D" },
- { "Sprite", "Sprite2D" },
- { "StaticBody", "StaticBody3D" },
- { "StreamCubemap", "CompressedCubemap" },
- { "StreamCubemapArray", "CompressedCubemapArray" },
- { "StreamPeerGDNative", "StreamPeerExtension" },
- { "StreamPeerSSL", "StreamPeerTLS" },
- { "StreamTexture", "CompressedTexture2D" },
- { "StreamTexture2D", "CompressedTexture2D" },
- { "StreamTexture2DArray", "CompressedTexture2DArray" },
- { "StreamTextureLayered", "CompressedTextureLayered" },
- { "TCP_Server", "TCPServer" },
- { "Tabs", "TabBar" }, // Be careful, this will be used everywhere
- { "TextFile", "Node3D" },
- { "Texture", "Texture2D" }, // May broke TextureRect
- { "TextureArray", "Texture2DArray" },
- { "TextureProgress", "TextureProgressBar" },
- { "ToolButton", "Button" },
- { "VehicleBody", "VehicleBody3D" },
- { "VehicleWheel", "VehicleWheel3D" },
- { "VideoPlayer", "VideoStreamPlayer" },
- { "Viewport", "SubViewport" },
- { "ViewportContainer", "SubViewportContainer" },
- { "VisibilityEnabler", "VisibleOnScreenEnabler3D" },
- { "VisibilityEnabler2D", "VisibleOnScreenEnabler2D" },
- { "VisibilityNotifier", "VisibleOnScreenNotifier3D" },
- { "VisibilityNotifier2D", "VisibleOnScreenNotifier2D" },
- { "VisibilityNotifier3D", "VisibleOnScreenNotifier3D" },
- { "VisualInstance", "VisualInstance3D" },
- { "VisualServer", "RenderingServer" },
- { "VisualShaderNodeCubeMap", "VisualShaderNodeCubemap" },
- { "VisualShaderNodeScalarClamp", "VisualShaderNodeClamp" },
- { "VisualShaderNodeScalarConstant", "VisualShaderNodeFloatConstant" },
- { "VisualShaderNodeScalarFunc", "VisualShaderNodeFloatFunc" },
- { "VisualShaderNodeScalarInterp", "VisualShaderNodeMix" },
- { "VisualShaderNodeScalarOp", "VisualShaderNodeFloatOp" },
- { "VisualShaderNodeScalarSmoothStep", "VisualShaderNodeSmoothStep" },
- { "VisualShaderNodeScalarSwitch", "VisualShaderNodeSwitch" },
- { "VisualShaderNodeScalarTransformMult", "VisualShaderNodeTransformOp" },
- { "VisualShaderNodeTransformMult", "VisualShaderNode" },
- { "VisualShaderNodeVectorClamp", "VisualShaderNodeClamp" },
- { "VisualShaderNodeVectorInterp", "VisualShaderNodeMix" },
- { "VisualShaderNodeVectorScalarMix", "VisualShaderNodeMix" },
- { "VisualShaderNodeVectorScalarSmoothStep", "VisualShaderNodeSmoothStep" },
- { "VisualShaderNodeVectorScalarStep", "VisualShaderNodeStep" },
- { "VisualShaderNodeVectorSmoothStep", "VisualShaderNodeSmoothStep" },
- { "VisualShaderNodeBooleanUniform", "VisualShaderNodeBooleanParameter" },
- { "VisualShaderNodeColorUniform", "VisualShaderNodeColorParameter" },
- { "VisualShaderNodeScalarUniform", "VisualShaderNodeFloatParameter" },
- { "VisualShaderNodeCubemapUniform", "VisualShaderNodeCubemapParameter" },
- { "VisualShaderNodeTextureUniform", "VisualShaderNodeTexture2DParameter" },
- { "VisualShaderNodeTextureUniformTriplanar", "VisualShaderNodeTextureParameterTriplanar" },
- { "VisualShaderNodeTransformUniform", "VisualShaderNodeTransformParameter" },
- { "VisualShaderNodeVec3Uniform", "VisualShaderNodeVec3Parameter" },
- { "VisualShaderNodeUniform", "VisualShaderNodeParameter" },
- { "VisualShaderNodeUniformRef", "VisualShaderNodeParameterRef" },
- { "WebRTCDataChannelGDNative", "WebRTCDataChannelExtension" },
- { "WebRTCMultiplayer", "WebRTCMultiplayerPeer" },
- { "WebRTCPeerConnectionGDNative", "WebRTCPeerConnectionExtension" },
- { "WindowDialog", "Window" },
- { "World", "World3D" }, // Be careful, this will be used everywhere
- { "XRAnchor", "XRAnchor3D" },
- { "XRController", "XRController3D" },
- { "XROrigin", "XROrigin3D" },
- { "YSort", "Node2D" },
-
- { "CullInstance", "Node3D" }, // Probably this type needs to be added to Godot 4.0, since it is for now only available only in Godot 3.x
- { "RoomGroup", "Node3D" }, // Probably this type needs to be added to Godot 4.0, since it is for now only available only in Godot 3.x
- { "Room", "Node3D" }, // Probably this type needs to be added to Godot 4.0, since it is for now only available only in Godot 3.x
- { "RoomManager", "Node3D" }, // Probably this type needs to be added to Godot 4.0, since it is for now only available only in Godot 3.x
- { "Portal", "Node3D" }, // Probably this type needs to be added to Godot 4.0, since it is for now only available only in Godot 3.x
-
- { nullptr, nullptr },
-};
-
-const char *ProjectConverter3To4::ProjectConverter3To4::color_renames[][2] = {
- { "aliceblue", "ALICE_BLUE" },
- { "antiquewhite", "ANTIQUE_WHITE" },
- { "aqua", "AQUA" },
- { "aquamarine", "AQUAMARINE" },
- { "azure", "AZURE" },
- { "beige", "BEIGE" },
- { "bisque", "BISQUE" },
- { "black", "BLACK" },
- { "blanchedalmond", "BLANCHED_ALMOND" },
- { "blue", "BLUE" },
- { "blueviolet", "BLUE_VIOLET" },
- { "brown", "BROWN" },
- { "burlywood", "BURLYWOOD" },
- { "cadetblue", "CADET_BLUE" },
- { "chartreuse", "CHARTREUSE" },
- { "chocolate", "CHOCOLATE" },
- { "coral", "CORAL" },
- { "cornflowerblue", "CORNFLOWER_BLUE" },
- { "cornsilk", "CORNSILK" },
- { "crimson", "CRIMSON" },
- { "cyan", "CYAN" },
- { "darkblue", "DARK_BLUE" },
- { "darkcyan", "DARK_CYAN" },
- { "darkgoldenrod", "DARK_GOLDENROD" },
- { "darkgray", "DARK_GRAY" },
- { "darkgreen", "DARK_GREEN" },
- { "darkkhaki", "DARK_KHAKI" },
- { "darkmagenta", "DARK_MAGENTA" },
- { "darkolivegreen", "DARK_OLIVE_GREEN" },
- { "darkorange", "DARK_ORANGE" },
- { "darkorchid", "DARK_ORCHID" },
- { "darkred", "DARK_RED" },
- { "darksalmon", "DARK_SALMON" },
- { "darkseagreen", "DARK_SEA_GREEN" },
- { "darkslateblue", "DARK_SLATE_BLUE" },
- { "darkslategray", "DARK_SLATE_GRAY" },
- { "darkturquoise", "DARK_TURQUOISE" },
- { "darkviolet", "DARK_VIOLET" },
- { "deeppink", "DEEP_PINK" },
- { "deepskyblue", "DEEP_SKY_BLUE" },
- { "dimgray", "DIM_GRAY" },
- { "dodgerblue", "DODGER_BLUE" },
- { "firebrick", "FIREBRICK" },
- { "floralwhite", "FLORAL_WHITE" },
- { "forestgreen", "FOREST_GREEN" },
- { "fuchsia", "FUCHSIA" },
- { "gainsboro", "GAINSBORO" },
- { "ghostwhite", "GHOST_WHITE" },
- { "gold", "GOLD" },
- { "goldenrod", "GOLDENROD" },
- { "gray", "GRAY" },
- { "green", "GREEN" },
- { "greenyellow", "GREEN_YELLOW" },
- { "honeydew", "HONEYDEW" },
- { "hotpink", "HOT_PINK" },
- { "indianred", "INDIAN_RED" },
- { "indigo", "INDIGO" },
- { "ivory", "IVORY" },
- { "khaki", "KHAKI" },
- { "lavender", "LAVENDER" },
- { "lavenderblush", "LAVENDER_BLUSH" },
- { "lawngreen", "LAWN_GREEN" },
- { "lemonchiffon", "LEMON_CHIFFON" },
- { "lightblue", "LIGHT_BLUE" },
- { "lightcoral", "LIGHT_CORAL" },
- { "lightcyan", "LIGHT_CYAN" },
- { "lightgoldenrod", "LIGHT_GOLDENROD" },
- { "lightgray", "LIGHT_GRAY" },
- { "lightgreen", "LIGHT_GREEN" },
- { "lightpink", "LIGHT_PINK" },
- { "lightsalmon", "LIGHT_SALMON" },
- { "lightseagreen", "LIGHT_SEA_GREEN" },
- { "lightskyblue", "LIGHT_SKY_BLUE" },
- { "lightslategray", "LIGHT_SLATE_GRAY" },
- { "lightsteelblue", "LIGHT_STEEL_BLUE" },
- { "lightyellow", "LIGHT_YELLOW" },
- { "lime", "LIME" },
- { "limegreen", "LIME_GREEN" },
- { "linen", "LINEN" },
- { "magenta", "MAGENTA" },
- { "maroon", "MAROON" },
- { "mediumaquamarine", "MEDIUM_AQUAMARINE" },
- { "mediumblue", "MEDIUM_BLUE" },
- { "mediumorchid", "MEDIUM_ORCHID" },
- { "mediumpurple", "MEDIUM_PURPLE" },
- { "mediumseagreen", "MEDIUM_SEA_GREEN" },
- { "mediumslateblue", "MEDIUM_SLATE_BLUE" },
- { "mediumspringgreen", "MEDIUM_SPRING_GREEN" },
- { "mediumturquoise", "MEDIUM_TURQUOISE" },
- { "mediumvioletred", "MEDIUM_VIOLET_RED" },
- { "midnightblue", "MIDNIGHT_BLUE" },
- { "mintcream", "MINT_CREAM" },
- { "mistyrose", "MISTY_ROSE" },
- { "moccasin", "MOCCASIN" },
- { "navajowhite", "NAVAJO_WHITE" },
- { "navyblue", "NAVY_BLUE" },
- { "oldlace", "OLD_LACE" },
- { "olive", "OLIVE" },
- { "olivedrab", "OLIVE_DRAB" },
- { "orange", "ORANGE" },
- { "orangered", "ORANGE_RED" },
- { "orchid", "ORCHID" },
- { "palegoldenrod", "PALE_GOLDENROD" },
- { "palegreen", "PALE_GREEN" },
- { "paleturquoise", "PALE_TURQUOISE" },
- { "palevioletred", "PALE_VIOLET_RED" },
- { "papayawhip", "PAPAYA_WHIP" },
- { "peachpuff", "PEACH_PUFF" },
- { "peru", "PERU" },
- { "pink", "PINK" },
- { "plum", "PLUM" },
- { "powderblue", "POWDER_BLUE" },
- { "purple", "PURPLE" },
- { "rebeccapurple", "REBECCA_PURPLE" },
- { "red", "RED" },
- { "rosybrown", "ROSY_BROWN" },
- { "royalblue", "ROYAL_BLUE" },
- { "saddlebrown", "SADDLE_BROWN" },
- { "salmon", "SALMON" },
- { "sandybrown", "SANDY_BROWN" },
- { "seagreen", "SEA_GREEN" },
- { "seashell", "SEASHELL" },
- { "sienna", "SIENNA" },
- { "silver", "SILVER" },
- { "skyblue", "SKY_BLUE" },
- { "slateblue", "SLATE_BLUE" },
- { "slategray", "SLATE_GRAY" },
- { "snow", "SNOW" },
- { "springgreen", "SPRING_GREEN" },
- { "steelblue", "STEEL_BLUE" },
- { "tan", "TAN" },
- { "teal", "TEAL" },
- { "thistle", "THISTLE" },
- { "tomato", "TOMATO" },
- { "transparent", "TRANSPARENT" },
- { "turquoise", "TURQUOISE" },
- { "violet", "VIOLET" },
- { "webgray", "WEB_GRAY" },
- { "webgreen", "WEB_GREEN" },
- { "webmaroon", "WEB_MAROON" },
- { "webpurple", "WEB_PURPLE" },
- { "wheat", "WHEAT" },
- { "white", "WHITE" },
- { "whitesmoke", "WHITE_SMOKE" },
- { "yellow", "YELLOW" },
- { "yellowgreen", "YELLOW_GREEN" },
-
- { nullptr, nullptr },
-};
+#include "editor/renames_map_3_to_4.h"
+#include "modules/regex/regex.h"
// Find "OS.set_property(x)", capturing x into $1.
static String make_regex_gds_os_property_set(String name_set) {
@@ -1928,70 +166,71 @@ public:
// Common.
{
// Enum.
- for (unsigned int current_index = 0; enum_renames[current_index][0]; current_index++) {
- enum_regexes.push_back(memnew(RegEx(String("\\b") + enum_renames[current_index][0] + "\\b")));
+ for (unsigned int current_index = 0; RenamesMap3To4::enum_renames[current_index][0]; current_index++) {
+ enum_regexes.push_back(memnew(RegEx(String("\\b") + RenamesMap3To4::enum_renames[current_index][0] + "\\b")));
}
// GDScript functions.
- for (unsigned int current_index = 0; gdscript_function_renames[current_index][0]; current_index++) {
- gdscript_function_regexes.push_back(memnew(RegEx(String("\\b") + gdscript_function_renames[current_index][0] + "\\b")));
+ for (unsigned int current_index = 0; RenamesMap3To4::gdscript_function_renames[current_index][0]; current_index++) {
+ gdscript_function_regexes.push_back(memnew(RegEx(String("\\b") + RenamesMap3To4::gdscript_function_renames[current_index][0] + "\\b")));
}
// Project Settings.
- for (unsigned int current_index = 0; project_settings_renames[current_index][0]; current_index++) {
- project_settings_regexes.push_back(memnew(RegEx(String("\\b") + project_settings_renames[current_index][0] + "\\b")));
+ for (unsigned int current_index = 0; RenamesMap3To4::project_settings_renames[current_index][0]; current_index++) {
+ project_settings_regexes.push_back(memnew(RegEx(String("\\b") + RenamesMap3To4::project_settings_renames[current_index][0] + "\\b")));
}
// Input Map.
- for (unsigned int current_index = 0; input_map_renames[current_index][0]; current_index++) {
- input_map_regexes.push_back(memnew(RegEx(String("\\b") + input_map_renames[current_index][0] + "\\b")));
+ for (unsigned int current_index = 0; RenamesMap3To4::input_map_renames[current_index][0]; current_index++) {
+ input_map_regexes.push_back(memnew(RegEx(String("\\b") + RenamesMap3To4::input_map_renames[current_index][0] + "\\b")));
}
// GDScript properties.
- for (unsigned int current_index = 0; gdscript_properties_renames[current_index][0]; current_index++) {
- gdscript_properties_regexes.push_back(memnew(RegEx(String("\\b") + gdscript_properties_renames[current_index][0] + "\\b")));
+ for (unsigned int current_index = 0; RenamesMap3To4::gdscript_properties_renames[current_index][0]; current_index++) {
+ gdscript_properties_regexes.push_back(memnew(RegEx(String("\\b") + RenamesMap3To4::gdscript_properties_renames[current_index][0] + "\\b")));
}
// GDScript Signals.
- for (unsigned int current_index = 0; gdscript_signals_renames[current_index][0]; current_index++) {
- gdscript_signals_regexes.push_back(memnew(RegEx(String("\\b") + gdscript_signals_renames[current_index][0] + "\\b")));
+ for (unsigned int current_index = 0; RenamesMap3To4::gdscript_signals_renames[current_index][0]; current_index++) {
+ gdscript_signals_regexes.push_back(memnew(RegEx(String("\\b") + RenamesMap3To4::gdscript_signals_renames[current_index][0] + "\\b")));
}
// Shaders.
- for (unsigned int current_index = 0; shaders_renames[current_index][0]; current_index++) {
- shaders_regexes.push_back(memnew(RegEx(String("\\b") + shaders_renames[current_index][0] + "\\b")));
+ for (unsigned int current_index = 0; RenamesMap3To4::shaders_renames[current_index][0]; current_index++) {
+ shaders_regexes.push_back(memnew(RegEx(String("\\b") + RenamesMap3To4::shaders_renames[current_index][0] + "\\b")));
}
// Builtin types.
- for (unsigned int current_index = 0; builtin_types_renames[current_index][0]; current_index++) {
- builtin_types_regexes.push_back(memnew(RegEx(String("\\b") + builtin_types_renames[current_index][0] + "\\b")));
+ for (unsigned int current_index = 0; RenamesMap3To4::builtin_types_renames[current_index][0]; current_index++) {
+ builtin_types_regexes.push_back(memnew(RegEx(String("\\b") + RenamesMap3To4::builtin_types_renames[current_index][0] + "\\b")));
}
// CSharp function renames.
- for (unsigned int current_index = 0; csharp_function_renames[current_index][0]; current_index++) {
- csharp_function_regexes.push_back(memnew(RegEx(String("\\b") + csharp_function_renames[current_index][0] + "\\b")));
+ for (unsigned int current_index = 0; RenamesMap3To4::csharp_function_renames[current_index][0]; current_index++) {
+ csharp_function_regexes.push_back(memnew(RegEx(String("\\b") + RenamesMap3To4::csharp_function_renames[current_index][0] + "\\b")));
}
// CSharp properties renames.
- for (unsigned int current_index = 0; csharp_properties_renames[current_index][0]; current_index++) {
- csharp_properties_regexes.push_back(memnew(RegEx(String("\\b") + csharp_properties_renames[current_index][0] + "\\b")));
+ for (unsigned int current_index = 0; RenamesMap3To4::csharp_properties_renames[current_index][0]; current_index++) {
+ csharp_properties_regexes.push_back(memnew(RegEx(String("\\b") + RenamesMap3To4::csharp_properties_renames[current_index][0] + "\\b")));
}
// CSharp signals renames.
- for (unsigned int current_index = 0; csharp_signals_renames[current_index][0]; current_index++) {
- csharp_signal_regexes.push_back(memnew(RegEx(String("\\b") + csharp_signals_renames[current_index][0] + "\\b")));
+ for (unsigned int current_index = 0; RenamesMap3To4::csharp_signals_renames[current_index][0]; current_index++) {
+ csharp_signal_regexes.push_back(memnew(RegEx(String("\\b") + RenamesMap3To4::csharp_signals_renames[current_index][0] + "\\b")));
}
}
// Colors.
{
- for (unsigned int current_index = 0; color_renames[current_index][0]; current_index++) {
- color_regexes.push_back(memnew(RegEx(String("\\bColor.") + color_renames[current_index][0] + "\\b")));
- color_renamed.push_back(String("Color.") + color_renames[current_index][1]);
+ for (unsigned int current_index = 0; RenamesMap3To4::color_renames[current_index][0]; current_index++) {
+ color_regexes.push_back(memnew(RegEx(String("\\bColor.") + RenamesMap3To4::color_renames[current_index][0] + "\\b")));
+ color_renamed.push_back(String("Color.") + RenamesMap3To4::color_renames[current_index][1]);
}
}
// Classes.
{
- for (unsigned int current_index = 0; class_renames[current_index][0]; current_index++) {
- class_tscn_regexes.push_back(memnew(RegEx(String("\\b") + class_renames[current_index][0] + ".tscn\\b")));
- class_gd_regexes.push_back(memnew(RegEx(String("\\b") + class_renames[current_index][0] + ".gd\\b")));
- class_shader_regexes.push_back(memnew(RegEx(String("\\b") + class_renames[current_index][0] + ".shader\\b")));
+ for (unsigned int current_index = 0; RenamesMap3To4::class_renames[current_index][0]; current_index++) {
+ const String class_name = RenamesMap3To4::class_renames[current_index][0];
+ class_tscn_regexes.push_back(memnew(RegEx(String("\\b") + class_name + ".tscn\\b")));
+ class_gd_regexes.push_back(memnew(RegEx(String("\\b") + class_name + ".gd\\b")));
+ class_shader_regexes.push_back(memnew(RegEx(String("\\b") + class_name + ".shader\\b")));
- class_regexes.push_back(memnew(RegEx(String("\\b") + class_renames[current_index][0] + "\\b")));
+ class_regexes.push_back(memnew(RegEx(String("\\b") + class_name + "\\b")));
- class_temp_tscn_renames.push_back(String(class_renames[current_index][0]) + ".tscn");
- class_temp_gd_renames.push_back(String(class_renames[current_index][0]) + ".gd");
- class_temp_shader_renames.push_back(String(class_renames[current_index][0]) + ".shader");
+ class_temp_tscn_renames.push_back(class_name + ".tscn");
+ class_temp_gd_renames.push_back(class_name + ".gd");
+ class_temp_shader_renames.push_back(class_name + ".shader");
}
}
}
@@ -2047,7 +286,7 @@ ProjectConverter3To4::ProjectConverter3To4(int p_maximum_file_size_kb, int p_max
}
// Function responsible for converting project.
-int ProjectConverter3To4::convert() {
+bool ProjectConverter3To4::convert() {
print_line("Starting conversion.");
uint64_t conversion_start_time = Time::get_singleton()->get_ticks_msec();
@@ -2056,8 +295,8 @@ int ProjectConverter3To4::convert() {
int cached_maximum_line_length = maximum_line_length;
maximum_line_length = 10000; // Use only for tests bigger value, to not break them.
- ERR_FAIL_COND_V_MSG(!test_array_names(), ERROR_CODE, "Cannot start converting due to problems with data in arrays.");
- ERR_FAIL_COND_V_MSG(!test_conversion(reg_container), ERROR_CODE, "Cannot start converting due to problems with converting arrays.");
+ ERR_FAIL_COND_V_MSG(!test_array_names(), false, "Cannot start converting due to problems with data in arrays.");
+ ERR_FAIL_COND_V_MSG(!test_conversion(reg_container), false, "Cannot start converting due to problems with converting arrays.");
maximum_line_length = cached_maximum_line_length;
@@ -2066,16 +305,16 @@ int ProjectConverter3To4::convert() {
{
String converter_text = "; Project was converted by built-in tool to Godot 4.0";
- ERR_FAIL_COND_V_MSG(!FileAccess::exists("project.godot"), ERROR_CODE, "Current working directory doesn't contain a \"project.godot\" file for a Godot 3 project.");
+ ERR_FAIL_COND_V_MSG(!FileAccess::exists("project.godot"), false, "Current working directory doesn't contain a \"project.godot\" file for a Godot 3 project.");
Error err = OK;
String project_godot_content = FileAccess::get_file_as_string("project.godot", &err);
- ERR_FAIL_COND_V_MSG(err != OK, ERROR_CODE, "Unable to read \"project.godot\".");
- ERR_FAIL_COND_V_MSG(project_godot_content.contains(converter_text), ERROR_CODE, "Project was already converted with this tool.");
+ ERR_FAIL_COND_V_MSG(err != OK, false, "Unable to read \"project.godot\".");
+ ERR_FAIL_COND_V_MSG(project_godot_content.contains(converter_text), false, "Project was already converted with this tool.");
Ref<FileAccess> file = FileAccess::open("project.godot", FileAccess::WRITE);
- ERR_FAIL_COND_V_MSG(file.is_null(), ERROR_CODE, "Unable to open \"project.godot\".");
+ ERR_FAIL_COND_V_MSG(file.is_null(), false, "Unable to open \"project.godot\".");
file->store_string(converter_text + "\n" + project_godot_content);
}
@@ -2116,59 +355,59 @@ int ProjectConverter3To4::convert() {
if (file_name.ends_with(".gd")) {
rename_classes(lines, reg_container); // Using only specialized function.
- rename_common(enum_renames, reg_container.enum_regexes, lines);
+ rename_common(RenamesMap3To4::enum_renames, reg_container.enum_regexes, lines);
rename_colors(lines, reg_container); // Require to additional rename.
- rename_common(gdscript_function_renames, reg_container.gdscript_function_regexes, lines);
+ rename_common(RenamesMap3To4::gdscript_function_renames, reg_container.gdscript_function_regexes, lines);
rename_gdscript_functions(lines, reg_container, false); // Require to additional rename.
- rename_common(project_settings_renames, reg_container.project_settings_regexes, lines);
+ rename_common(RenamesMap3To4::project_settings_renames, reg_container.project_settings_regexes, lines);
rename_gdscript_keywords(lines, reg_container);
- rename_common(gdscript_properties_renames, reg_container.gdscript_properties_regexes, lines);
- rename_common(gdscript_signals_renames, reg_container.gdscript_signals_regexes, lines);
- rename_common(shaders_renames, reg_container.shaders_regexes, lines);
- rename_common(builtin_types_renames, reg_container.builtin_types_regexes, lines);
+ rename_common(RenamesMap3To4::gdscript_properties_renames, reg_container.gdscript_properties_regexes, lines);
+ rename_common(RenamesMap3To4::gdscript_signals_renames, reg_container.gdscript_signals_regexes, lines);
+ rename_common(RenamesMap3To4::shaders_renames, reg_container.shaders_regexes, lines);
+ rename_common(RenamesMap3To4::builtin_types_renames, reg_container.builtin_types_regexes, lines);
custom_rename(lines, "\\.shader", ".gdshader");
} else if (file_name.ends_with(".tscn")) {
rename_classes(lines, reg_container); // Using only specialized function.
- rename_common(enum_renames, reg_container.enum_regexes, lines);
+ rename_common(RenamesMap3To4::enum_renames, reg_container.enum_regexes, lines);
rename_colors(lines, reg_container); // Require to do additional renames.
- rename_common(gdscript_function_renames, reg_container.gdscript_function_regexes, lines);
+ rename_common(RenamesMap3To4::gdscript_function_renames, reg_container.gdscript_function_regexes, lines);
rename_gdscript_functions(lines, reg_container, true); // Require to do additional renames.
- rename_common(project_settings_renames, reg_container.project_settings_regexes, lines);
+ rename_common(RenamesMap3To4::project_settings_renames, reg_container.project_settings_regexes, lines);
rename_gdscript_keywords(lines, reg_container);
- rename_common(gdscript_properties_renames, reg_container.gdscript_properties_regexes, lines);
- rename_common(gdscript_signals_renames, reg_container.gdscript_signals_regexes, lines);
- rename_common(shaders_renames, reg_container.shaders_regexes, lines);
- rename_common(builtin_types_renames, reg_container.builtin_types_regexes, lines);
+ rename_common(RenamesMap3To4::gdscript_properties_renames, reg_container.gdscript_properties_regexes, lines);
+ rename_common(RenamesMap3To4::gdscript_signals_renames, reg_container.gdscript_signals_regexes, lines);
+ rename_common(RenamesMap3To4::shaders_renames, reg_container.shaders_regexes, lines);
+ rename_common(RenamesMap3To4::builtin_types_renames, reg_container.builtin_types_regexes, lines);
custom_rename(lines, "\\.shader", ".gdshader");
} else if (file_name.ends_with(".cs")) { // TODO, C# should use different methods.
rename_classes(lines, reg_container); // Using only specialized function.
- rename_common(csharp_function_renames, reg_container.csharp_function_regexes, lines);
- rename_common(builtin_types_renames, reg_container.builtin_types_regexes, lines);
- rename_common(csharp_properties_renames, reg_container.csharp_properties_regexes, lines);
- rename_common(csharp_signals_renames, reg_container.csharp_signal_regexes, lines);
+ rename_common(RenamesMap3To4::csharp_function_renames, reg_container.csharp_function_regexes, lines);
+ rename_common(RenamesMap3To4::builtin_types_renames, reg_container.builtin_types_regexes, lines);
+ rename_common(RenamesMap3To4::csharp_properties_renames, reg_container.csharp_properties_regexes, lines);
+ rename_common(RenamesMap3To4::csharp_signals_renames, reg_container.csharp_signal_regexes, lines);
rename_csharp_functions(lines, reg_container);
rename_csharp_attributes(lines, reg_container);
custom_rename(lines, "public class ", "public partial class ");
} else if (file_name.ends_with(".gdshader") || file_name.ends_with(".shader")) {
- rename_common(shaders_renames, reg_container.shaders_regexes, lines);
+ rename_common(RenamesMap3To4::shaders_renames, reg_container.shaders_regexes, lines);
} else if (file_name.ends_with("tres")) {
rename_classes(lines, reg_container); // Using only specialized function.
- rename_common(shaders_renames, reg_container.shaders_regexes, lines);
- rename_common(builtin_types_renames, reg_container.builtin_types_regexes, lines);
+ rename_common(RenamesMap3To4::shaders_renames, reg_container.shaders_regexes, lines);
+ rename_common(RenamesMap3To4::builtin_types_renames, reg_container.builtin_types_regexes, lines);
custom_rename(lines, "\\.shader", ".gdshader");
} else if (file_name.ends_with("project.godot")) {
- rename_common(project_settings_renames, reg_container.project_settings_regexes, lines);
- rename_common(builtin_types_renames, reg_container.builtin_types_regexes, lines);
- rename_common(input_map_renames, reg_container.input_map_regexes, lines);
+ rename_common(RenamesMap3To4::project_settings_renames, reg_container.project_settings_regexes, lines);
+ rename_common(RenamesMap3To4::builtin_types_renames, reg_container.builtin_types_regexes, lines);
+ rename_common(RenamesMap3To4::input_map_renames, reg_container.input_map_regexes, lines);
} else if (file_name.ends_with(".csproj")) {
// TODO
} else {
@@ -2216,11 +455,11 @@ int ProjectConverter3To4::convert() {
print_line(vformat("Conversion ended - all files(%d), converted files: (%d), not converted files: (%d).", collected_files.size(), converted_files, collected_files.size() - converted_files));
uint64_t conversion_end_time = Time::get_singleton()->get_ticks_msec();
print_line(vformat("Conversion of all files took %10.3f seconds.", (conversion_end_time - conversion_start_time) / 1000.0));
- return 0;
-};
+ return true;
+}
// Function responsible for validating project conversion.
-int ProjectConverter3To4::validate_conversion() {
+bool ProjectConverter3To4::validate_conversion() {
print_line("Starting checking if project conversion can be done.");
uint64_t conversion_start_time = Time::get_singleton()->get_ticks_msec();
@@ -2229,8 +468,8 @@ int ProjectConverter3To4::validate_conversion() {
int cached_maximum_line_length = maximum_line_length;
maximum_line_length = 10000; // To avoid breaking the tests, only use this for the their larger value.
- ERR_FAIL_COND_V_MSG(!test_array_names(), ERROR_CODE, "Cannot start converting due to problems with data in arrays.");
- ERR_FAIL_COND_V_MSG(!test_conversion(reg_container), ERROR_CODE, "Cannot start converting due to problems with converting arrays.");
+ ERR_FAIL_COND_V_MSG(!test_array_names(), false, "Cannot start converting due to problems with data in arrays.");
+ ERR_FAIL_COND_V_MSG(!test_conversion(reg_container), false, "Cannot start converting due to problems with converting arrays.");
maximum_line_length = cached_maximum_line_length;
@@ -2239,13 +478,13 @@ int ProjectConverter3To4::validate_conversion() {
{
String conventer_text = "; Project was converted by built-in tool to Godot 4.0";
- ERR_FAIL_COND_V_MSG(!FileAccess::exists("project.godot"), ERROR_CODE, "Current directory doesn't contains any Godot 3 project");
+ ERR_FAIL_COND_V_MSG(!FileAccess::exists("project.godot"), false, "Current directory doesn't contains any Godot 3 project");
Error err = OK;
String project_godot_content = FileAccess::get_file_as_string("project.godot", &err);
- ERR_FAIL_COND_V_MSG(err != OK, ERROR_CODE, "Failed to read content of \"project.godot\" file.");
- ERR_FAIL_COND_V_MSG(project_godot_content.contains(conventer_text), ERROR_CODE, "Project already was converted with this tool.");
+ ERR_FAIL_COND_V_MSG(err != OK, false, "Failed to read content of \"project.godot\" file.");
+ ERR_FAIL_COND_V_MSG(project_godot_content.contains(conventer_text), false, "Project already was converted with this tool.");
}
Vector<String> collected_files = check_for_files();
@@ -2282,59 +521,59 @@ int ProjectConverter3To4::validate_conversion() {
if (file_name.ends_with(".gd")) {
changed_elements.append_array(check_for_rename_classes(lines, reg_container));
- changed_elements.append_array(check_for_rename_common(enum_renames, reg_container.enum_regexes, lines));
+ changed_elements.append_array(check_for_rename_common(RenamesMap3To4::enum_renames, reg_container.enum_regexes, lines));
changed_elements.append_array(check_for_rename_colors(lines, reg_container));
- changed_elements.append_array(check_for_rename_common(gdscript_function_renames, reg_container.gdscript_function_regexes, lines));
+ changed_elements.append_array(check_for_rename_common(RenamesMap3To4::gdscript_function_renames, reg_container.gdscript_function_regexes, lines));
changed_elements.append_array(check_for_rename_gdscript_functions(lines, reg_container, false));
- changed_elements.append_array(check_for_rename_common(project_settings_renames, reg_container.project_settings_regexes, lines));
+ changed_elements.append_array(check_for_rename_common(RenamesMap3To4::project_settings_renames, reg_container.project_settings_regexes, lines));
changed_elements.append_array(check_for_rename_gdscript_keywords(lines, reg_container));
- changed_elements.append_array(check_for_rename_common(gdscript_properties_renames, reg_container.gdscript_properties_regexes, lines));
- changed_elements.append_array(check_for_rename_common(gdscript_signals_renames, reg_container.gdscript_signals_regexes, lines));
- changed_elements.append_array(check_for_rename_common(shaders_renames, reg_container.shaders_regexes, lines));
- changed_elements.append_array(check_for_rename_common(builtin_types_renames, reg_container.builtin_types_regexes, lines));
+ changed_elements.append_array(check_for_rename_common(RenamesMap3To4::gdscript_properties_renames, reg_container.gdscript_properties_regexes, lines));
+ changed_elements.append_array(check_for_rename_common(RenamesMap3To4::gdscript_signals_renames, reg_container.gdscript_signals_regexes, lines));
+ changed_elements.append_array(check_for_rename_common(RenamesMap3To4::shaders_renames, reg_container.shaders_regexes, lines));
+ changed_elements.append_array(check_for_rename_common(RenamesMap3To4::builtin_types_renames, reg_container.builtin_types_regexes, lines));
changed_elements.append_array(check_for_custom_rename(lines, "\\.shader", ".gdshader"));
} else if (file_name.ends_with(".tscn")) {
changed_elements.append_array(check_for_rename_classes(lines, reg_container));
- changed_elements.append_array(check_for_rename_common(enum_renames, reg_container.enum_regexes, lines));
+ changed_elements.append_array(check_for_rename_common(RenamesMap3To4::enum_renames, reg_container.enum_regexes, lines));
changed_elements.append_array(check_for_rename_colors(lines, reg_container));
- changed_elements.append_array(check_for_rename_common(gdscript_function_renames, reg_container.gdscript_function_regexes, lines));
+ changed_elements.append_array(check_for_rename_common(RenamesMap3To4::gdscript_function_renames, reg_container.gdscript_function_regexes, lines));
changed_elements.append_array(check_for_rename_gdscript_functions(lines, reg_container, true));
- changed_elements.append_array(check_for_rename_common(project_settings_renames, reg_container.project_settings_regexes, lines));
+ changed_elements.append_array(check_for_rename_common(RenamesMap3To4::project_settings_renames, reg_container.project_settings_regexes, lines));
changed_elements.append_array(check_for_rename_gdscript_keywords(lines, reg_container));
- changed_elements.append_array(check_for_rename_common(gdscript_properties_renames, reg_container.gdscript_properties_regexes, lines));
- changed_elements.append_array(check_for_rename_common(gdscript_signals_renames, reg_container.gdscript_signals_regexes, lines));
- changed_elements.append_array(check_for_rename_common(shaders_renames, reg_container.shaders_regexes, lines));
- changed_elements.append_array(check_for_rename_common(builtin_types_renames, reg_container.builtin_types_regexes, lines));
+ changed_elements.append_array(check_for_rename_common(RenamesMap3To4::gdscript_properties_renames, reg_container.gdscript_properties_regexes, lines));
+ changed_elements.append_array(check_for_rename_common(RenamesMap3To4::gdscript_signals_renames, reg_container.gdscript_signals_regexes, lines));
+ changed_elements.append_array(check_for_rename_common(RenamesMap3To4::shaders_renames, reg_container.shaders_regexes, lines));
+ changed_elements.append_array(check_for_rename_common(RenamesMap3To4::builtin_types_renames, reg_container.builtin_types_regexes, lines));
changed_elements.append_array(check_for_custom_rename(lines, "\\.shader", ".gdshader"));
} else if (file_name.ends_with(".cs")) {
changed_elements.append_array(check_for_rename_classes(lines, reg_container));
- changed_elements.append_array(check_for_rename_common(csharp_function_renames, reg_container.csharp_function_regexes, lines));
- changed_elements.append_array(check_for_rename_common(builtin_types_renames, reg_container.builtin_types_regexes, lines));
- changed_elements.append_array(check_for_rename_common(csharp_properties_renames, reg_container.csharp_properties_regexes, lines));
- changed_elements.append_array(check_for_rename_common(csharp_signals_renames, reg_container.csharp_signal_regexes, lines));
+ changed_elements.append_array(check_for_rename_common(RenamesMap3To4::csharp_function_renames, reg_container.csharp_function_regexes, lines));
+ changed_elements.append_array(check_for_rename_common(RenamesMap3To4::builtin_types_renames, reg_container.builtin_types_regexes, lines));
+ changed_elements.append_array(check_for_rename_common(RenamesMap3To4::csharp_properties_renames, reg_container.csharp_properties_regexes, lines));
+ changed_elements.append_array(check_for_rename_common(RenamesMap3To4::csharp_signals_renames, reg_container.csharp_signal_regexes, lines));
changed_elements.append_array(check_for_rename_csharp_functions(lines, reg_container));
changed_elements.append_array(check_for_rename_csharp_attributes(lines, reg_container));
changed_elements.append_array(check_for_custom_rename(lines, "public class ", "public partial class "));
} else if (file_name.ends_with(".gdshader") || file_name.ends_with(".shader")) {
- changed_elements.append_array(check_for_rename_common(shaders_renames, reg_container.shaders_regexes, lines));
+ changed_elements.append_array(check_for_rename_common(RenamesMap3To4::shaders_renames, reg_container.shaders_regexes, lines));
} else if (file_name.ends_with("tres")) {
changed_elements.append_array(check_for_rename_classes(lines, reg_container));
- changed_elements.append_array(check_for_rename_common(shaders_renames, reg_container.shaders_regexes, lines));
- changed_elements.append_array(check_for_rename_common(builtin_types_renames, reg_container.builtin_types_regexes, lines));
+ changed_elements.append_array(check_for_rename_common(RenamesMap3To4::shaders_renames, reg_container.shaders_regexes, lines));
+ changed_elements.append_array(check_for_rename_common(RenamesMap3To4::builtin_types_renames, reg_container.builtin_types_regexes, lines));
changed_elements.append_array(check_for_custom_rename(lines, "\\.shader", ".gdshader"));
} else if (file_name.ends_with("project.godot")) {
- changed_elements.append_array(check_for_rename_common(project_settings_renames, reg_container.project_settings_regexes, lines));
- changed_elements.append_array(check_for_rename_common(builtin_types_renames, reg_container.builtin_types_regexes, lines));
- changed_elements.append_array(check_for_rename_common(input_map_renames, reg_container.input_map_regexes, lines));
+ changed_elements.append_array(check_for_rename_common(RenamesMap3To4::project_settings_renames, reg_container.project_settings_regexes, lines));
+ changed_elements.append_array(check_for_rename_common(RenamesMap3To4::builtin_types_renames, reg_container.builtin_types_regexes, lines));
+ changed_elements.append_array(check_for_rename_common(RenamesMap3To4::input_map_renames, reg_container.input_map_regexes, lines));
} else if (file_name.ends_with(".csproj")) {
// TODO
} else {
@@ -2375,7 +614,7 @@ int ProjectConverter3To4::validate_conversion() {
print_line(vformat("Checking for valid conversion ended - all files(%d), files which would be converted(%d), files which would not be converted(%d).", collected_files.size(), converted_files, collected_files.size() - converted_files));
uint64_t conversion_end_time = Time::get_singleton()->get_ticks_msec();
print_line(vformat("Conversion of all files took %10.3f seconds.", (conversion_end_time - conversion_start_time) / 1000.0));
- return 0;
+ return true;
}
// Collect files which will be checked, excluding ".txt", ".mp4", ".wav" etc. files.
@@ -2453,27 +692,27 @@ bool ProjectConverter3To4::test_conversion_basic(String name, String expected, c
bool ProjectConverter3To4::test_conversion(RegExContainer &reg_container) {
bool valid = true;
- valid = valid && test_conversion_basic("TYPE_REAL", "TYPE_FLOAT", enum_renames, reg_container.enum_regexes, "enum");
+ valid = valid && test_conversion_basic("TYPE_REAL", "TYPE_FLOAT", RenamesMap3To4::enum_renames, reg_container.enum_regexes, "enum");
- valid = valid && test_conversion_basic("can_instance", "can_instantiate", gdscript_function_renames, reg_container.gdscript_function_regexes, "gdscript function");
+ valid = valid && test_conversion_basic("can_instance", "can_instantiate", RenamesMap3To4::gdscript_function_renames, reg_container.gdscript_function_regexes, "gdscript function");
- valid = valid && test_conversion_basic("CanInstance", "CanInstantiate", csharp_function_renames, reg_container.csharp_function_regexes, "csharp function");
+ valid = valid && test_conversion_basic("CanInstance", "CanInstantiate", RenamesMap3To4::csharp_function_renames, reg_container.csharp_function_regexes, "csharp function");
- valid = valid && test_conversion_basic("translation", "position", gdscript_properties_renames, reg_container.gdscript_properties_regexes, "gdscript property");
+ valid = valid && test_conversion_basic("translation", "position", RenamesMap3To4::gdscript_properties_renames, reg_container.gdscript_properties_regexes, "gdscript property");
- valid = valid && test_conversion_basic("Translation", "Position", csharp_properties_renames, reg_container.csharp_properties_regexes, "csharp property");
+ valid = valid && test_conversion_basic("Translation", "Position", RenamesMap3To4::csharp_properties_renames, reg_container.csharp_properties_regexes, "csharp property");
- valid = valid && test_conversion_basic("NORMALMAP", "NORMAL_MAP", shaders_renames, reg_container.shaders_regexes, "shader");
+ valid = valid && test_conversion_basic("NORMALMAP", "NORMAL_MAP", RenamesMap3To4::shaders_renames, reg_container.shaders_regexes, "shader");
- valid = valid && test_conversion_basic("text_entered", "text_submitted", gdscript_signals_renames, reg_container.gdscript_signals_regexes, "gdscript signal");
+ valid = valid && test_conversion_basic("text_entered", "text_submitted", RenamesMap3To4::gdscript_signals_renames, reg_container.gdscript_signals_regexes, "gdscript signal");
- valid = valid && test_conversion_basic("TextEntered", "TextSubmitted", csharp_signals_renames, reg_container.csharp_signal_regexes, "csharp signal");
+ valid = valid && test_conversion_basic("TextEntered", "TextSubmitted", RenamesMap3To4::csharp_signals_renames, reg_container.csharp_signal_regexes, "csharp signal");
- valid = valid && test_conversion_basic("audio/channel_disable_threshold_db", "audio/buses/channel_disable_threshold_db", project_settings_renames, reg_container.project_settings_regexes, "project setting");
+ valid = valid && test_conversion_basic("audio/channel_disable_threshold_db", "audio/buses/channel_disable_threshold_db", RenamesMap3To4::project_settings_renames, reg_container.project_settings_regexes, "project setting");
- valid = valid && test_conversion_basic("\"device\":-1,\"alt\":false,\"shift\":false,\"control\":false,\"meta\":false,\"doubleclick\":false,\"scancode\":0,\"physical_scancode\":16777254,\"script\":null", "\"device\":-1,\"alt_pressed\":false,\"shift_pressed\":false,\"ctrl_pressed\":false,\"meta_pressed\":false,\"double_click\":false,\"keycode\":0,\"physical_keycode\":16777254,\"script\":null", input_map_renames, reg_container.input_map_regexes, "input map");
+ valid = valid && test_conversion_basic("\"device\":-1,\"alt\":false,\"shift\":false,\"control\":false,\"meta\":false,\"doubleclick\":false,\"scancode\":0,\"physical_scancode\":16777254,\"script\":null", "\"device\":-1,\"alt_pressed\":false,\"shift_pressed\":false,\"ctrl_pressed\":false,\"meta_pressed\":false,\"double_click\":false,\"keycode\":0,\"physical_keycode\":16777254,\"script\":null", RenamesMap3To4::input_map_renames, reg_container.input_map_regexes, "input map");
- valid = valid && test_conversion_basic("Transform", "Transform3D", builtin_types_renames, reg_container.builtin_types_regexes, "builtin type");
+ valid = valid && test_conversion_basic("Transform", "Transform3D", RenamesMap3To4::builtin_types_renames, reg_container.builtin_types_regexes, "builtin type");
// Custom Renames.
@@ -2787,9 +1026,9 @@ bool ProjectConverter3To4::test_array_names() {
// Validate if all classes are valid.
{
- for (unsigned int current_index = 0; class_renames[current_index][0]; current_index++) {
- const String old_class = class_renames[current_index][0];
- const String new_class = class_renames[current_index][1];
+ for (unsigned int current_index = 0; RenamesMap3To4::class_renames[current_index][0]; current_index++) {
+ const String old_class = RenamesMap3To4::class_renames[current_index][0];
+ const String new_class = RenamesMap3To4::class_renames[current_index][1];
// Light2D, Texture, Viewport are special classes(probably virtual ones).
if (ClassDB::class_exists(StringName(old_class)) && old_class != "Light2D" && old_class != "Texture" && old_class != "Viewport") {
@@ -2838,10 +1077,10 @@ bool ProjectConverter3To4::test_array_names() {
}
int current_element = 0;
- while (gdscript_function_renames[current_element][0] != nullptr) {
- String name_3_x = gdscript_function_renames[current_element][0];
- String name_4_0 = gdscript_function_renames[current_element][1];
- if (!all_functions.has(gdscript_function_renames[current_element][1])) {
+ while (RenamesMap3To4::gdscript_function_renames[current_element][0] != nullptr) {
+ String name_3_x = RenamesMap3To4::gdscript_function_renames[current_element][0];
+ String name_4_0 = RenamesMap3To4::gdscript_function_renames[current_element][1];
+ if (!all_functions.has(name_4_0)) {
ERR_PRINT(vformat("Missing GDScript function in pair (%s - ===> %s <===)", name_3_x, name_4_0));
valid = false;
}
@@ -2852,18 +1091,18 @@ bool ProjectConverter3To4::test_array_names() {
ERR_PRINT("Found function which is used in the converter, but it cannot be found in Godot 4. Rename this element or remove its entry if it's obsolete.");
}
- valid = valid && test_single_array(enum_renames);
- valid = valid && test_single_array(class_renames, true);
- valid = valid && test_single_array(gdscript_function_renames, true);
- valid = valid && test_single_array(csharp_function_renames, true);
- valid = valid && test_single_array(gdscript_properties_renames, true);
- valid = valid && test_single_array(csharp_properties_renames, true);
- valid = valid && test_single_array(shaders_renames, true);
- valid = valid && test_single_array(gdscript_signals_renames);
- valid = valid && test_single_array(project_settings_renames);
- valid = valid && test_single_array(input_map_renames);
- valid = valid && test_single_array(builtin_types_renames);
- valid = valid && test_single_array(color_renames);
+ valid = valid && test_single_array(RenamesMap3To4::enum_renames);
+ valid = valid && test_single_array(RenamesMap3To4::class_renames, true);
+ valid = valid && test_single_array(RenamesMap3To4::gdscript_function_renames, true);
+ valid = valid && test_single_array(RenamesMap3To4::csharp_function_renames, true);
+ valid = valid && test_single_array(RenamesMap3To4::gdscript_properties_renames, true);
+ valid = valid && test_single_array(RenamesMap3To4::csharp_properties_renames, true);
+ valid = valid && test_single_array(RenamesMap3To4::shaders_renames, true);
+ valid = valid && test_single_array(RenamesMap3To4::gdscript_signals_renames);
+ valid = valid && test_single_array(RenamesMap3To4::project_settings_renames);
+ valid = valid && test_single_array(RenamesMap3To4::input_map_renames);
+ valid = valid && test_single_array(RenamesMap3To4::builtin_types_renames);
+ valid = valid && test_single_array(RenamesMap3To4::color_renames);
return valid;
}
@@ -3092,7 +1331,7 @@ void ProjectConverter3To4::rename_colors(Vector<String> &lines, const RegExConta
for (String &line : lines) {
if (uint64_t(line.length()) <= maximum_line_length) {
if (line.contains("Color.")) {
- for (unsigned int current_index = 0; color_renames[current_index][0]; current_index++) {
+ for (unsigned int current_index = 0; RenamesMap3To4::color_renames[current_index][0]; current_index++) {
line = reg_container.color_regexes[current_index]->sub(line, reg_container.color_renamed[current_index], true);
}
}
@@ -3107,10 +1346,10 @@ Vector<String> ProjectConverter3To4::check_for_rename_colors(Vector<String> &lin
for (String &line : lines) {
if (uint64_t(line.length()) <= maximum_line_length) {
if (line.contains("Color.")) {
- for (unsigned int current_index = 0; color_renames[current_index][0]; current_index++) {
+ for (unsigned int current_index = 0; RenamesMap3To4::color_renames[current_index][0]; current_index++) {
TypedArray<RegExMatch> reg_match = reg_container.color_regexes[current_index]->search_all(line);
if (reg_match.size() > 0) {
- found_renames.append(line_formatter(current_line, color_renames[current_index][0], color_renames[current_index][1], line));
+ found_renames.append(line_formatter(current_line, RenamesMap3To4::color_renames[current_index][0], RenamesMap3To4::color_renames[current_index][1], line));
}
}
}
@@ -3124,11 +1363,11 @@ Vector<String> ProjectConverter3To4::check_for_rename_colors(Vector<String> &lin
void ProjectConverter3To4::rename_classes(Vector<String> &lines, const RegExContainer &reg_container) {
for (String &line : lines) {
if (uint64_t(line.length()) <= maximum_line_length) {
- for (unsigned int current_index = 0; class_renames[current_index][0]; current_index++) {
- if (line.contains(class_renames[current_index][0])) {
+ for (unsigned int current_index = 0; RenamesMap3To4::class_renames[current_index][0]; current_index++) {
+ if (line.contains(RenamesMap3To4::class_renames[current_index][0])) {
bool found_ignored_items = false;
// Renaming Spatial.tscn to TEMP_RENAMED_CLASS.tscn.
- if (line.contains(String(class_renames[current_index][0]) + ".")) {
+ if (line.contains(String(RenamesMap3To4::class_renames[current_index][0]) + ".")) {
found_ignored_items = true;
line = reg_container.class_tscn_regexes[current_index]->sub(line, "TEMP_RENAMED_CLASS.tscn", true);
line = reg_container.class_gd_regexes[current_index]->sub(line, "TEMP_RENAMED_CLASS.gd", true);
@@ -3136,7 +1375,7 @@ void ProjectConverter3To4::rename_classes(Vector<String> &lines, const RegExCont
}
// Causal renaming Spatial -> Node3D.
- line = reg_container.class_regexes[current_index]->sub(line, class_renames[current_index][1], true);
+ line = reg_container.class_regexes[current_index]->sub(line, RenamesMap3To4::class_renames[current_index][1], true);
// Restore Spatial.tscn from TEMP_RENAMED_CLASS.tscn.
if (found_ignored_items) {
@@ -3157,12 +1396,12 @@ Vector<String> ProjectConverter3To4::check_for_rename_classes(Vector<String> &li
for (String &line : lines) {
if (uint64_t(line.length()) <= maximum_line_length) {
- for (unsigned int current_index = 0; class_renames[current_index][0]; current_index++) {
- if (line.contains(class_renames[current_index][0])) {
+ for (unsigned int current_index = 0; RenamesMap3To4::class_renames[current_index][0]; current_index++) {
+ if (line.contains(RenamesMap3To4::class_renames[current_index][0])) {
String old_line = line;
bool found_ignored_items = false;
// Renaming Spatial.tscn to TEMP_RENAMED_CLASS.tscn.
- if (line.contains(String(class_renames[current_index][0]) + ".")) {
+ if (line.contains(String(RenamesMap3To4::class_renames[current_index][0]) + ".")) {
found_ignored_items = true;
line = reg_container.class_tscn_regexes[current_index]->sub(line, "TEMP_RENAMED_CLASS.tscn", true);
line = reg_container.class_gd_regexes[current_index]->sub(line, "TEMP_RENAMED_CLASS.gd", true);
@@ -3172,7 +1411,7 @@ Vector<String> ProjectConverter3To4::check_for_rename_classes(Vector<String> &li
// Causal renaming Spatial -> Node3D.
TypedArray<RegExMatch> reg_match = reg_container.class_regexes[current_index]->search_all(line);
if (reg_match.size() > 0) {
- found_renames.append(line_formatter(current_line, class_renames[current_index][0], class_renames[current_index][1], old_line));
+ found_renames.append(line_formatter(current_line, RenamesMap3To4::class_renames[current_index][0], RenamesMap3To4::class_renames[current_index][1], old_line));
}
// Restore Spatial.tscn from TEMP_RENAMED_CLASS.tscn.
@@ -4353,17 +2592,6 @@ String ProjectConverter3To4::collect_string_from_vector(Vector<String> &vector)
return string;
}
-#else // No RegEx.
-
-ProjectConverter3To4::ProjectConverter3To4(int _p_maximum_file_size_kb, int _p_maximum_line_length) {}
-
-int ProjectConverter3To4::convert() {
- ERR_FAIL_V_MSG(ERROR_CODE, "Can't run converter for Godot 3.x projects, because RegEx module is disabled.");
-}
-
-int ProjectConverter3To4::validate_conversion() {
- ERR_FAIL_V_MSG(ERROR_CODE, "Can't validate conversion for Godot 3.x projects, because RegEx module is disabled.");
-}
-
#endif // MODULE_REGEX_ENABLED
+
#endif // DISABLE_DEPRECATED
diff --git a/editor/project_converter_3_to_4.h b/editor/project_converter_3_to_4.h
index 641bc467ac..420dd79d72 100644
--- a/editor/project_converter_3_to_4.h
+++ b/editor/project_converter_3_to_4.h
@@ -33,31 +33,36 @@
#ifndef DISABLE_DEPRECATED
-#include "core/io/file_access.h"
-#include "core/object/ref_counted.h"
+#include "modules/modules_enabled.gen.h" // For regex.
+
+#ifndef MODULE_REGEX_ENABLED
+
+#include "core/error/error_macros.h"
+
+class ProjectConverter3To4 {
+public:
+ ProjectConverter3To4(int, int) {}
+
+ bool validate_conversion() {
+ ERR_FAIL_V_MSG(false, "Can't validate conversion for Godot 3.x projects, because RegEx module is disabled.");
+ }
+
+ bool convert() {
+ ERR_FAIL_V_MSG(false, "Can't run converter for Godot 3.x projects, because RegEx module is disabled.");
+ }
+};
+
+#else // Has regex.
+
#include "core/string/ustring.h"
#include "core/templates/local_vector.h"
+#include "core/templates/vector.h"
class RegEx;
class ProjectConverter3To4 {
-public:
class RegExContainer;
- static const char *enum_renames[][2];
- static const char *gdscript_function_renames[][2];
- static const char *csharp_function_renames[][2];
- static const char *gdscript_properties_renames[][2];
- static const char *csharp_properties_renames[][2];
- static const char *gdscript_signals_renames[][2];
- static const char *csharp_signals_renames[][2];
- static const char *project_settings_renames[][2];
- static const char *input_map_renames[][2];
- static const char *builtin_types_renames[][2];
- static const char *shaders_renames[][2];
- static const char *class_renames[][2];
- static const char *color_renames[][2];
-
-private:
+
uint64_t maximum_file_size;
uint64_t maximum_line_length;
@@ -108,10 +113,12 @@ private:
public:
ProjectConverter3To4(int, int);
- int validate_conversion();
- int convert();
+ bool validate_conversion();
+ bool convert();
};
+#endif // MODULE_REGEX_ENABLED
+
#endif // DISABLE_DEPRECATED
#endif // PROJECT_CONVERTER_3_TO_4_H
diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp
index 105e3a5d47..dc019d8e7c 100644
--- a/editor/project_manager.cpp
+++ b/editor/project_manager.cpp
@@ -510,6 +510,8 @@ private:
ProjectSettings::CustomMap initial_settings;
// Be sure to change this code if/when renderers are changed.
+ // Default values are "forward_plus" for the main setting, "mobile" for the mobile override,
+ // and "gl_compatibility" for the web override.
String renderer_type = renderer_button_group->get_pressed_button()->get_meta(SNAME("rendering_method"));
initial_settings["rendering/renderer/rendering_method"] = renderer_type;
@@ -522,6 +524,8 @@ private:
project_features.push_back("Mobile");
} else if (renderer_type == "gl_compatibility") {
project_features.push_back("GL Compatibility");
+ // Also change the default rendering method for the mobile override.
+ initial_settings["rendering/renderer/rendering_method.mobile"] = "gl_compatibility";
} else {
WARN_PRINT("Unknown renderer type. Please report this as a bug on GitHub.");
}
@@ -961,8 +965,8 @@ public:
default_files_container->add_child(l);
vcs_metadata_selection = memnew(OptionButton);
vcs_metadata_selection->set_custom_minimum_size(Size2(100, 20));
- vcs_metadata_selection->add_item("None", (int)EditorVCSInterface::VCSMetadata::NONE);
- vcs_metadata_selection->add_item("Git", (int)EditorVCSInterface::VCSMetadata::GIT);
+ vcs_metadata_selection->add_item(TTR("None"), (int)EditorVCSInterface::VCSMetadata::NONE);
+ vcs_metadata_selection->add_item(TTR("Git"), (int)EditorVCSInterface::VCSMetadata::GIT);
vcs_metadata_selection->select((int)EditorVCSInterface::VCSMetadata::GIT);
default_files_container->add_child(vcs_metadata_selection);
Control *spacer = memnew(Control);
@@ -1355,6 +1359,8 @@ void ProjectList::load_projects() {
create_project_item_control(i);
}
+ sort_projects();
+
set_v_scroll(0);
update_icons_async();
diff --git a/editor/renames_map_3_to_4.cpp b/editor/renames_map_3_to_4.cpp
new file mode 100644
index 0000000000..4c47eac6a5
--- /dev/null
+++ b/editor/renames_map_3_to_4.cpp
@@ -0,0 +1,1797 @@
+/**************************************************************************/
+/* renames_map_3_to_4.cpp */
+/**************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/**************************************************************************/
+/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
+/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/**************************************************************************/
+
+#include "renames_map_3_to_4.h"
+
+#ifndef DISABLE_DEPRECATED
+
+const char *RenamesMap3To4::enum_renames[][2] = {
+ //// constants
+ { "TYPE_COLOR_ARRAY", "TYPE_PACKED_COLOR_ARRAY" },
+ { "TYPE_FLOAT64_ARRAY", "TYPE_PACKED_FLOAT64_ARRAY" },
+ { "TYPE_INT64_ARRAY", "TYPE_PACKED_INT64_ARRAY" },
+ { "TYPE_INT_ARRAY", "TYPE_PACKED_INT32_ARRAY" },
+ { "TYPE_QUAT", "TYPE_QUATERNION" },
+ { "TYPE_RAW_ARRAY", "TYPE_PACKED_BYTE_ARRAY" },
+ { "TYPE_REAL", "TYPE_FLOAT" },
+ { "TYPE_REAL_ARRAY", "TYPE_PACKED_FLOAT32_ARRAY" },
+ { "TYPE_STRING_ARRAY", "TYPE_PACKED_STRING_ARRAY" },
+ { "TYPE_TRANSFORM", "TYPE_TRANSFORM3D" },
+ { "TYPE_VECTOR2_ARRAY", "TYPE_PACKED_VECTOR2_ARRAY" },
+ { "TYPE_VECTOR3_ARRAY", "TYPE_PACKED_VECTOR3_ARRAY" },
+
+ // {"FLAG_MAX", "PARTICLE_FLAG_MAX"}, // CPUParticles2D - used in more classes
+ { "ALIGN_BEGIN", "ALIGNMENT_BEGIN" }, //AspectRatioContainer
+ { "ALIGN_CENTER", "ALIGNMENT_CENTER" }, //AspectRatioContainer
+ { "ALIGN_END", "ALIGNMENT_END" }, //AspectRatioContainer
+ { "ARRAY_COMPRESS_BASE", "ARRAY_COMPRESS_FLAGS_BASE" }, // Mesh
+ { "ARVR_AR", "XR_AR" }, // XRInterface
+ { "ARVR_EXCESSIVE_MOTION", "XR_EXCESSIVE_MOTION" }, // XRInterface
+ { "ARVR_EXTERNAL", "XR_EXTERNAL" }, // XRInterface
+ { "ARVR_INSUFFICIENT_FEATURES", "XR_INSUFFICIENT_FEATURES" }, // XRInterface
+ { "ARVR_MONO", "XR_MONO" }, // XRInterface
+ { "ARVR_NONE", "XR_NONE" }, // XRInterface
+ { "ARVR_NORMAL_TRACKING", "XR_NORMAL_TRACKING" }, // XRInterface
+ { "ARVR_NOT_TRACKING", "XR_NOT_TRACKING" }, // XRInterface
+ { "ARVR_STEREO", "XR_STEREO" }, // XRInterface
+ { "ARVR_UNKNOWN_TRACKING", "XR_UNKNOWN_TRACKING" }, // XRInterface
+ { "BAKE_ERROR_INVALID_MESH", "BAKE_ERROR_MESHES_INVALID" }, // LightmapGI
+ { "BODY_MODE_CHARACTER", "BODY_MODE_RIGID_LINEAR" }, // PhysicsServer
+ { "BUTTON_LEFT", "MOUSE_BUTTON_LEFT" }, // Globals
+ { "BUTTON_MASK_LEFT", "MOUSE_BUTTON_MASK_LEFT" }, // Globals
+ { "BUTTON_MASK_MIDDLE", "MOUSE_BUTTON_MASK_MIDDLE" }, // Globals
+ { "BUTTON_MASK_RIGHT", "MOUSE_BUTTON_MASK_RIGHT" }, // Globals
+ { "BUTTON_MASK_XBUTTON1", "MOUSE_BUTTON_MASK_XBUTTON1" }, // Globals
+ { "BUTTON_MASK_XBUTTON2", "MOUSE_BUTTON_MASK_XBUTTON2" }, // Globals
+ { "BUTTON_MIDDLE", "MOUSE_BUTTON_MIDDLE" }, // Globals
+ { "BUTTON_RIGHT", "MOUSE_BUTTON_RIGHT" }, // Globals
+ { "BUTTON_WHEEL_DOWN", "MOUSE_BUTTON_WHEEL_DOWN" }, // Globals
+ { "BUTTON_WHEEL_LEFT", "MOUSE_BUTTON_WHEEL_LEFT" }, // Globals
+ { "BUTTON_WHEEL_RIGHT", "MOUSE_BUTTON_WHEEL_RIGHT" }, // Globals
+ { "BUTTON_WHEEL_UP", "MOUSE_BUTTON_WHEEL_UP" }, // Globals
+ { "BUTTON_XBUTTON1", "MOUSE_BUTTON_XBUTTON1" }, // Globals
+ { "BUTTON_XBUTTON2", "MOUSE_BUTTON_XBUTTON2" }, // Globals
+ { "CLEAR_MODE_ONLY_NEXT_FRAME", "CLEAR_MODE_ONCE" }, // SubViewport
+ { "COMPRESS_PVRTC4", "COMPRESS_PVRTC1_4" }, // Image
+ { "CONNECT_ONESHOT", "CONNECT_ONE_SHOT" }, // Object
+ { "CONTAINER_PROPERTY_EDITOR_BOTTOM", "CONTAINER_INSPECTOR_BOTTOM" }, // EditorPlugin
+ { "CUBEMAP_BACK", "CUBEMAP_LAYER_BACK" }, // RenderingServer
+ { "CUBEMAP_BOTTOM", "CUBEMAP_LAYER_BOTTOM" }, // RenderingServer
+ { "CUBEMAP_FRONT", "CUBEMAP_LAYER_FRONT" }, // RenderingServer
+ { "CUBEMAP_LEFT", "CUBEMAP_LAYER_LEFT" }, // RenderingServer
+ { "CUBEMAP_RIGHT", "CUBEMAP_LAYER_RIGHT" }, // RenderingServer
+ { "CUBEMAP_TOP", "CUBEMAP_LAYER_TOP" }, // RenderingServer
+ { "DAMPED_STRING_DAMPING", "DAMPED_SPRING_DAMPING" }, // PhysicsServer2D
+ { "DAMPED_STRING_REST_LENGTH", "DAMPED_SPRING_REST_LENGTH" }, // PhysicsServer2D
+ { "DAMPED_STRING_STIFFNESS", "DAMPED_SPRING_STIFFNESS" }, // PhysicsServer2D
+ { "FLAG_ALIGN_Y_TO_VELOCITY", "PARTICLE_FLAG_ALIGN_Y_TO_VELOCITY" }, // CPUParticles2D
+ { "FLAG_DISABLE_Z", "PARTICLE_FLAG_DISABLE_Z" }, // CPUParticles2D
+ { "FLAG_ROTATE_Y", "PARTICLE_FLAG_ROTATE_Y" }, // CPUParticles2D
+ { "FLAG_USE_BAKED_LIGHT", "GI_MODE_BAKED" }, // GeometryInstance3D
+ { "FORMAT_PVRTC2", "FORMAT_PVRTC1_2" }, // Image
+ { "FORMAT_PVRTC2A", "FORMAT_PVRTC1_2A" }, // Image
+ { "FORMAT_PVRTC4", "FORMAT_PVRTC1_4" }, // Image
+ { "FORMAT_PVRTC4A", "FORMAT_PVRTC1_4A" }, // Image
+ { "FUNC_FRAC", "FUNC_FRACT" }, // VisualShaderNodeVectorFunc
+ { "INSTANCE_LIGHTMAP_CAPTURE", "INSTANCE_LIGHTMAP" }, // RenderingServer
+ { "JOINT_6DOF", "JOINT_TYPE_6DOF" }, // PhysicsServer3D
+ { "JOINT_CONE_TWIST", "JOINT_TYPE_CONE_TWIST" }, // PhysicsServer3D
+ { "JOINT_DAMPED_SPRING", "JOINT_TYPE_DAMPED_SPRING" }, // PhysicsServer2D
+ { "JOINT_GROOVE", "JOINT_TYPE_GROOVE" }, // PhysicsServer2D
+ { "JOINT_HINGE", "JOINT_TYPE_HINGE" }, // PhysicsServer3D
+ { "JOINT_PIN", "JOINT_TYPE_PIN" }, // PhysicsServer2D
+ { "JOINT_SLIDER", "JOINT_TYPE_SLIDER" }, // PhysicsServer3D
+ { "KEY_CONTROL", "KEY_CTRL" }, // Globals
+ { "LOOP_PING_PONG", "LOOP_PINGPONG" }, // AudioStreamWAV
+ { "MODE_KINEMATIC", "FREEZE_MODE_KINEMATIC" }, // RigidBody
+ { "MODE_OPEN_ANY", "FILE_MODE_OPEN_ANY" }, // FileDialog
+ { "MODE_OPEN_DIR", "FILE_MODE_OPEN_DIR" }, // FileDialog
+ { "MODE_OPEN_FILE", "FILE_MODE_OPEN_FILE" }, // FileDialog
+ { "MODE_OPEN_FILES", "FILE_MODE_OPEN_FILES" }, // FileDialog
+ { "MODE_SAVE_FILE", "FILE_MODE_SAVE_FILE" }, // FileDialog
+ { "MODE_STATIC", "FREEZE_MODE_STATIC" }, // RigidBody
+ { "NOTIFICATION_APP_PAUSED", "NOTIFICATION_APPLICATION_PAUSED" }, // MainLoop
+ { "NOTIFICATION_APP_RESUMED", "NOTIFICATION_APPLICATION_RESUMED" }, // MainLoop
+ { "NOTIFICATION_INSTANCED", "NOTIFICATION_SCENE_INSTANTIATED" }, // Node
+ { "NOTIFICATION_PATH_CHANGED", "NOTIFICATION_PATH_RENAMED" }, //Node
+ { "NOTIFICATION_WM_FOCUS_IN", "NOTIFICATION_APPLICATION_FOCUS_IN" }, // MainLoop
+ { "NOTIFICATION_WM_FOCUS_OUT", "NOTIFICATION_APPLICATION_FOCUS_OUT" }, // MainLoop
+ { "NOTIFICATION_WM_UNFOCUS_REQUEST", "NOTIFICATION_WM_WINDOW_FOCUS_OUT" }, //Node
+ { "PAUSE_MODE_INHERIT", "PROCESS_MODE_INHERIT" }, // Node
+ { "PAUSE_MODE_PROCESS", "PROCESS_MODE_ALWAYS" }, // Node
+ { "PAUSE_MODE_STOP", "PROCESS_MODE_PAUSABLE" }, // Node
+ { "RENDER_DRAW_CALLS_IN_FRAME", "RENDER_TOTAL_DRAW_CALLS_IN_FRAME" }, // Performance
+ { "RENDER_OBJECTS_IN_FRAME", "RENDER_TOTAL_OBJECTS_IN_FRAME" }, // Performance
+ { "SIDE_BOTTOM", "MARGIN_BOTTOM" }, // Globals
+ { "SIDE_LEFT", "MARGIN_LEFT" }, // Globals
+ { "SIDE_RIGHT", "MARGIN_RIGHT" }, // Globals
+ { "SIDE_TOP", "MARGIN_TOP" }, // Globals
+ { "TEXTURE_TYPE_2D_ARRAY", "TEXTURE_LAYERED_2D_ARRAY" }, // RenderingServer
+ { "TEXTURE_TYPE_CUBEMAP", "TEXTURE_LAYERED_CUBEMAP_ARRAY" }, // RenderingServer
+ { "TRACKER_LEFT_HAND", "TRACKER_HAND_LEFT" }, // XRPositionalTracker
+ { "TRACKER_RIGHT_HAND", "TRACKER_HAND_RIGHT" }, // XRPositionalTracker
+ { "TYPE_NORMALMAP", "TYPE_NORMAL_MAP" }, // VisualShaderNodeCubemap
+
+ /// enums
+ { "AlignMode", "AlignmentMode" }, //AspectRatioContainer
+ { "AnimationProcessMode", "AnimationProcessCallback" }, // AnimationTree, AnimationPlayer
+ { "Camera2DProcessMode", "Camera2DProcessCallback" }, // Camera2D
+ { "CubeMapSide", "CubeMapLayer" }, // RenderingServer
+ { "DampedStringParam", "DampedSpringParam" }, // PhysicsServer2D
+ { "FFT_Size", "FFTSize" }, // AudioEffectPitchShift,AudioEffectSpectrumAnalyzer
+ { "PauseMode", "ProcessMode" }, // Node
+ { "TimerProcessMode", "TimerProcessCallback" }, // Timer
+ { "Tracking_status", "TrackingStatus" }, // XRInterface
+ { nullptr, nullptr },
+};
+
+const char *RenamesMap3To4::gdscript_function_renames[][2] = {
+ // { "_set_name", "get_tracker_name"}, // XRPositionalTracker - CameraFeed use this
+ // { "_unhandled_input", "_unhandled_key_input"}, // BaseButton, ViewportContainer broke Node, FileDialog,SubViewportContainer
+ // { "create_gizmo", "_create_gizmo"}, // EditorNode3DGizmoPlugin - may be used
+ // { "get_dependencies", "_get_dependencies" }, // ResourceFormatLoader broke ResourceLoader
+ // { "get_extents", "get_size" }, // BoxShape, RectangleShape broke Decal, VoxelGI, GPUParticlesCollisionBox, GPUParticlesCollisionSDF, GPUParticlesCollisionHeightField, GPUParticlesAttractorBox, GPUParticlesAttractorVectorField, FogVolume
+ // { "get_h_offset", "get_drag_horizontal_offset"}, // Camera2D, broke PathFollow, Camera
+ // { "get_mode", "get_file_mode"}, // FileDialog broke Panel, Shader, CSGPolygon, Tilemap
+ // { "get_motion", "get_travel"}, // PhysicsTestMotionResult2D broke ParalaxLayer
+ // { "get_name", "get_tracker_name"}, // XRPositionalTracker broke OS, Node
+ // { "get_network_connected_peers", "get_peers"}, // MultiplayerAPI broke SceneTree
+ // { "get_network_peer", "has_multiplayer_peer"}, // MultiplayerAPI broke SceneTree
+ // { "get_network_unique_id", "get_unique_id"}, // MultiplayerAPI broke SceneTree
+ // { "get_offset", "get_position_offset" }, // GraphNode broke Gradient
+ // { "get_peer_port", "get_peer" }, // ENetMultiplayerPeer broke WebSocketServer
+ // { "get_process_mode", "get_process_callback" }, // ClippedCamera3D broke Node, Sky
+ // { "get_render_info", "get_rendering_info" }, // RenderingServer broke Viewport
+ // { "get_type", "get_tracker_type"}, // XRPositionalTracker broke GLTFAccessor, GLTFLight
+ // { "get_v_offset", "get_drag_vertical_offset"}, // Camera2D, broke PathFollow, Camera
+ // { "has_network_peer", "has_multiplayer_peer"}, // MultiplayerAPI broke SceneTree
+ // { "instance", "instantiate" }, // PackedScene, ClassDB - Broke FileSystemDock signal and also tscn files - [instance=ExtResource( 17 )] - this is implemented as custom rule
+ // { "is_listening", "is_bound"}, // PacketPeerUDP broke TCPServer, UDPServer
+ // { "is_refusing_new_network_connections", "is_refusing_new_connections"}, // MultiplayerAPI broke SceneTree
+ // { "is_valid", "has_valid_event" }, // Shortcut broke e.g. Callable
+ // { "listen", "bound"}, // PacketPeerUDP broke TCPServer, UDPServer
+ // { "load", "_load"}, // ResourceFormatLoader broke ConfigFile, Image, StreamTexture2D
+ // { "make_current", "set_current" }, // Camera2D broke Camera3D, Listener2D
+ // { "process", "_process" }, // AnimationNode - This word is commonly used
+ // { "save", "_save"}, // ResourceFormatLoader broke ConfigFile, Image, StreamTexture2D
+ // { "set_autowrap", "set_autowrap_mode" }, // AcceptDialog broke Label - Cyclic Rename
+ // { "set_color", "surface_set_color"}, // ImmediateMesh broke Light2D, Theme, SurfaceTool
+ // { "set_event", "set_shortcut" }, // BaseButton - Cyclic Rename
+ // { "set_extents", "set_size"}, // BoxShape, RectangleShape broke ReflectionProbe
+ // { "set_flag", "set_particle_flag"}, // ParticleProcessMaterial broke Window, HingeJoint3D
+ // { "set_h_offset", "set_drag_horizontal_offset" }, // Camera2D broke Camera3D, PathFollow3D, PathFollow2D
+ // { "set_margin", "set_offset" }, // Control broke Shape3D, AtlasTexture
+ // { "set_mode", "set_mode_file_mode" }, // FileDialog broke Panel, Shader, CSGPolygon, Tilemap
+ // { "set_normal", "surface_set_normal"}, // ImmediateGeometry broke SurfaceTool, WorldMarginShape2D
+ // { "set_offset", "set_progress" }, // PathFollow2D, PathFollow3D - Too common
+ // { "set_process_mode", "set_process_callback" }, // AnimationTree broke Node, Tween, Sky
+ // { "set_refuse_new_network_connections", "set_refuse_new_connections"}, // MultiplayerAPI broke SceneTree
+ // { "set_tooltip", "set_tooltip_text" }, // Control, breaks TreeItem, at least for now.
+ // { "set_uv", "surface_set_uv" }, // ImmediateMesh broke Polygon2D
+ // { "set_v_offset", "set_drag_vertical_offset" }, // Camera2D broke Camera3D, PathFollow3D, PathFollow2D
+ // {"get_points","get_points_id"},// Astar, broke Line2D, Convexpolygonshape
+ // {"get_v_scroll","get_v_scroll_bar"},//ItemList, broke TextView
+ // { "get_stylebox", "get_theme_stylebox" }, // Control - Will rename the method in Theme as well, skipping
+ { "_about_to_show", "_about_to_popup" }, // ColorPickerButton
+ { "_get_configuration_warning", "_get_configuration_warnings" }, // Node
+ { "_set_current", "set_current" }, // Camera2D
+ { "_set_editor_description", "set_editor_description" }, // Node
+ { "_toplevel_raise_self", "_top_level_raise_self" }, // CanvasItem
+ { "_update_wrap_at", "_update_wrap_at_column" }, // TextEdit
+ { "add_animation", "add_animation_library" }, // AnimationPlayer
+ { "add_cancel", "add_cancel_button" }, // AcceptDialog
+ { "add_central_force", "apply_central_force" }, //RigidBody2D
+ { "add_child_below_node", "add_sibling" }, // Node
+ { "add_color_override", "add_theme_color_override" }, // Control
+ { "add_constant_override", "add_theme_constant_override" }, // Control
+ { "add_font_override", "add_theme_font_override" }, // Control
+ { "add_force", "apply_force" }, //RigidBody2D
+ { "add_icon_override", "add_theme_icon_override" }, // Control
+ { "add_scene_import_plugin", "add_scene_format_importer_plugin" }, //EditorPlugin
+ { "add_spatial_gizmo_plugin", "add_node_3d_gizmo_plugin" }, // EditorPlugin
+ { "add_stylebox_override", "add_theme_stylebox_override" }, // Control
+ { "add_torque", "apply_torque" }, //RigidBody2D
+ { "agent_set_neighbor_dist", "agent_set_neighbor_distance" }, // NavigationServer2D, NavigationServer3D
+ { "apply_changes", "_apply_changes" }, // EditorPlugin
+ { "body_add_force", "body_apply_force" }, // PhysicsServer2D
+ { "body_add_torque", "body_apply_torque" }, // PhysicsServer2D
+ { "bumpmap_to_normalmap", "bump_map_to_normal_map" }, // Image
+ { "can_be_hidden", "_can_be_hidden" }, // EditorNode3DGizmoPlugin
+ { "can_drop_data", "_can_drop_data" }, // Control
+ { "can_generate_small_preview", "_can_generate_small_preview" }, // EditorResourcePreviewGenerator
+ { "can_instance", "can_instantiate" }, // PackedScene, Script
+ { "canvas_light_set_scale", "canvas_light_set_texture_scale" }, // RenderingServer
+ { "capture_get_device", "get_input_device" }, // AudioServer
+ { "capture_get_device_list", "get_input_device_list" }, // AudioServer
+ { "capture_set_device", "set_input_device" }, // AudioServer
+ { "center_viewport_to_cursor", "center_viewport_to_caret" }, // TextEdit
+ { "change_scene", "change_scene_to_file" }, // SceneTree
+ { "change_scene_to", "change_scene_to_packed" }, // SceneTree
+ { "clip_polygons_2d", "clip_polygons" }, // Geometry2D
+ { "clip_polyline_with_polygon_2d", "clip_polyline_with_polygon" }, //Geometry2D
+ { "commit_handle", "_commit_handle" }, // EditorNode3DGizmo
+ { "convex_hull_2d", "convex_hull" }, // Geometry2D
+ { "create_gizmo", "_create_gizmo" }, // EditorNode3DGizmoPlugin
+ { "cursor_get_blink_speed", "get_caret_blink_interval" }, // TextEdit
+ { "cursor_get_column", "get_caret_column" }, // TextEdit
+ { "cursor_get_line", "get_caret_line" }, // TextEdit
+ { "cursor_set_blink_enabled", "set_caret_blink_enabled" }, // TextEdit
+ { "cursor_set_blink_speed", "set_caret_blink_interval" }, // TextEdit
+ { "cursor_set_column", "set_caret_column" }, // TextEdit
+ { "cursor_set_line", "set_caret_line" }, // TextEdit
+ { "damped_spring_joint_create", "joint_make_damped_spring" }, // PhysicsServer2D
+ { "damped_string_joint_get_param", "damped_spring_joint_get_param" }, // PhysicsServer2D
+ { "damped_string_joint_set_param", "damped_spring_joint_set_param" }, // PhysicsServer2D
+ { "dectime", "move_toward" }, // GDScript, Math functions
+ { "delete_char_at_cursor", "delete_char_at_caret" }, // LineEdit
+ { "deselect_items", "deselect_all" }, // FileDialog
+ { "disable_plugin", "_disable_plugin" }, // EditorPlugin
+ { "drop_data", "_drop_data" }, // Control
+ { "exclude_polygons_2d", "exclude_polygons" }, // Geometry2D
+ { "find_node", "find_child" }, // Node
+ { "find_scancode_from_string", "find_keycode_from_string" }, // OS
+ { "forward_canvas_draw_over_viewport", "_forward_canvas_draw_over_viewport" }, // EditorPlugin
+ { "forward_canvas_force_draw_over_viewport", "_forward_canvas_force_draw_over_viewport" }, // EditorPlugin
+ { "forward_canvas_gui_input", "_forward_canvas_gui_input" }, // EditorPlugin
+ { "forward_spatial_draw_over_viewport", "_forward_3d_draw_over_viewport" }, // EditorPlugin
+ { "forward_spatial_force_draw_over_viewport", "_forward_3d_force_draw_over_viewport" }, // EditorPlugin
+ { "forward_spatial_gui_input", "_forward_3d_gui_input" }, // EditorPlugin
+ { "generate_from_path", "_generate_from_path" }, // EditorResourcePreviewGenerator
+ { "generate_small_preview_automatically", "_generate_small_preview_automatically" }, // EditorResourcePreviewGenerator
+ { "get_action_list", "action_get_events" }, // InputMap
+ { "get_alt", "is_alt_pressed" }, // InputEventWithModifiers
+ { "get_animation_process_mode", "get_process_callback" }, // AnimationPlayer
+ { "get_applied_force", "get_constant_force" }, //RigidBody2D
+ { "get_applied_torque", "get_constant_torque" }, //RigidBody2D
+ { "get_audio_bus", "get_audio_bus_name" }, // Area3D
+ { "get_bound_child_nodes_to_bone", "get_bone_children" }, // Skeleton3D
+ { "get_camera", "get_camera_3d" }, // Viewport -> this is also convertible to get_camera_2d, broke GLTFNode
+ { "get_cancel", "get_cancel_button" }, // ConfirmationDialog
+ { "get_caption", "_get_caption" }, // AnimationNode
+ { "get_cast_to", "get_target_position" }, // RayCast2D, RayCast3D
+ { "get_child_by_name", "_get_child_by_name" }, // AnimationNode
+ { "get_child_nodes", "_get_child_nodes" }, // AnimationNode
+ { "get_closest_point_to_segment_2d", "get_closest_point_to_segment" }, // Geometry2D
+ { "get_closest_point_to_segment_uncapped_2d", "get_closest_point_to_segment_uncapped" }, // Geometry2D
+ { "get_closest_points_between_segments_2d", "get_closest_point_to_segment" }, // Geometry2D
+ { "get_collision_layer_bit", "get_collision_layer_value" }, // CSGShape3D and a lot of others like GridMap
+ { "get_collision_mask_bit", "get_collision_mask_value" }, // CSGShape3D and a lot of others like GridMap
+ { "get_color_types", "get_color_type_list" }, // Theme
+ { "get_command", "is_command_or_control_pressed" }, // InputEventWithModifiers
+ { "get_constant_types", "get_constant_type_list" }, // Theme
+ { "get_control", "is_ctrl_pressed" }, // InputEventWithModifiers
+ { "get_cull_mask_bit", "get_cull_mask_value" }, // Camera3D
+ { "get_cursor_position", "get_caret_column" }, // LineEdit
+ { "get_d", "get_distance" }, // LineShape2D
+ { "get_depth_bias_enable", "get_depth_bias_enabled" }, // RDPipelineRasterizationState
+ { "get_device", "get_output_device" }, // AudioServer
+ { "get_device_list", "get_output_device_list" }, // AudioServer
+ { "get_drag_data", "_get_drag_data" }, // Control
+ { "get_editor_viewport", "get_editor_main_screen" }, // EditorPlugin
+ { "get_enabled_focus_mode", "get_focus_mode" }, // BaseButton
+ { "get_endian_swap", "is_big_endian" }, // File
+ { "get_error_string", "get_error_message" }, // JSON
+ { "get_filename", "get_scene_file_path" }, // Node, WARNING, this may be used in a lot of other places
+ { "get_focus_neighbour", "get_focus_neighbor" }, // Control
+ { "get_follow_smoothing", "get_position_smoothing_speed" }, // Camera2D
+ { "get_font_types", "get_font_type_list" }, // Theme
+ { "get_frame_color", "get_color" }, // ColorRect
+ { "get_global_rate_scale", "get_playback_speed_scale" }, // AudioServer
+ { "get_gravity_distance_scale", "get_gravity_point_unit_distance" }, // Area(2D/3D)
+ { "get_gravity_vector", "get_gravity_direction" }, // Area(2D/3D)
+ { "get_h_scrollbar", "get_h_scroll_bar" }, //ScrollContainer
+ { "get_hand", "get_tracker_hand" }, // XRPositionalTracker
+ { "get_handle_name", "_get_handle_name" }, // EditorNode3DGizmo
+ { "get_handle_value", "_get_handle_value" }, // EditorNode3DGizmo
+ { "get_icon_align", "get_icon_alignment" }, // Button
+ { "get_icon_types", "get_icon_type_list" }, // Theme
+ { "get_idle_frames", "get_process_frames" }, // Engine
+ { "get_import_options", "_get_import_options" }, // EditorImportPlugin
+ { "get_import_order", "_get_import_order" }, // EditorImportPlugin
+ { "get_importer_name", "_get_importer_name" }, // EditorImportPlugin
+ { "get_interior_ambient", "get_ambient_color" }, // ReflectionProbe
+ { "get_interior_ambient_energy", "get_ambient_color_energy" }, // ReflectionProbe
+ { "get_iterations_per_second", "get_physics_ticks_per_second" }, // Engine
+ { "get_last_mouse_speed", "get_last_mouse_velocity" }, // Input
+ { "get_layer_mask_bit", "get_layer_mask_value" }, // VisualInstance3D
+ { "get_len", "get_length" }, // File
+ { "get_max_atlas_size", "get_max_texture_size" }, // LightmapGI
+ { "get_metakey", "is_meta_pressed" }, // InputEventWithModifiers
+ { "get_mid_height", "get_height" }, // CapsuleMesh
+ { "get_motion_remainder", "get_remainder" }, // PhysicsTestMotionResult2D
+ { "get_neighbor_dist", "get_neighbor_distance" }, // NavigationAgent2D, NavigationAgent3D
+ { "get_network_connected_peers", "get_peers" }, // Multiplayer API
+ { "get_network_master", "get_multiplayer_authority" }, // Node
+ { "get_network_peer", "get_multiplayer_peer" }, // Multiplayer API
+ { "get_network_unique_id", "get_unique_id" }, // Multiplayer API
+ { "get_ok", "get_ok_button" }, // AcceptDialog
+ { "get_oneshot", "get_one_shot" }, // AnimatedTexture
+ { "get_option_visibility", "_get_option_visibility" }, // EditorImportPlugin
+ { "get_parameter_default_value", "_get_parameter_default_value" }, // AnimationNode
+ { "get_parameter_list", "_get_parameter_list" }, // AnimationNode
+ { "get_parent_spatial", "get_parent_node_3d" }, // Node3D
+ { "get_pause_mode", "get_process_mode" }, // Node
+ { "get_physical_scancode", "get_physical_keycode" }, // InputEventKey
+ { "get_physical_scancode_with_modifiers", "get_physical_keycode_with_modifiers" }, // InputEventKey
+ { "get_plugin_icon", "_get_plugin_icon" }, // EditorPlugin
+ { "get_plugin_name", "_get_plugin_name" }, // EditorPlugin
+ { "get_preset_count", "_get_preset_count" }, // EditorImportPlugin
+ { "get_preset_name", "_get_preset_name" }, // EditorImportPlugin
+ { "get_recognized_extensions", "_get_recognized_extensions" }, // ResourceFormatLoader, EditorImportPlugin broke ResourceSaver
+ { "get_render_info", "get_rendering_info" }, // RenderingServer
+ { "get_render_targetsize", "get_render_target_size" }, // XRInterface
+ { "get_resource_type", "_get_resource_type" }, // ResourceFormatLoader
+ { "get_result", "get_data" }, //JSON
+ { "get_reverb_bus", "set_reverb_bus_name" }, // Area3D
+ { "get_rpc_sender_id", "get_remote_sender_id" }, // Multiplayer API
+ { "get_save_extension", "_get_save_extension" }, // EditorImportPlugin
+ { "get_scancode", "get_keycode" }, // InputEventKey
+ { "get_scancode_string", "get_keycode_string" }, // OS
+ { "get_scancode_with_modifiers", "get_keycode_with_modifiers" }, // InputEventKey
+ { "get_selected_path", "get_current_directory" }, // EditorInterface
+ { "get_shift", "is_shift_pressed" }, // InputEventWithModifiers
+ { "get_size_override", "get_size_2d_override" }, // SubViewport
+ { "get_slide_count", "get_slide_collision_count" }, // CharacterBody2D, CharacterBody3D
+ { "get_slips_on_slope", "get_slide_on_slope" }, // SeparationRayShape2D, SeparationRayShape3D
+ { "get_space_override_mode", "get_gravity_space_override_mode" }, // Area2D
+ { "get_spatial_node", "get_node_3d" }, // EditorNode3DGizmo
+ { "get_speed", "get_velocity" }, // InputEventMouseMotion
+ { "get_stylebox_types", "get_stylebox_type_list" }, // Theme
+ { "get_surface_material", "get_surface_override_material" }, // MeshInstance3D broke ImporterMesh
+ { "get_surface_material_count", "get_surface_override_material_count" }, // MeshInstance3D
+ { "get_tab_disabled", "is_tab_disabled" }, // Tab
+ { "get_tab_hidden", "is_tab_hidden" }, // Tab
+ { "get_text_align", "get_text_alignment" }, // Button
+ { "get_theme_item_types", "get_theme_item_type_list" }, // Theme
+ { "get_timer_process_mode", "get_timer_process_callback" }, // Timer
+ { "get_translation", "get_position" }, // Node3D broke GLTFNode which is used rarely
+ { "get_unit_db", "get_volume_db" }, // AudioStreamPlayer3D
+ { "get_unit_offset", "get_progress_ratio" }, // PathFollow2D, PathFollow3D
+ { "get_use_in_baked_light", "is_baking_navigation" }, // GridMap
+ { "get_used_cells_by_id", "get_used_cells" }, // TileMap
+ { "get_v_scrollbar", "get_v_scroll_bar" }, //ScrollContainer
+ { "get_visible_name", "_get_visible_name" }, // EditorImportPlugin
+ { "get_window_layout", "_get_window_layout" }, // EditorPlugin
+ { "get_word_under_cursor", "get_word_under_caret" }, // TextEdit
+ { "get_world", "get_world_3d" }, // Viewport, Spatial
+ { "get_zfar", "get_far" }, // Camera3D broke GLTFCamera
+ { "get_znear", "get_near" }, // Camera3D broke GLTFCamera
+ { "groove_joint_create", "joint_make_groove" }, // PhysicsServer2D
+ { "handle_menu_selected", "_handle_menu_selected" }, // EditorResourcePicker
+ { "handles_type", "_handles_type" }, // ResourceFormatLoader
+ { "has_color", "has_theme_color" }, // Control broke Theme
+ { "has_color_override", "has_theme_color_override" }, // Control broke Theme
+ { "has_constant", "has_theme_constant" }, // Control
+ { "has_constant_override", "has_theme_constant_override" }, // Control
+ { "has_filter", "_has_filter" }, // AnimationNode
+ { "has_font", "has_theme_font" }, // Control broke Theme
+ { "has_font_override", "has_theme_font_override" }, // Control
+ { "has_icon", "has_theme_icon" }, // Control broke Theme
+ { "has_icon_override", "has_theme_icon_override" }, // Control
+ { "has_main_screen", "_has_main_screen" }, // EditorPlugin
+ { "has_network_peer", "has_multiplayer_peer" }, // Multiplayer API
+ { "has_stylebox", "has_theme_stylebox" }, // Control broke Theme
+ { "has_stylebox_override", "has_theme_stylebox_override" }, // Control
+ { "http_escape", "uri_encode" }, // String
+ { "http_unescape", "uri_decode" }, // String
+ { "import_scene_from_other_importer", "_import_scene" }, //EditorSceneFormatImporter
+ { "instance_set_surface_material", "instance_set_surface_override_material" }, // RenderingServer
+ { "interpolate", "sample" }, // Curve, Curve2D, Curve3D, Gradient
+ { "intersect_polygons_2d", "intersect_polygons" }, // Geometry2D
+ { "intersect_polyline_with_polygon_2d", "intersect_polyline_with_polygon" }, // Geometry2D
+ { "is_a_parent_of", "is_ancestor_of" }, // Node
+ { "is_commiting_action", "is_committing_action" }, // UndoRedo
+ { "is_doubleclick", "is_double_click" }, // InputEventMouseButton
+ { "is_draw_red", "is_draw_warning" }, // EditorProperty
+ { "is_follow_smoothing_enabled", "is_position_smoothing_enabled" }, // Camera2D
+ { "is_h_drag_enabled", "is_drag_horizontal_enabled" }, // Camera2D
+ { "is_handle_highlighted", "_is_handle_highlighted" }, // EditorNode3DGizmo, EditorNode3DGizmoPlugin
+ { "is_inverting_faces", "get_flip_faces" }, // CSGPrimitive3D
+ { "is_network_master", "is_multiplayer_authority" }, // Node
+ { "is_network_server", "is_server" }, // Multiplayer API
+ { "is_normalmap", "is_normal_map" }, // NoiseTexture
+ { "is_refusing_new_network_connections", "is_refusing_new_connections" }, // Multiplayer API
+ { "is_region", "is_region_enabled" }, // Sprite2D
+ { "is_rotating", "is_ignoring_rotation" }, // Camera2D
+ { "is_scancode_unicode", "is_keycode_unicode" }, // OS
+ { "is_selectable_when_hidden", "_is_selectable_when_hidden" }, // EditorNode3DGizmoPlugin
+ { "is_set_as_toplevel", "is_set_as_top_level" }, // CanvasItem
+ { "is_shortcut", "matches_event" }, // Shortcut
+ { "is_size_override_stretch_enabled", "is_size_2d_override_stretch_enabled" }, // SubViewport
+ { "is_sort_enabled", "is_y_sort_enabled" }, // Node2D
+ { "is_static_body", "is_able_to_sleep" }, // PhysicalBone3D - TODO - not sure
+ { "is_v_drag_enabled", "is_drag_vertical_enabled" }, // Camera2D
+ { "joint_create_cone_twist", "joint_make_cone_twist" }, // PhysicsServer3D
+ { "joint_create_generic_6dof", "joint_make_generic_6dof" }, // PhysicsServer3D
+ { "joint_create_hinge", "joint_make_hinge" }, // PhysicsServer3D
+ { "joint_create_pin", "joint_make_pin" }, // PhysicsServer3D
+ { "joint_create_slider", "joint_make_slider" }, // PhysicsServer3D
+ { "line_intersects_line_2d", "line_intersects_line" }, // Geometry2D
+ { "load_from_globals", "load_from_project_settings" }, // InputMap
+ { "load_interactive", "load_threaded_request" }, // ResourceLoader - load_threaded_request is alternative, but is used differently
+ { "make_convex_from_brothers", "make_convex_from_siblings" }, // CollisionShape3D
+ { "make_visible", "_make_visible" }, // EditorPlugin
+ { "merge_polygons_2d", "merge_polygons" }, // Geometry2D
+ { "mesh_surface_get_format", "mesh_surface_get_format_attribute_stride" }, // RenderingServer
+ { "mesh_surface_update_region", "mesh_surface_update_attribute_region" }, // RenderingServer
+ { "move_to_bottom", "move_after" }, // Skeleton3D
+ { "move_to_top", "move_before" }, // Skeleton3D
+ { "multimesh_allocate", "multimesh_allocate_data" }, // RenderingServer
+ { "normalmap_to_xy", "normal_map_to_xy" }, // Image
+ { "offset_polygon_2d", "offset_polygon" }, // Geometry2D
+ { "offset_polyline_2d", "offset_polyline" }, // Geometry2D
+ { "percent_decode", "uri_decode" }, // String
+ { "percent_encode", "uri_encode" }, // String
+ { "pin_joint_create", "joint_make_pin" }, // PhysicsServer2D
+ { "popup_centered_minsize", "popup_centered_clamped" }, // Window
+ { "post_import", "_post_import" }, // EditorScenePostImport
+ { "print_stray_nodes", "print_orphan_nodes" }, // Node
+ { "property_list_changed_notify", "notify_property_list_changed" }, // Object
+ { "raise", "move_to_front" }, // CanvasItem
+ { "recognize", "_recognize" }, // ResourceFormatLoader
+ { "regen_normalmaps", "regen_normal_maps" }, // ArrayMesh
+ { "remove", "remove_at" }, // Array, broke Directory
+ { "remove_animation", "remove_animation_library" }, // AnimationPlayer
+ { "remove_color_override", "remove_theme_color_override" }, // Control
+ { "remove_constant_override", "remove_theme_constant_override" }, // Control
+ { "remove_font_override", "remove_theme_font_override" }, // Control
+ { "remove_icon_override", "remove_theme_icon_override" }, // Control
+ { "remove_scene_import_plugin", "remove_scene_format_importer_plugin" }, //EditorPlugin
+ { "remove_spatial_gizmo_plugin", "remove_node_3d_gizmo_plugin" }, // EditorPlugin
+ { "remove_stylebox_override", "remove_theme_stylebox_override" }, // Control
+ { "rename_animation", "rename_animation_library" }, // AnimationPlayer
+ { "rename_dependencies", "_rename_dependencies" }, // ResourceFormatLoader
+ { "save_external_data", "_save_external_data" }, // EditorPlugin
+ { "segment_intersects_segment_2d", "segment_intersects_segment" }, // Geometry2D
+ { "set_adjustment_enable", "set_adjustment_enabled" }, // Environment
+ { "set_alt", "set_alt_pressed" }, // InputEventWithModifiers
+ { "set_anchor_and_margin", "set_anchor_and_offset" }, // Control
+ { "set_anchors_and_margins_preset", "set_anchors_and_offsets_preset" }, // Control
+ { "set_animation_process_mode", "set_process_callback" }, // AnimationPlayer
+ { "set_as_bulk_array", "set_buffer" }, // MultiMesh
+ { "set_as_normalmap", "set_as_normal_map" }, // NoiseTexture
+ { "set_as_toplevel", "set_as_top_level" }, // CanvasItem
+ { "set_audio_bus", "set_audio_bus_name" }, // Area3D
+ { "set_autowrap", "set_autowrap_mode" }, // Label broke AcceptDialog
+ { "set_cast_to", "set_target_position" }, // RayCast2D, RayCast3D
+ { "set_collision_layer_bit", "set_collision_layer_value" }, // CSGShape3D and a lot of others like GridMap
+ { "set_collision_mask_bit", "set_collision_mask_value" }, // CSGShape3D and a lot of others like GridMap
+ { "set_column_min_width", "set_column_custom_minimum_width" }, // Tree
+ { "set_command", "set_meta_pressed" }, // InputEventWithModifiers
+ { "set_control", "set_ctrl_pressed" }, // InputEventWithModifiers
+ { "set_create_options", "_set_create_options" }, // EditorResourcePicker
+ { "set_cull_mask_bit", "set_cull_mask_value" }, // Camera3D
+ { "set_cursor_position", "set_caret_column" }, // LineEdit
+ { "set_d", "set_distance" }, // WorldMarginShape2D
+ { "set_depth_bias_enable", "set_depth_bias_enabled" }, // RDPipelineRasterizationState
+ { "set_device", "set_output_device" }, // AudioServer
+ { "set_doubleclick", "set_double_click" }, // InputEventMouseButton
+ { "set_draw_red", "set_draw_warning" }, // EditorProperty
+ { "set_enable_follow_smoothing", "set_position_smoothing_enabled" }, // Camera2D
+ { "set_enabled_focus_mode", "set_focus_mode" }, // BaseButton
+ { "set_endian_swap", "set_big_endian" }, // File
+ { "set_expand_to_text_length", "set_expand_to_text_length_enabled" }, // LineEdit
+ { "set_filename", "set_scene_file_path" }, // Node, WARNING, this may be used in a lot of other places
+ { "set_focus_neighbour", "set_focus_neighbor" }, // Control
+ { "set_follow_smoothing", "set_position_smoothing_speed" }, // Camera2D
+ { "set_frame_color", "set_color" }, // ColorRect
+ { "set_global_rate_scale", "set_playback_speed_scale" }, // AudioServer
+ { "set_gravity_distance_scale", "set_gravity_point_unit_distance" }, // Area(2D/3D)
+ { "set_gravity_vector", "set_gravity_direction" }, // Area(2D/3D)
+ { "set_h_drag_enabled", "set_drag_horizontal_enabled" }, // Camera2D
+ { "set_icon_align", "set_icon_alignment" }, // Button
+ { "set_interior_ambient", "set_ambient_color" }, // ReflectionProbe
+ { "set_interior_ambient_energy", "set_ambient_color_energy" }, // ReflectionProbe
+ { "set_invert_faces", "set_flip_faces" }, // CSGPrimitive3D
+ { "set_is_initialized", "_is_initialized" }, // XRInterface
+ { "set_is_primary", "set_primary" }, // XRInterface
+ { "set_iterations_per_second", "set_physics_ticks_per_second" }, // Engine
+ { "set_layer_mask_bit", "set_layer_mask_value" }, // VisualInstance3D
+ { "set_margins_preset", "set_offsets_preset" }, // Control
+ { "set_max_atlas_size", "set_max_texture_size" }, // LightmapGI
+ { "set_metakey", "set_meta_pressed" }, // InputEventWithModifiers
+ { "set_mid_height", "set_height" }, // CapsuleMesh
+ { "set_neighbor_dist", "set_neighbor_distance" }, // NavigationAgent2D, NavigationAgent3D
+ { "set_network_master", "set_multiplayer_authority" }, // Node
+ { "set_network_peer", "set_multiplayer_peer" }, // Multiplayer API
+ { "set_oneshot", "set_one_shot" }, // AnimatedTexture
+ { "set_pause_mode", "set_process_mode" }, // Node
+ { "set_physical_scancode", "set_physical_keycode" }, // InputEventKey
+ { "set_proximity_fade", "set_proximity_fade_enabled" }, // Material
+ { "set_refuse_new_network_connections", "set_refuse_new_connections" }, // Multiplayer API
+ { "set_region", "set_region_enabled" }, // Sprite2D, Sprite broke AtlasTexture
+ { "set_region_filter_clip", "set_region_filter_clip_enabled" }, // Sprite2D
+ { "set_reverb_bus", "set_reverb_bus_name" }, // Area3D
+ { "set_rotate", "set_rotates" }, // PathFollow2D
+ { "set_scancode", "set_keycode" }, // InputEventKey
+ { "set_shift", "set_shift_pressed" }, // InputEventWithModifiers
+ { "set_size_override", "set_size_2d_override" }, // SubViewport broke ImageTexture
+ { "set_size_override_stretch", "set_size_2d_override_stretch" }, // SubViewport
+ { "set_slips_on_slope", "set_slide_on_slope" }, // SeparationRayShape2D, SeparationRayShape3D
+ { "set_sort_enabled", "set_y_sort_enabled" }, // Node2D
+ { "set_space_override_mode", "set_gravity_space_override_mode" }, // Area2D
+ { "set_spatial_node", "set_node_3d" }, // EditorNode3DGizmo
+ { "set_speed", "set_velocity" }, // InputEventMouseMotion
+ { "set_ssao_edge_sharpness", "set_ssao_sharpness" }, // Environment
+ { "set_surface_material", "set_surface_override_material" }, // MeshInstance3D broke ImporterMesh
+ { "set_tab_align", "set_tab_alignment" }, //TabContainer
+ { "set_tangent", "surface_set_tangent" }, // ImmediateGeometry broke SurfaceTool
+ { "set_text_align", "set_text_alignment" }, // Button
+ { "set_timer_process_mode", "set_timer_process_callback" }, // Timer
+ { "set_translation", "set_position" }, // Node3D - this broke GLTFNode which is used rarely
+ { "set_unit_db", "set_volume_db" }, // AudioStreamPlayer3D
+ { "set_unit_offset", "set_progress_ratio" }, // PathFollow2D, PathFollow3D
+ { "set_uv2", "surface_set_uv2" }, // ImmediateMesh broke Surffacetool
+ { "set_v_drag_enabled", "set_drag_vertical_enabled" }, // Camera2D
+ { "set_valign", "set_vertical_alignment" }, // Label
+ { "set_window_layout", "_set_window_layout" }, // EditorPlugin
+ { "set_zfar", "set_far" }, // Camera3D broke GLTFCamera
+ { "set_znear", "set_near" }, // Camera3D broke GLTFCamera
+ { "shortcut_match", "is_match" }, // InputEvent
+ { "skeleton_allocate", "skeleton_allocate_data" }, // RenderingServer
+ { "surface_update_region", "surface_update_attribute_region" }, // ArrayMesh
+ { "targeting_method", "tween_method" }, // Tween
+ { "targeting_property", "tween_property" }, // Tween
+ { "track_remove_key_at_position", "track_remove_key_at_time" }, // Animation
+ { "triangulate_delaunay_2d", "triangulate_delaunay" }, // Geometry2D
+ { "unselect", "deselect" }, // ItemList
+ { "unselect_all", "deselect_all" }, // ItemList
+ { "update_configuration_warning", "update_configuration_warnings" }, // Node
+ { "update_gizmo", "update_gizmos" }, // Node3D
+ { "viewport_set_use_arvr", "viewport_set_use_xr" }, // RenderingServer
+ { "warp_mouse_position", "warp_mouse" }, // Input
+ { "world_to_map", "local_to_map" }, // TileMap, GridMap
+ { "set_shader_param", "set_shader_parameter" }, // ShaderMaterial
+ { "get_shader_param", "get_shader_parameter" }, // ShaderMaterial
+ { "set_uniform_name", "set_parameter_name" }, // ParameterRef
+ { "get_uniform_name", "get_parameter_name" }, // ParameterRef
+
+ // Builtin types
+ // Remember to add them to builtin_types_excluded_functions variable, because for now this functions cannot be listed
+ // { "empty", "is_empty" }, // Array - Used as custom rule // Be careful, this will be used everywhere
+ { "clamped", "clamp" }, // Vector2 // Be careful, this will be used everywhere
+ { "get_rotation_quat", "get_rotation_quaternion" }, // Basis
+ { "grow_margin", "grow_side" }, // Rect2
+ { "invert", "reverse" }, // Array - TODO check // Be careful, this will be used everywhere
+ { "is_abs_path", "is_absolute_path" }, // String
+ { "is_valid_integer", "is_valid_int" }, // String
+ { "linear_interpolate", "lerp" }, // Color
+ { "find_last", "rfind" }, // Array, String
+ { "to_ascii", "to_ascii_buffer" }, // String
+ { "to_utf8", "to_utf8_buffer" }, // String
+ { "to_wchar", "to_utf32_buffer" }, // String // TODO - utf32 or utf16?
+
+ // @GlobalScope
+ // Remember to add them to builtin_types_excluded_functions variable, because for now this functions cannot be listed
+ { "bytes2var", "bytes_to_var" },
+ { "bytes2var_with_objects", "bytes_to_var_with_objects" },
+ { "db2linear", "db_to_linear" },
+ { "deg2rad", "deg_to_rad" },
+ { "linear2db", "linear_to_db" },
+ { "rad2deg", "rad_to_deg" },
+ { "rand_range", "randf_range" },
+ { "range_lerp", "remap" },
+ { "stepify", "snapped" },
+ { "str2var", "str_to_var" },
+ { "var2str", "var_to_str" },
+ { "var2bytes", "var_to_bytes" },
+ { "var2bytes_with_objects", "var_to_bytes_with_objects" },
+
+ // @GDScript
+ // Remember to add them to builtin_types_excluded_functions variable, because for now this functions cannot be listed
+ { "dict2inst", "dict_to_inst" },
+ { "inst2dict", "inst_to_dict" },
+
+ { nullptr, nullptr },
+};
+
+// gdscript_function_renames clone with CamelCase
+const char *RenamesMap3To4::csharp_function_renames[][2] = {
+ // { "_SetName", "GetTrackerName"}, // XRPositionalTracker - CameraFeed use this
+ // { "_UnhandledInput", "_UnhandledKeyInput"}, // BaseButton, ViewportContainer broke Node, FileDialog,SubViewportContainer
+ // { "CreateGizmo", "_CreateGizmo"}, // EditorNode3DGizmoPlugin - may be used
+ // { "GetDependencies", "_GetDependencies" }, // ResourceFormatLoader broke ResourceLoader
+ // { "GetExtents", "GetSize" }, // BoxShape, RectangleShape broke Decal, VoxelGI, GPUParticlesCollisionBox, GPUParticlesCollisionSDF, GPUParticlesCollisionHeightField, GPUParticlesAttractorBox, GPUParticlesAttractorVectorField, FogVolume
+ // { "GetHOffset", "GetDragHorizontalOffset"}, // Camera2D, broke PathFollow, Camera
+ // { "GetMode", "GetFileMode"}, // FileDialog broke Panel, Shader, CSGPolygon, Tilemap
+ // { "GetMotion", "GetTravel"}, // PhysicsTestMotionResult2D broke ParalaxLayer
+ // { "GetName", "GetTrackerName"}, // XRPositionalTracker broke OS, Node
+ // { "GetNetworkConnectedPeers", "GetPeers"}, // MultiplayerAPI broke SceneTree
+ // { "GetNetworkPeer", "HasMultiplayerPeer"}, // MultiplayerAPI broke SceneTree
+ // { "GetNetworkUniqueId", "GetUniqueId"}, // MultiplayerAPI broke SceneTree
+ // { "GetOffset", "GetPositionOffset" }, // GraphNode broke Gradient
+ // { "GetPeerPort", "GetPeer" }, // ENetMultiplayerPeer broke WebSocketServer
+ // { "GetProcessMode", "GetProcessCallback" }, // ClippedCamera3D broke Node, Sky
+ // { "GetRenderInfo", "GetRenderingInfo" }, // RenderingServer broke Viewport
+ // { "GetType", "GetTrackerType"}, // XRPositionalTracker broke GLTFAccessor, GLTFLight
+ // { "GetVOffset", "GetDragVerticalOffset"}, // Camera2D, broke PathFollow, Camera
+ // { "HasNetworkPeer", "HasMultiplayerPeer"}, // MultiplayerAPI broke SceneTree
+ // { "Instance", "Instantiate" }, // PackedScene, ClassDB - Broke FileSystemDock signal and also tscn files - [instance=ExtResource( 17 )] - this is implemented as custom rule
+ // { "IsListening", "IsBound"}, // PacketPeerUDP broke TCPServer, UDPServer
+ // { "IsRefusingNewNetworkConnections", "IsRefusingNewConnections"}, // MultiplayerAPI broke SceneTree
+ // { "IsValid", "HasValidEvent" }, // Shortcut broke e.g. Callable
+ // { "Listen", "Bound"}, // PacketPeerUDP broke TCPServer, UDPServer
+ // { "Load", "_Load"}, // ResourceFormatLoader broke ConfigFile, Image, StreamTexture2D
+ // { "MakeCurrent", "SetCurrent" }, // Camera2D broke Camera3D, Listener2D
+ // { "Process", "_Process" }, // AnimationNode - This word is commonly used
+ // { "Save", "_Save"}, // ResourceFormatLoader broke ConfigFile, Image, StreamTexture2D
+ // { "SetAutowrap", "SetAutowrapMode" }, // AcceptDialog broke Label - Cyclic Rename
+ // { "SetColor", "SurfaceSetColor"}, // ImmediateMesh broke Light2D, Theme, SurfaceTool
+ // { "SetEvent", "SetShortcut" }, // BaseButton - Cyclic Rename
+ // { "SetExtents", "SetSize"}, // BoxShape, RectangleShape broke ReflectionProbe
+ // { "SetFlag", "SetParticleFlag"}, // ParticleProcessMaterial broke Window, HingeJoint3D
+ // { "SetHOffset", "SetDragHorizontalOffset" }, // Camera2D broke Camera3D, PathFollow3D, PathFollow2D
+ // { "SetMargin", "SetOffset" }, // Control broke Shape3D, AtlasTexture
+ // { "SetMode", "SetModeFileMode" }, // FileDialog broke Panel, Shader, CSGPolygon, Tilemap
+ // { "SetNormal", "SurfaceSetNormal"}, // ImmediateGeometry broke SurfaceTool, WorldMarginShape2D
+ // { "SetOffset", "SetProgress" }, // PathFollow2D, PathFollow3D - Too common
+ // { "SetProcessMode", "SetProcessCallback" }, // AnimationTree broke Node, Tween, Sky
+ // { "SetRefuseNewNetworkConnections", "SetRefuseNewConnections"}, // MultiplayerAPI broke SceneTree
+ // { "SetTooltip", "SetTooltipText" }, // Control, breaks TreeItem, at least for now.
+ // { "SetUv", "SurfaceSetUv" }, // ImmediateMesh broke Polygon2D
+ // { "SetVOffset", "SetDragVerticalOffset" }, // Camera2D broke Camera3D, PathFollow3D, PathFollow2D
+ // {"GetPoints","GetPointsId"},// Astar, broke Line2D, Convexpolygonshape
+ // {"GetVScroll","GetVScrollBar"},//ItemList, broke TextView
+ // { "GetStylebox", "GetThemeStylebox" }, // Control - Will rename the method in Theme as well, skipping
+ { "AddSpatialGizmoPlugin", "AddNode3dGizmoPlugin" }, // EditorPlugin
+ { "RenderingServer", "GetTabAlignment" }, // Tab
+ { "_AboutToShow", "_AboutToPopup" }, // ColorPickerButton
+ { "_GetConfigurationWarning", "_GetConfigurationWarnings" }, // Node
+ { "_SetCurrent", "SetCurrent" }, // Camera2D
+ { "_SetEditorDescription", "SetEditorDescription" }, // Node
+ { "_SetPlaying", "SetPlaying" }, // AnimatedSprite3D
+ { "_ToplevelRaiseSelf", "_TopLevelRaiseSelf" }, // CanvasItem
+ { "_UpdateWrapAt", "_UpdateWrapAtColumn" }, // TextEdit
+ { "AddAnimation", "AddAnimationLibrary" }, // AnimationPlayer
+ { "AddCancel", "AddCancelButton" }, // AcceptDialog
+ { "AddCentralForce", "AddConstantCentralForce" }, //RigidBody2D
+ { "AddChildBelowNode", "AddSibling" }, // Node
+ { "AddColorOverride", "AddThemeColorOverride" }, // Control
+ { "AddConstantOverride", "AddThemeConstantOverride" }, // Control
+ { "AddFontOverride", "AddThemeFontOverride" }, // Control
+ { "AddForce", "AddConstantForce" }, //RigidBody2D
+ { "AddIconOverride", "AddThemeIconOverride" }, // Control
+ { "AddSceneImportPlugin", "AddSceneFormatImporterPlugin" }, //EditorPlugin
+ { "AddStyleboxOverride", "AddThemeStyleboxOverride" }, // Control
+ { "AddTorque", "AddConstantTorque" }, //RigidBody2D
+ { "AgentSetNeighborDist", "AgentSetNeighborDistance" }, // NavigationServer2D, NavigationServer3D
+ { "BindChildNodeToBone", "SetBoneChildren" }, // Skeleton3D
+ { "BumpmapToNormalmap", "BumpMapToNormalMap" }, // Image
+ { "CanBeHidden", "_CanBeHidden" }, // EditorNode3DGizmoPlugin
+ { "CanDropData", "_CanDropData" }, // Control
+ { "CanDropDataFw", "_CanDropDataFw" }, // ScriptEditor
+ { "CanGenerateSmallPreview", "_CanGenerateSmallPreview" }, // EditorResourcePreviewGenerator
+ { "CanInstance", "CanInstantiate" }, // PackedScene, Script
+ { "CanvasLightSetScale", "CanvasLightSetTextureScale" }, // RenderingServer
+ { "CaptureGetDevice", "GetInputDevice" }, // AudioServer
+ { "CaptureGetDeviceList", "GetInputDeviceList" }, // AudioServer
+ { "CaptureSetDevice", "SetInputDevice" }, // AudioServer
+ { "CenterViewportToCursor", "CenterViewportToCaret" }, // TextEdit
+ { "ChangeScene", "ChangeSceneToFile" }, // SceneTree
+ { "ChangeSceneTo", "ChangeSceneToPacked" }, // SceneTree
+ { "ClipPolygons2d", "ClipPolygons" }, // Geometry2D
+ { "ClipPolylineWithPolygon2d", "ClipPolylineWithPolygon" }, //Geometry2D
+ { "CommitHandle", "_CommitHandle" }, // EditorNode3DGizmo
+ { "ConvexHull2d", "ConvexHull" }, // Geometry2D
+ { "CursorGetBlinkSpeed", "GetCaretBlinkInterval" }, // TextEdit
+ { "CursorGetColumn", "GetCaretColumn" }, // TextEdit
+ { "CursorGetLine", "GetCaretLine" }, // TextEdit
+ { "CursorSetBlinkEnabled", "SetCaretBlinkEnabled" }, // TextEdit
+ { "CursorSetBlinkSpeed", "SetCaretBlinkInterval" }, // TextEdit
+ { "CursorSetColumn", "SetCaretColumn" }, // TextEdit
+ { "CursorSetLine", "SetCaretLine" }, // TextEdit
+ { "DampedSpringJointCreate", "JointMakeDampedSpring" }, // PhysicsServer2D
+ { "DampedStringJointGetParam", "DampedSpringJointGetParam" }, // PhysicsServer2D
+ { "DampedStringJointSetParam", "DampedSpringJointSetParam" }, // PhysicsServer2D
+ { "DeleteCharAtCursor", "DeleteCharAtCaret" }, // LineEdit
+ { "DeselectItems", "DeselectAll" }, // FileDialog
+ { "DropData", "_DropData" }, // Control
+ { "DropDataFw", "_DropDataFw" }, // ScriptEditor
+ { "ExcludePolygons2d", "ExcludePolygons" }, // Geometry2D
+ { "FindScancodeFromString", "FindKeycodeFromString" }, // OS
+ { "ForwardCanvasDrawOverViewport", "_ForwardCanvasDrawOverViewport" }, // EditorPlugin
+ { "ForwardCanvasForceDrawOverViewport", "_ForwardCanvasForceDrawOverViewport" }, // EditorPlugin
+ { "ForwardCanvasGuiInput", "_ForwardCanvasGuiInput" }, // EditorPlugin
+ { "ForwardSpatialDrawOverViewport", "_Forward3dDrawOverViewport" }, // EditorPlugin
+ { "ForwardSpatialForceDrawOverViewport", "_Forward3dForceDrawOverViewport" }, // EditorPlugin
+ { "ForwardSpatialGuiInput", "_Forward3dGuiInput" }, // EditorPlugin
+ { "GenerateFromPath", "_GenerateFromPath" }, // EditorResourcePreviewGenerator
+ { "GenerateSmallPreviewAutomatically", "_GenerateSmallPreviewAutomatically" }, // EditorResourcePreviewGenerator
+ { "GetActionList", "ActionGetEvents" }, // InputMap
+ { "GetAlt", "IsAltPressed" }, // InputEventWithModifiers
+ { "GetAnimationProcessMode", "GetProcessCallback" }, // AnimationPlayer
+ { "GetAppliedForce", "GetConstantForce" }, //RigidBody2D
+ { "GetAppliedTorque", "GetConstantTorque" }, //RigidBody2D
+ { "GetAudioBus", "GetAudioBusName" }, // Area3D
+ { "GetBoundChildNodesToBone", "GetBoneChildren" }, // Skeleton3D
+ { "GetCamera", "GetCamera3d" }, // Viewport -> this is also convertible to getCamera2d, broke GLTFNode
+ { "GetCancel", "GetCancelButton" }, // ConfirmationDialog
+ { "GetCaption", "_GetCaption" }, // AnimationNode
+ { "GetCastTo", "GetTargetPosition" }, // RayCast2D, RayCast3D
+ { "GetChildByName", "_GetChildByName" }, // AnimationNode
+ { "GetChildNodes", "_GetChildNodes" }, // AnimationNode
+ { "GetClosestPointToSegment2d", "GetClosestPointToSegment" }, // Geometry2D
+ { "GetClosestPointToSegmentUncapped2d", "GetClosestPointToSegmentUncapped" }, // Geometry2D
+ { "GetClosestPointsBetweenSegments2d", "GetClosestPointToSegment" }, // Geometry2D
+ { "GetCollisionLayerBit", "GetCollisionLayerValue" }, // CSGShape3D and a lot of others like GridMap
+ { "GetCollisionMaskBit", "GetCollisionMaskValue" }, // CSGShape3D and a lot of others like GridMap
+ { "GetColorTypes", "GetColorTypeList" }, // Theme
+ { "GetCommand", "IsCommandPressed" }, // InputEventWithModifiers
+ { "GetConstantTypes", "GetConstantTypeList" }, // Theme
+ { "GetControl", "IsCtrlPressed" }, // InputEventWithModifiers
+ { "GetCullMaskBit", "GetCullMaskValue" }, // Camera3D
+ { "GetCursorPosition", "GetCaretColumn" }, // LineEdit
+ { "GetD", "GetDistance" }, // LineShape2D
+ { "GetDepthBiasEnable", "GetDepthBiasEnabled" }, // RDPipelineRasterizationState
+ { "GetDevice", "GetOutputDevice" }, // AudioServer
+ { "GetDeviceList", "GetOutputDeviceList" }, // AudioServer
+ { "GetDragDataFw", "_GetDragDataFw" }, // ScriptEditor
+ { "GetEditorViewport", "GetViewport" }, // EditorPlugin
+ { "GetEnabledFocusMode", "GetFocusMode" }, // BaseButton
+ { "GetEndianSwap", "IsBigEndian" }, // File
+ { "GetErrorString", "GetErrorMessage" }, // JSON
+ { "GetFocusNeighbour", "GetFocusNeighbor" }, // Control
+ { "GetFollowSmoothing", "GetFollowSmoothingSpeed" }, // Camera2D
+ { "GetFontTypes", "GetFontTypeList" }, // Theme
+ { "GetFrameColor", "GetColor" }, // ColorRect
+ { "GetGlobalRateScale", "GetPlaybackSpeedScale" }, // AudioServer
+ { "GetGravityDistanceScale", "GetGravityPointDistanceScale" }, //Area2D
+ { "GetGravityVector", "GetGravityDirection" }, //Area2D
+ { "GetHScrollbar", "GetHScrollBar" }, //ScrollContainer
+ { "GetHand", "GetTrackerHand" }, // XRPositionalTracker
+ { "GetHandleName", "_GetHandleName" }, // EditorNode3DGizmo
+ { "GetHandleValue", "_GetHandleValue" }, // EditorNode3DGizmo
+ { "GetIconAlign", "GetIconAlignment" }, // Button
+ { "GetIconTypes", "GetIconTypeList" }, // Theme
+ { "GetIdleFrames", "GetProcessFrames" }, // Engine
+ { "GetImportOptions", "_GetImportOptions" }, // EditorImportPlugin
+ { "GetImportOrder", "_GetImportOrder" }, // EditorImportPlugin
+ { "GetImporterName", "_GetImporterName" }, // EditorImportPlugin
+ { "GetInteriorAmbient", "GetAmbientColor" }, // ReflectionProbe
+ { "GetInteriorAmbientEnergy", "GetAmbientColorEnergy" }, // ReflectionProbe
+ { "GetIterationsPerSecond", "GetPhysicsTicksPerSecond" }, // Engine
+ { "GetLastMouseSpeed", "GetLastMouseVelocity" }, // Input
+ { "GetLayerMaskBit", "GetLayerMaskValue" }, // VisualInstance3D
+ { "GetLen", "GetLength" }, // File
+ { "GetMaxAtlasSize", "GetMaxTextureSize" }, // LightmapGI
+ { "GetMetakey", "IsMetaPressed" }, // InputEventWithModifiers
+ { "GetMidHeight", "GetHeight" }, // CapsuleMesh
+ { "GetMotionRemainder", "GetRemainder" }, // PhysicsTestMotionResult2D
+ { "GetNeighborDist", "GetNeighborDistance" }, // NavigationAgent2D, NavigationAgent3D
+ { "GetNetworkConnectedPeers", "GetPeers" }, // Multiplayer API
+ { "GetNetworkMaster", "GetMultiplayerAuthority" }, // Node
+ { "GetNetworkPeer", "GetMultiplayerPeer" }, // Multiplayer API
+ { "GetNetworkUniqueId", "GetUniqueId" }, // Multiplayer API
+ { "GetOneshot", "GetOneShot" }, // AnimatedTexture
+ { "GetOk", "GetOkButton" }, // AcceptDialog
+ { "GetOptionVisibility", "_GetOptionVisibility" }, // EditorImportPlugin
+ { "GetParameterDefaultValue", "_GetParameterDefaultValue" }, // AnimationNode
+ { "GetParameterList", "_GetParameterList" }, // AnimationNode
+ { "GetParentSpatial", "GetParentNode3d" }, // Node3D
+ { "GetPhysicalScancode", "GetPhysicalKeycode" }, // InputEventKey
+ { "GetPhysicalScancodeWithModifiers", "GetPhysicalKeycodeWithModifiers" }, // InputEventKey
+ { "GetPluginIcon", "_GetPluginIcon" }, // EditorPlugin
+ { "GetPluginName", "_GetPluginName" }, // EditorPlugin
+ { "GetPresetCount", "_GetPresetCount" }, // EditorImportPlugin
+ { "GetPresetName", "_GetPresetName" }, // EditorImportPlugin
+ { "GetRecognizedExtensions", "_GetRecognizedExtensions" }, // ResourceFormatLoader, EditorImportPlugin broke ResourceSaver
+ { "GetRenderInfo", "GetRenderingInfo" }, // RenderingServer
+ { "GetRenderTargetsize", "GetRenderTargetSize" }, // XRInterface
+ { "GetResourceType", "_GetResourceType" }, // ResourceFormatLoader
+ { "GetResult", "GetData" }, //JSON
+ { "GetReverbBus", "GetReverbBusName" }, // Area3D
+ { "GetRpcSenderId", "GetRemoteSenderId" }, // Multiplayer API
+ { "GetSaveExtension", "_GetSaveExtension" }, // EditorImportPlugin
+ { "GetScancode", "GetKeycode" }, // InputEventKey
+ { "GetScancodeString", "GetKeycodeString" }, // OS
+ { "GetScancodeWithModifiers", "GetKeycodeWithModifiers" }, // InputEventKey
+ { "GetShift", "IsShiftPressed" }, // InputEventWithModifiers
+ { "GetSizeOverride", "GetSize2dOverride" }, // SubViewport
+ { "GetSlipsOnSlope", "GetSlideOnSlope" }, // SeparationRayShape2D, SeparationRayShape3D
+ { "GetSpaceOverrideMode", "GetGravitySpaceOverrideMode" }, // Area2D
+ { "GetSpatialNode", "GetNode3d" }, // EditorNode3DGizmo
+ { "GetSpeed", "GetVelocity" }, // InputEventMouseMotion
+ { "GetStyleboxTypes", "GetStyleboxTypeList" }, // Theme
+ { "GetSurfaceMaterial", "GetSurfaceOverrideMaterial" }, // MeshInstance3D broke ImporterMesh
+ { "GetSurfaceMaterialCount", "GetSurfaceOverrideMaterialCount" }, // MeshInstance3D
+ { "GetTabDisabled", "IsTabDisabled" }, // Tab
+ { "GetTabHidden", "IsTabHidden" }, // Tab
+ { "GetTextAlign", "GetTextAlignment" }, // Button
+ { "GetThemeItemTypes", "GetThemeItemTypeList" }, // Theme
+ { "GetTimerProcessMode", "GetTimerProcessCallback" }, // Timer
+ { "GetTranslation", "GetPosition" }, // Node3D broke GLTFNode which is used rarely
+ { "GetUnitDb", "GetVolumeDb" }, // AudioStreamPlayer3D
+ { "GetUnitOffset", "GetProgressRatio" }, // PathFollow2D, PathFollow3D
+ { "GetUseInBakedLight", "IsBakingNavigation" }, // GridMap
+ { "GetUsedCellsById", "GetUsedCells" }, // TileMap
+ { "GetVScrollbar", "GetVScrollBar" }, //ScrollContainer
+ { "GetVisibleName", "_GetVisibleName" }, // EditorImportPlugin
+ { "GetWindowLayout", "_GetWindowLayout" }, // EditorPlugin
+ { "GetWordUnderCursor", "GetWordUnderCaret" }, // TextEdit
+ { "GetWorld", "GetWorld3d" }, // Viewport, Spatial
+ { "GetZfar", "GetFar" }, // Camera3D broke GLTFCamera
+ { "GetZnear", "GetNear" }, // Camera3D broke GLTFCamera
+ { "GrooveJointCreate", "JointMakeGroove" }, // PhysicsServer2D
+ { "HandleMenuSelected", "_HandleMenuSelected" }, // EditorResourcePicker
+ { "HandlesType", "_HandlesType" }, // ResourceFormatLoader
+ { "HasColor", "HasThemeColor" }, // Control broke Theme
+ { "HasColorOverride", "HasThemeColorOverride" }, // Control broke Theme
+ { "HasConstant", "HasThemeConstant" }, // Control
+ { "HasConstantOverride", "HasThemeConstantOverride" }, // Control
+ { "HasFilter", "_HasFilter" }, // AnimationNode
+ { "HasFont", "HasThemeFont" }, // Control broke Theme
+ { "HasFontOverride", "HasThemeFontOverride" }, // Control
+ { "HasIcon", "HasThemeIcon" }, // Control broke Theme
+ { "HasIconOverride", "HasThemeIconOverride" }, // Control
+ { "HasMainScreen", "_HasMainScreen" }, // EditorPlugin
+ { "HasNetworkPeer", "HasMultiplayerPeer" }, // Multiplayer API
+ { "HasStylebox", "HasThemeStylebox" }, // Control broke Theme
+ { "HasStyleboxOverride", "HasThemeStyleboxOverride" }, // Control
+ { "HttpEscape", "UriEncode" }, // String
+ { "HttpUnescape", "UriDecode" }, // String
+ { "ImportAnimationFromOtherImporter", "_ImportAnimation" }, //EditorSceneFormatImporter
+ { "ImportSceneFromOtherImporter", "_ImportScene" }, //EditorSceneFormatImporter
+ { "InstanceSetSurfaceMaterial", "InstanceSetSurfaceOverrideMaterial" }, // RenderingServer
+ { "IntersectPolygons2d", "IntersectPolygons" }, // Geometry2D
+ { "IntersectPolylineWithPolygon2d", "IntersectPolylineWithPolygon" }, // Geometry2D
+ { "IsAParentOf", "IsAncestorOf" }, // Node
+ { "IsCommitingAction", "IsCommittingAction" }, // UndoRedo
+ { "IsDoubleclick", "IsDoubleClick" }, // InputEventMouseButton
+ { "IsFollowSmoothingEnabled", "IsPositionSmoothingEnabled" }, // Camera2D
+ { "IsHDragEnabled", "IsDragHorizontalEnabled" }, // Camera2D
+ { "IsHandleHighlighted", "_IsHandleHighlighted" }, // EditorNode3DGizmo, EditorNode3DGizmoPlugin
+ { "IsNetworkMaster", "IsMultiplayerAuthority" }, // Node
+ { "IsNetworkServer", "IsServer" }, // Multiplayer API
+ { "IsNormalmap", "IsNormalMap" }, // NoiseTexture
+ { "IsRefusingNewNetworkConnections", "IsRefusingNewConnections" }, // Multiplayer API
+ { "IsRegion", "IsRegionEnabled" }, // Sprite2D
+ { "IsRotating", "IsIgnoringRotation" }, // Camera2D
+ { "IsScancodeUnicode", "IsKeycodeUnicode" }, // OS
+ { "IsSelectableWhenHidden", "_IsSelectableWhenHidden" }, // EditorNode3DGizmoPlugin
+ { "IsSetAsToplevel", "IsSetAsTopLevel" }, // CanvasItem
+ { "IsShortcut", "MatchesEvent" }, // Shortcut
+ { "IsSizeOverrideStretchEnabled", "IsSize2dOverrideStretchEnabled" }, // SubViewport
+ { "IsSortEnabled", "IsYSortEnabled" }, // Node2D
+ { "IsStaticBody", "IsAbleToSleep" }, // PhysicalBone3D - TODO - not sure
+ { "IsVDragEnabled", "IsDragVerticalEnabled" }, // Camera2D
+ { "JointCreateConeTwist", "JointMakeConeTwist" }, // PhysicsServer3D
+ { "JointCreateGeneric6dof", "JointMakeGeneric6dof" }, // PhysicsServer3D
+ { "JointCreateHinge", "JointMakeHinge" }, // PhysicsServer3D
+ { "JointCreatePin", "JointMakePin" }, // PhysicsServer3D
+ { "JointCreateSlider", "JointMakeSlider" }, // PhysicsServer3D
+ { "LineIntersectsLine2d", "LineIntersectsLine" }, // Geometry2D
+ { "LoadFromGlobals", "LoadFromProjectSettings" }, // InputMap
+ { "MakeConvexFromBrothers", "MakeConvexFromSiblings" }, // CollisionShape3D
+ { "MergePolygons2d", "MergePolygons" }, // Geometry2D
+ { "MeshSurfaceGetFormat", "MeshSurfaceGetFormatAttributeStride" }, // RenderingServer
+ { "MeshSurfaceUpdateRegion", "MeshSurfaceUpdateAttributeRegion" }, // RenderingServer
+ { "MoveToBottom", "MoveAfter" }, // Skeleton3D
+ { "MoveToTop", "MoveBefore" }, // Skeleton3D
+ { "MultimeshAllocate", "MultimeshAllocateData" }, // RenderingServer
+ { "NormalmapToXy", "NormalMapToXy" }, // Image
+ { "OffsetPolygon2d", "OffsetPolygon" }, // Geometry2D
+ { "OffsetPolyline2d", "OffsetPolyline" }, // Geometry2D
+ { "PercentDecode", "UriDecode" }, // String
+ { "PercentEncode", "UriEncode" }, // String
+ { "PinJointCreate", "JointMakePin" }, // PhysicsServer2D
+ { "PopupCenteredMinsize", "PopupCenteredClamped" }, // Window
+ { "PostImport", "_PostImport" }, // EditorScenePostImport
+ { "PrintStrayNodes", "PrintOrphanNodes" }, // Node
+ { "PropertyListChangedNotify", "NotifyPropertyListChanged" }, // Object
+ { "Recognize", "_Recognize" }, // ResourceFormatLoader
+ { "RegenNormalmaps", "RegenNormalMaps" }, // ArrayMesh
+ { "Remove", "RemoveAt" }, // Array, broke Directory
+ { "RemoveAnimation", "RemoveAnimationLibrary" }, // AnimationPlayer
+ { "RemoveColorOverride", "RemoveThemeColorOverride" }, // Control
+ { "RemoveConstantOverride", "RemoveThemeConstantOverride" }, // Control
+ { "RemoveFontOverride", "RemoveThemeFontOverride" }, // Control
+ { "RemoveSceneImportPlugin", "RemoveSceneFormatImporterPlugin" }, //EditorPlugin
+ { "RemoveSpatialGizmoPlugin", "RemoveNode3dGizmoPlugin" }, // EditorPlugin
+ { "RemoveStyleboxOverride", "RemoveThemeStyleboxOverride" }, // Control
+ { "RenameAnimation", "RenameAnimationLibrary" }, // AnimationPlayer
+ { "RenameDependencies", "_RenameDependencies" }, // ResourceFormatLoader
+ { "SaveExternalData", "_SaveExternalData" }, // EditorPlugin
+ { "SegmentIntersectsSegment2d", "SegmentIntersectsSegment" }, // Geometry2D
+ { "SetAdjustmentEnable", "SetAdjustmentEnabled" }, // Environment
+ { "SetAlt", "SetAltPressed" }, // InputEventWithModifiers
+ { "SetAnchorAndMargin", "SetAnchorAndOffset" }, // Control
+ { "SetAnchorsAndMarginsPreset", "SetAnchorsAndOffsetsPreset" }, // Control
+ { "SetAnimationProcessMode", "SetProcessCallback" }, // AnimationPlayer
+ { "SetAsBulkArray", "SetBuffer" }, // MultiMesh
+ { "SetAsNormalmap", "SetAsNormalMap" }, // NoiseTexture
+ { "SetAsToplevel", "SetAsTopLevel" }, // CanvasItem
+ { "SetAudioBus", "SetAudioBusName" }, // Area3D
+ { "SetAutowrap", "SetAutowrapMode" }, // Label broke AcceptDialog
+ { "SetCastTo", "SetTargetPosition" }, // RayCast2D, RayCast3D
+ { "SetCollisionLayerBit", "SetCollisionLayerValue" }, // CSGShape3D and a lot of others like GridMap
+ { "SetCollisionMaskBit", "SetCollisionMaskValue" }, // CSGShape3D and a lot of others like GridMap
+ { "SetColumnMinWidth", "SetColumnCustomMinimumWidth" }, // Tree
+ { "SetCommand", "SetCommandPressed" }, // InputEventWithModifiers
+ { "SetControl", "SetCtrlPressed" }, // InputEventWithModifiers
+ { "SetCreateOptions", "_SetCreateOptions" }, // EditorResourcePicker
+ { "SetCullMaskBit", "SetCullMaskValue" }, // Camera3D
+ { "SetCursorPosition", "SetCaretColumn" }, // LineEdit
+ { "SetD", "SetDistance" }, // WorldMarginShape2D
+ { "SetDepthBiasEnable", "SetDepthBiasEnabled" }, // RDPipelineRasterizationState
+ { "SetDevice", "SetOutputDevice" }, // AudioServer
+ { "SetDoubleclick", "SetDoubleClick" }, // InputEventMouseButton
+ { "SetEnableFollowSmoothing", "SetFollowSmoothingEnabled" }, // Camera2D
+ { "SetEnabledFocusMode", "SetFocusMode" }, // BaseButton
+ { "SetEndianSwap", "SetBigEndian" }, // File
+ { "SetExpandToTextLength", "SetExpandToTextLengthEnabled" }, // LineEdit
+ { "SetFocusNeighbour", "SetFocusNeighbor" }, // Control
+ { "SetFollowSmoothing", "SetFollowSmoothingSpeed" }, // Camera2D
+ { "SetFrameColor", "SetColor" }, // ColorRect
+ { "SetGlobalRateScale", "SetPlaybackSpeedScale" }, // AudioServer
+ { "SetGravityDistanceScale", "SetGravityPointDistanceScale" }, // Area2D
+ { "SetGravityVector", "SetGravityDirection" }, // Area2D
+ { "SetHDragEnabled", "SetDragHorizontalEnabled" }, // Camera2D
+ { "SetIconAlign", "SetIconAlignment" }, // Button
+ { "SetInteriorAmbient", "SetAmbientColor" }, // ReflectionProbe
+ { "SetInteriorAmbientEnergy", "SetAmbientColorEnergy" }, // ReflectionProbe
+ { "SetIsInitialized", "_IsInitialized" }, // XRInterface
+ { "SetIsPrimary", "SetPrimary" }, // XRInterface
+ { "SetIterationsPerSecond", "SetPhysicsTicksPerSecond" }, // Engine
+ { "SetLayerMaskBit", "SetLayerMaskValue" }, // VisualInstance3D
+ { "SetMarginsPreset", "SetOffsetsPreset" }, // Control
+ { "SetMaxAtlasSize", "SetMaxTextureSize" }, // LightmapGI
+ { "SetMetakey", "SetMetaPressed" }, // InputEventWithModifiers
+ { "SetMidHeight", "SetHeight" }, // CapsuleMesh
+ { "SetNeighborDist", "SetNeighborDistance" }, // NavigationAgent2D, NavigationAgent3D
+ { "SetNetworkMaster", "SetMultiplayerAuthority" }, // Node
+ { "SetNetworkPeer", "SetMultiplayerPeer" }, // Multiplayer API
+ { "SetOneshot", "SetOneShot" }, // AnimatedTexture
+ { "SetPhysicalScancode", "SetPhysicalKeycode" }, // InputEventKey
+ { "SetProximityFade", "SetProximityFadeEnabled" }, // Material
+ { "SetRefuseNewNetworkConnections", "SetRefuseNewConnections" }, // Multiplayer API
+ { "SetRegion", "SetRegionEnabled" }, // Sprite2D, Sprite broke AtlasTexture
+ { "SetRegionFilterClip", "SetRegionFilterClipEnabled" }, // Sprite2D
+ { "SetReverbBus", "SetReverbBusName" }, // Area3D
+ { "SetRotate", "SetRotates" }, // PathFollow2D
+ { "SetScancode", "SetKeycode" }, // InputEventKey
+ { "SetShift", "SetShiftPressed" }, // InputEventWithModifiers
+ { "SetSizeOverride", "SetSize2dOverride" }, // SubViewport broke ImageTexture
+ { "SetSizeOverrideStretch", "SetSize2dOverrideStretch" }, // SubViewport
+ { "SetSlipsOnSlope", "SetSlideOnSlope" }, // SeparationRayShape2D, SeparationRayShape3D
+ { "SetSortEnabled", "SetYSortEnabled" }, // Node2D
+ { "SetSpaceOverrideMode", "SetGravitySpaceOverrideMode" }, // Area2D
+ { "SetSpatialNode", "SetNode3d" }, // EditorNode3DGizmo
+ { "SetSpeed", "SetVelocity" }, // InputEventMouseMotion
+ { "SetSsaoEdgeSharpness", "SetSsaoSharpness" }, // Environment
+ { "SetSurfaceMaterial", "SetSurfaceOverrideMaterial" }, // MeshInstance3D broke ImporterMesh
+ { "SetTabAlign", "SetTabAlignment" }, //TabContainer
+ { "SetTangent", "SurfaceSetTangent" }, // ImmediateGeometry broke SurfaceTool
+ { "SetTextAlign", "SetTextAlignment" }, // Button
+ { "SetTimerProcessMode", "SetTimerProcessCallback" }, // Timer
+ { "SetTonemapAutoExposure", "SetTonemapAutoExposureEnabled" }, // Environment
+ { "SetTranslation", "SetPosition" }, // Node3D - this broke GLTFNode which is used rarely
+ { "SetUnitDb", "SetVolumeDb" }, // AudioStreamPlayer3D
+ { "SetUnitOffset", "SetProgressRatio" }, // PathFollow2D, PathFollow3D
+ { "SetUv2", "SurfaceSetUv2" }, // ImmediateMesh broke Surffacetool
+ { "SetVDragEnabled", "SetDragVerticalEnabled" }, // Camera2D
+ { "SetValign", "SetVerticalAlignment" }, // Label
+ { "SetWindowLayout", "_SetWindowLayout" }, // EditorPlugin
+ { "SetZfar", "SetFar" }, // Camera3D broke GLTFCamera
+ { "SetZnear", "SetNear" }, // Camera3D broke GLTFCamera
+ { "ShortcutMatch", "IsMatch" }, // InputEvent
+ { "SkeletonAllocate", "SkeletonAllocateData" }, // RenderingServer
+ { "SurfaceUpdateRegion", "SurfaceUpdateAttributeRegion" }, // ArrayMesh
+ { "TargetingMethod", "TweenMethod" }, // Tween
+ { "TargetingProperty", "TweenProperty" }, // Tween
+ { "TrackRemoveKeyAtPosition", "TrackRemoveKeyAtTime" }, // Animation
+ { "TriangulateDelaunay2d", "TriangulateDelaunay" }, // Geometry2D
+ { "UnbindChildNodeFromBone", "RemoveBoneChild" }, // Skeleton3D
+ { "Unselect", "Deselect" }, // ItemList
+ { "UnselectAll", "DeselectAll" }, // ItemList
+ { "UpdateConfigurationWarning", "UpdateConfigurationWarnings" }, // Node
+ { "UpdateGizmo", "UpdateGizmos" }, // Node3D
+ { "ViewportSetUseArvr", "ViewportSetUseXr" }, // RenderingServer
+ { "WarpMousePosition", "WarpMouse" }, // Input
+ { "WorldToMap", "LocalToMap" }, // TileMap, GridMap
+ { "SetShaderParam", "SetShaderParameter" }, // ShaderMaterial
+ { "GetShaderParam", "GetShaderParameter" }, // ShaderMaterial
+ { "SetUniformName", "SetParameterName" }, // ParameterRef
+ { "GetUniformName", "GetParameterName" }, // ParameterRef
+
+ // Builtin types
+ // { "Empty", "IsEmpty" }, // Array - Used as custom rule // Be careful, this will be used everywhere
+ { "Clamped", "Clamp" }, // Vector2 // Be careful, this will be used everywhere
+ { "GetRotationQuat", "GetRotationQuaternion" }, // Basis
+ { "GrowMargin", "GrowSide" }, // Rect2
+ { "Invert", "Reverse" }, // Array - TODO check // Be careful, this will be used everywhere
+ { "IsAbsPath", "IsAbsolutePath" }, // String
+ { "IsValidInteger", "IsValidInt" }, // String
+ { "LinearInterpolate", "Lerp" }, // Color
+ { "ToAscii", "ToAsciiBuffer" }, // String
+ { "ToUtf8", "ToUtf8Buffer" }, // String
+ { "ToWchar", "ToUtf32Buffer" }, // String // TODO - utf32 or utf16?
+
+ // @GlobalScope
+ { "Bytes2Var", "BytesToVar" },
+ { "Bytes2VarWithObjects", "BytesToVarWithObjects" },
+ { "Db2Linear", "DbToLinear" },
+ { "Deg2Rad", "DegToRad" },
+ { "Linear2Db", "LinearToDb" },
+ { "Rad2Deg", "RadToDeg" },
+ { "RandRange", "RandfRange" },
+ { "RangeLerp", "Remap" },
+ { "Stepify", "Snapped" },
+ { "Str2Var", "StrToVar" },
+ { "Var2Str", "VarToStr" },
+ { "Var2Bytes", "VarToBytes" },
+ { "Var2BytesWithObjects", "VarToBytesWithObjects" },
+
+ // @GDScript
+ { "Dict2Inst", "DictToInst" },
+ { "Inst2Dict", "InstToDict" },
+
+ { nullptr, nullptr },
+};
+
+// Some needs to be disabled, because users can use this names as variables
+const char *RenamesMap3To4::gdscript_properties_renames[][2] = {
+ // // { "d", "distance" }, //WorldMarginShape2D - TODO, looks that polish letters ą ę are treaten as space, not as letter, so `będą` are renamed to `będistanceą`
+ // // {"alt","alt_pressed"}, // This may broke a lot of comments and user variables
+ // // {"command","command_pressed"},// This may broke a lot of comments and user variables
+ // // {"control","ctrl_pressed"},// This may broke a lot of comments and user variables
+ // // {"extends","size"}, // BoxShape3D, LightmapGI broke ReflectionProbe
+ // // {"meta","meta_pressed"},// This may broke a lot of comments and user variables
+ // // {"pause_mode","process_mode"}, // Node - Cyclic rename, look for others
+ // // {"rotate","rotates"}, // PathFollow2D - probably function exists with same name
+ // // {"offset","progress"}, // PathFollow2D, PathFollow3D - Name is way too vague
+ // // {"shift","shift_pressed"},// This may broke a lot of comments and user variables
+ // { "autowrap", "autowrap_mode" }, // Label
+ // { "cast_to", "target_position" }, // RayCast2D, RayCast3D
+ // { "device", "output_device"}, // AudioServer - Too vague, most likely breaks comments & variables
+ // { "doubleclick", "double_click" }, // InputEventMouseButton
+ // { "group", "button_group" }, // BaseButton
+ // { "process_mode", "process_callback" }, // AnimationTree, Camera2D
+ // { "scancode", "keycode" }, // InputEventKey
+ // { "toplevel", "top_level" }, // Node
+ // { "window_title", "title" }, // Window
+ // { "wrap_enabled", "wrap_mode" }, // TextEdit
+ // { "zfar", "far" }, // Camera3D
+ // { "znear", "near" }, // Camera3D
+ // { "filename", "scene_file_path" }, // Node
+ // { "pressed", "button_pressed" }, // BaseButton - Will also rename the signal, skipping for now
+ { "as_normalmap", "as_normal_map" }, // NoiseTexture
+ { "bbcode_text", "text" }, // RichTextLabel
+ { "bg", "panel" }, // Theme
+ { "bg_focus", "focus" }, // Theme
+ { "capture_device", "input_device" }, // AudioServer
+ { "caret_blink_speed", "caret_blink_interval" }, // TextEdit, LineEdit
+ { "caret_moving_by_right_click", "caret_move_on_right_click" }, // TextEdit
+ { "caret_position", "caret_column" }, // LineEdit
+ { "check_vadjust", "check_v_offset" }, // Theme
+ { "close_h_ofs", "close_h_offset" }, // Theme
+ { "close_v_ofs", "close_v_offset" }, // Theme
+ { "commentfocus", "comment_focus" }, // Theme
+ { "contacts_reported", "max_contacts_reported" }, // RigidBody
+ { "depth_bias_enable", "depth_bias_enabled" }, // RDPipelineRasterizationState
+ { "drag_margin_bottom", "drag_bottom_margin" }, // Camera2D
+ { "drag_margin_h_enabled", "drag_horizontal_enabled" }, // Camera2D
+ { "drag_margin_left", "drag_left_margin" }, // Camera2D
+ { "drag_margin_right", "drag_right_margin" }, // Camera2D
+ { "drag_margin_top", "drag_top_margin" }, // Camera2D
+ { "drag_margin_v_enabled", "drag_vertical_enabled" }, // Camera2D
+ { "enabled_focus_mode", "focus_mode" }, // BaseButton - Removed
+ { "extra_spacing_bottom", "spacing_bottom" }, // Font
+ { "extra_spacing_top", "spacing_top" }, // Font
+ { "focus_neighbour_bottom", "focus_neighbor_bottom" }, // Control
+ { "focus_neighbour_left", "focus_neighbor_left" }, // Control
+ { "focus_neighbour_right", "focus_neighbor_right" }, // Control
+ { "focus_neighbour_top", "focus_neighbor_top" }, // Control
+ { "follow_viewport_enable", "follow_viewport_enabled" }, // CanvasItem
+ { "file_icon_modulate", "file_icon_color" }, // Theme
+ { "files_disabled", "file_disabled_color" }, // Theme
+ { "folder_icon_modulate", "folder_icon_color" }, // Theme
+ { "global_rate_scale", "playback_speed_scale" }, // AudioServer
+ { "gravity_distance_scale", "gravity_point_unit_distance" }, // Area(2D/3D)
+ { "gravity_vec", "gravity_direction" }, // Area(2D/3D)
+ { "hint_tooltip", "tooltip_text" }, // Control
+ { "hseparation", "h_separation" }, // Theme
+ { "icon_align", "icon_alignment" }, // Button
+ { "iterations_per_second", "physics_ticks_per_second" }, // Engine
+ { "invert_enable", "invert_enabled" }, // Polygon2D
+ { "margin_bottom", "offset_bottom" }, // Control broke NinePatchRect, StyleBox
+ { "margin_left", "offset_left" }, // Control broke NinePatchRect, StyleBox
+ { "margin_right", "offset_right" }, // Control broke NinePatchRect, StyleBox
+ { "margin_top", "offset_top" }, // Control broke NinePatchRect, StyleBox
+ { "mid_height", "height" }, // CapsuleMesh
+ { "neighbor_dist", "neighbor_distance" }, // NavigationAgent2D, NavigationAgent3D
+ { "offset_h", "drag_horizontal_offset" }, // Camera2D
+ { "offset_v", "drag_vertical_offset" }, // Camera2D
+ { "off", "unchecked" }, // Theme
+ { "off_disabled", "unchecked_disabled" }, // Theme
+ { "ofs", "offset" }, // Theme
+ { "on", "checked" }, // Theme
+ { "on_disabled", "checked_disabled" }, // Theme
+ { "oneshot", "one_shot" }, // AnimatedTexture
+ { "out_of_range_mode", "max_polyphony" }, // AudioStreamPlayer3D
+ { "pause_mode", "process_mode" }, // Node
+ { "physical_scancode", "physical_keycode" }, // InputEventKey
+ { "popup_exclusive", "exclusive" }, // Window
+ { "proximity_fade_enable", "proximity_fade_enabled" }, // Material
+ { "rect_position", "position" }, // Control
+ { "rect_global_position", "global_position" }, // Control
+ { "rect_size", "size" }, // Control
+ { "rect_min_size", "custom_minimum_size" }, // Control
+ { "rect_rotation", "rotation" }, // Control
+ { "rect_scale", "scale" }, // Control
+ { "rect_pivot_offset", "pivot_offset" }, // Control
+ { "rect_clip_content", "clip_contents" }, // Control
+ { "refuse_new_network_connections", "refuse_new_connections" }, // MultiplayerAPI
+ { "region_filter_clip", "region_filter_clip_enabled" }, // Sprite2D
+ { "reverb_bus_enable", "reverb_bus_enabled" }, // Area3D
+ { "selectedframe", "selected_frame" }, // Theme
+ { "size_override_stretch", "size_2d_override_stretch" }, // SubViewport
+ { "slips_on_slope", "slide_on_slope" }, // SeparationRayShape2D
+ { "smoothing_enabled", "follow_smoothing_enabled" }, // Camera2D
+ { "smoothing_speed", "position_smoothing_speed" }, // Camera2D
+ { "ss_reflections_depth_tolerance", "ssr_depth_tolerance" }, // Environment
+ { "ss_reflections_enabled", "ssr_enabled" }, // Environment
+ { "ss_reflections_fade_in", "ssr_fade_in" }, // Environment
+ { "ss_reflections_fade_out", "ssr_fade_out" }, // Environment
+ { "ss_reflections_max_steps", "ssr_max_steps" }, // Environment
+ { "state_machine_selectedframe", "state_machine_selected_frame" }, // Theme
+ { "syntax_highlighting", "syntax_highlighter" }, // TextEdit
+ { "tab_align", "tab_alignment" }, // TabContainer
+ { "table_hseparation", "table_h_separation" }, // Theme
+ { "table_vseparation", "table_v_separation" }, // Theme
+ { "translation", "position" }, // Node3D - broke GLTFNode
+ { "unit_db", "volume_db" }, // AudioStreamPlayer3D
+ { "unit_offset", "progress_ratio" }, // PathFollow2D, PathFollow3D
+ { "vseparation", "v_separation" }, // Theme
+ { "frames", "sprite_frames" }, // AnimatedSprite2D, AnimatedSprite3D
+
+ { nullptr, nullptr },
+};
+
+// Some needs to be disabled, because users can use this names as variables
+const char *RenamesMap3To4::csharp_properties_renames[][2] = {
+ // // { "D", "Distance" }, //WorldMarginShape2D - TODO, looks that polish letters ą ę are treaten as space, not as letter, so `będą` are renamed to `będistanceą`
+ // // {"Alt","AltPressed"}, // This may broke a lot of comments and user variables
+ // // {"Command","CommandPressed"},// This may broke a lot of comments and user variables
+ // // {"Control","CtrlPressed"},// This may broke a lot of comments and user variables
+ // // {"Extends","Size"}, // BoxShape3D, LightmapGI broke ReflectionProbe
+ // // {"Meta","MetaPressed"},// This may broke a lot of comments and user variables
+ // // {"PauseMode","ProcessMode"}, // Node - Cyclic rename, look for others
+ // // {"Rotate","Rotates"}, // PathFollow2D - probably function exists with same name
+ // // {"Offset","Progress"}, // PathFollow2D, PathFollow3D - Name is way too vague
+ // // {"Shift","ShiftPressed"},// This may broke a lot of comments and user variables
+ // { "Autowrap", "AutowrapMode" }, // Label
+ // { "CastTo", "TargetPosition" }, // RayCast2D, RayCast3D
+ // { "Doubleclick", "DoubleClick" }, // InputEventMouseButton
+ // { "Group", "ButtonGroup" }, // BaseButton
+ // { "PercentVisible, "ShowPercentage}, // ProgressBar, conflicts with Label and RichTextLabel, but may be a worth it.
+ // { "ProcessMode", "ProcessCallback" }, // AnimationTree, Camera2D
+ // { "Scancode", "Keycode" }, // InputEventKey
+ // { "Toplevel", "TopLevel" }, // Node
+ // { "WindowTitle", "Title" }, // Window
+ // { "WrapEnabled", "WrapMode" }, // TextEdit
+ // { "Zfar", "Far" }, // Camera3D
+ // { "Znear", "Near" }, // Camera3D
+ // { "Pressed", "ButtonPressed" }, // BaseButton - Will also rename the signal, skipping for now
+ { "AsNormalmap", "AsNormalMap" }, // NoiseTexture
+ { "BbcodeText", "Text" }, // RichTextLabel
+ { "CaretBlinkSpeed", "CaretBlinkInterval" }, // TextEdit, LineEdit
+ { "CaretMovingByRightClick", "CaretMoveOnRightClick" }, // TextEdit
+ { "CaretPosition", "CaretColumn" }, // LineEdit
+ { "CheckVadjust", "CheckVAdjust" }, // Theme
+ { "CloseHOfs", "CloseHOffset" }, // Theme
+ { "CloseVOfs", "CloseVOffset" }, // Theme
+ { "Commentfocus", "CommentFocus" }, // Theme
+ { "DepthBiasEnable", "DepthBiasEnabled" }, // RDPipelineRasterizationState
+ { "DragMarginBottom", "DragBottomMargin" }, // Camera2D
+ { "DragMarginHEnabled", "DragHorizontalEnabled" }, // Camera2D
+ { "DragMarginLeft", "DragLeftMargin" }, // Camera2D
+ { "DragMarginRight", "DragRightMargin" }, // Camera2D
+ { "DragMarginTop", "DragTopMargin" }, // Camera2D
+ { "DragMarginVEnabled", "DragVerticalEnabled" }, // Camera2D
+ { "EnabledFocusMode", "FocusMode" }, // BaseButton - Removed
+ { "ExtraSpacingBottom", "SpacingBottom" }, // Font
+ { "ExtraSpacingTop", "SpacingTop" }, // Font
+ { "FocusNeighbourBottom", "FocusNeighborBottom" }, // Control
+ { "FocusNeighbourLeft", "FocusNeighborLeft" }, // Control
+ { "FocusNeighbourRight", "FocusNeighborRight" }, // Control
+ { "FocusNeighbourTop", "FocusNeighborTop" }, // Control
+ { "FollowViewportEnable", "FollowViewportEnabled" }, // CanvasItem
+ { "GlobalRateScale", "PlaybackSpeedScale" }, // AudioServer
+ { "GravityDistanceScale", "GravityPointDistanceScale" }, // Area2D
+ { "GravityVec", "GravityDirection" }, // Area2D
+ { "HintTooltip", "TooltipText" }, // Control
+ { "Hseparation", "HSeparation" }, // Theme
+ { "IconAlign", "IconAlignment" }, // Button
+ { "IterationsPerSecond", "PhysicsTicksPerSecond" }, // Engine
+ { "InvertEnable", "InvertEnabled" }, // Polygon2D
+ { "MarginBottom", "OffsetBottom" }, // Control broke NinePatchRect, StyleBox
+ { "MarginLeft", "OffsetLeft" }, // Control broke NinePatchRect, StyleBox
+ { "MarginRight", "OffsetRight" }, // Control broke NinePatchRect, StyleBox
+ { "MarginTop", "OffsetTop" }, // Control broke NinePatchRect, StyleBox
+ { "MidHeight", "Height" }, // CapsuleMesh
+ { "NeighborDist", "NeighborDistance" }, // NavigationAgent2D, NavigationAgent3D
+ { "OffsetH", "DragHorizontalOffset" }, // Camera2D
+ { "OffsetV", "DragVerticalOffset" }, // Camera2D
+ { "Ofs", "Offset" }, // Theme
+ { "Oneshot", "OneShot" }, // AnimatedTexture
+ { "OutOfRangeMode", "MaxPolyphony" }, // AudioStreamPlayer3D
+ { "PauseMode", "ProcessMode" }, // Node
+ { "PhysicalScancode", "PhysicalKeycode" }, // InputEventKey
+ { "PopupExclusive", "Exclusive" }, // Window
+ { "ProximityFadeEnable", "ProximityFadeEnabled" }, // Material
+ { "RectPosition", "Position" }, // Control
+ { "RectGlobalPosition", "GlobalPosition" }, // Control
+ { "RectSize", "Size" }, // Control
+ { "RectMinSize", "CustomMinimumSize" }, // Control
+ { "RectRotation", "Rotation" }, // Control
+ { "RectScale", "Scale" }, // Control
+ { "RectPivotOffset", "PivotOffset" }, // Control
+ { "RectClipContent", "ClipContents" }, // Control
+ { "RefuseNewNetworkConnections", "RefuseNewConnections" }, // MultiplayerAPI
+ { "RegionFilterClip", "RegionFilterClipEnabled" }, // Sprite2D
+ { "ReverbBusEnable", "ReverbBusEnabled" }, // Area3D
+ { "Selectedframe", "SelectedFrame" }, // Theme
+ { "SizeOverrideStretch", "Size2dOverrideStretch" }, // SubViewport
+ { "SlipsOnSlope", "SlideOnSlope" }, // SeparationRayShape2D
+ { "SmoothingEnabled", "FollowSmoothingEnabled" }, // Camera2D
+ { "SmoothingSpeed", "FollowSmoothingSpeed" }, // Camera2D
+ { "SsReflectionsDepthTolerance", "SsrDepthTolerance" }, // Environment
+ { "SsReflectionsEnabled", "SsrEnabled" }, // Environment
+ { "SsReflectionsFadeIn", "SsrFadeIn" }, // Environment
+ { "SsReflectionsFadeOut", "SsrFadeOut" }, // Environment
+ { "SsReflectionsMaxSteps", "SsrMaxSteps" }, // Environment
+ { "StateMachineSelectedframe", "StateMachineSelectedFrame" }, // Theme
+ { "SyntaxHighlighting", "SyntaxHighlighter" }, // TextEdit
+ { "TabAlign", "TabAlignment" }, // TabContainer
+ { "TableHseparation", "TableHSeparation" }, // Theme
+ { "TableVseparation", "TableVSeparation" }, // Theme
+ { "Translation", "Position" }, // Node3D - broke GLTFNode
+ { "UnitDb", "VolumeDb" }, // AudioStreamPlayer3D
+ { "UnitOffset", "ProgressRatio" }, // PathFollow2D, PathFollow3D
+ { "Vseparation", "VSeparation" }, // Theme
+
+ { nullptr, nullptr },
+};
+
+const char *RenamesMap3To4::gdscript_signals_renames[][2] = {
+ // {"instantiate","instance"}, // FileSystemDock
+ // { "hide", "hidden" }, // CanvasItem - function with same name exists
+ // { "tween_all_completed","loop_finished"}, // Tween - TODO, not sure
+ // {"changed","settings_changed"}, // EditorSettings
+ { "about_to_show", "about_to_popup" }, // Popup
+ { "button_release", "button_released" }, // XRController3D
+ { "cancelled", "canceled" }, // AcceptDialog
+ { "item_double_clicked", "item_icon_double_clicked" }, // Tree
+ { "network_peer_connected", "peer_connected" }, // MultiplayerAPI
+ { "network_peer_disconnected", "peer_disconnected" }, // MultiplayerAPI
+ { "network_peer_packet", "peer_packet" }, // MultiplayerAPI
+ { "node_unselected", "node_deselected" }, // GraphEdit
+ { "offset_changed", "position_offset_changed" }, // GraphNode
+ { "settings_changed", "changed" }, // TileMap broke EditorSettings
+ { "skeleton_updated", "pose_updated" }, //
+ { "tab_close", "tab_closed" }, // TextEdit
+ { "tab_hover", "tab_hovered" }, // TextEdit
+ { "text_entered", "text_submitted" }, // LineEdit
+ { "tween_completed", "finished" }, // Tween
+ { "tween_step", "step_finished" }, // Tween
+
+ { nullptr, nullptr },
+};
+
+const char *RenamesMap3To4::csharp_signals_renames[][2] = {
+ // {"Instantiate","Instance"}, // FileSystemDock
+ // { "Hide", "Hidden" }, // CanvasItem - function with same name exists
+ // { "TweenAllCompleted","LoopFinished"}, // Tween - TODO, not sure
+ // {"Changed","SettingsChanged"}, // EditorSettings
+ { "AboutToShow", "AboutToPopup" }, // Popup
+ { "ButtonRelease", "ButtonReleased" }, // XRController3D
+ { "NetworkPeerConnected", "PeerConnected" }, // MultiplayerAPI
+ { "NetworkPeerDisconnected", "PeerDisconnected" }, // MultiplayerAPI
+ { "NetworkPeerPacket", "PeerPacket" }, // MultiplayerAPI
+ { "NodeUnselected", "NodeDeselected" }, // GraphEdit
+ { "OffsetChanged", "PositionOffsetChanged" }, // GraphNode
+ { "SettingsChanged", "Changed" }, // TileMap broke EditorSettings
+ { "SkeletonUpdated", "PoseUpdated" }, //
+ { "TabClose", "TabClosed" }, // TextEdit
+ { "TabHover", "TabHovered" }, // TextEdit
+ { "TextEntered", "TextSubmitted" }, // LineEdit
+ { "TweenCompleted", "Finished" }, // Tween
+ { "TweenStep", "StepFinished" }, // Tween
+
+ { nullptr, nullptr },
+
+};
+
+const char *RenamesMap3To4::project_settings_renames[][2] = {
+ { "audio/channel_disable_threshold_db", "audio/buses/channel_disable_threshold_db" },
+ { "audio/channel_disable_time", "audio/buses/channel_disable_time" },
+ { "audio/default_bus_layout", "audio/buses/default_bus_layout" },
+ { "audio/driver", "audio/driver/driver" },
+ { "audio/enable_audio_input", "audio/driver/enable_input" },
+ { "audio/mix_rate", "audio/driver/mix_rate" },
+ { "audio/output_latency", "audio/driver/output_latency" },
+ { "audio/output_latency.web", "audio/driver/output_latency.web" },
+ { "audio/video_delay_compensation_ms", "audio/video/video_delay_compensation_ms" },
+ { "display/window/vsync/use_vsync", "display/window/vsync/vsync_mode" },
+ { "editor/main_run_args", "editor/run/main_run_args" },
+ { "gui/common/swap_ok_cancel", "gui/common/swap_cancel_ok" },
+ { "network/limits/debugger_stdout/max_chars_per_second", "network/limits/debugger/max_chars_per_second" },
+ { "network/limits/debugger_stdout/max_errors_per_second", "network/limits/debugger/max_errors_per_second" },
+ { "network/limits/debugger_stdout/max_messages_per_frame", "network/limits/debugger/max_queued_messages" },
+ { "network/limits/debugger_stdout/max_warnings_per_second", "network/limits/debugger/max_warnings_per_second" },
+ { "network/ssl/certificates", "network/tls/certificate_bundle_override" },
+ { "physics/2d/thread_model", "physics/2d/run_on_thread" }, // TODO not sure
+ { "rendering/environment/default_clear_color", "rendering/environment/defaults/default_clear_color" },
+ { "rendering/environment/default_environment", "rendering/environment/defaults/default_environment" },
+ { "rendering/quality/depth_prepass/disable_for_vendors", "rendering/driver/depth_prepass/disable_for_vendors" },
+ { "rendering/quality/depth_prepass/enable", "rendering/driver/depth_prepass/enable" },
+ { "rendering/quality/shading/force_blinn_over_ggx", "rendering/shading/overrides/force_blinn_over_ggx" },
+ { "rendering/quality/shading/force_blinn_over_ggx.mobile", "rendering/shading/overrides/force_blinn_over_ggx.mobile" },
+ { "rendering/quality/shading/force_lambert_over_burley", "rendering/shading/overrides/force_lambert_over_burley" },
+ { "rendering/quality/shading/force_lambert_over_burley.mobile", "rendering/shading/overrides/force_lambert_over_burley.mobile" },
+ { "rendering/quality/shading/force_vertex_shading", "rendering/shading/overrides/force_vertex_shading" },
+ { "rendering/quality/shading/force_vertex_shading.mobile", "rendering/shading/overrides/force_vertex_shading.mobile" },
+ { "rendering/quality/shadow_atlas/quadrant_0_subdiv", "rendering/lights_and_shadows/shadow_atlas/quadrant_0_subdiv" },
+ { "rendering/quality/shadow_atlas/quadrant_1_subdiv", "rendering/lights_and_shadows/shadow_atlas/quadrant_1_subdiv" },
+ { "rendering/quality/shadow_atlas/quadrant_2_subdiv", "rendering/lights_and_shadows/shadow_atlas/quadrant_2_subdiv" },
+ { "rendering/quality/shadow_atlas/quadrant_3_subdiv", "rendering/lights_and_shadows/shadow_atlas/quadrant_3_subdiv" },
+ { "rendering/quality/shadow_atlas/size", "rendering/lights_and_shadows/shadow_atlas/size" },
+ { "rendering/quality/shadow_atlas/size.mobile", "rendering/lights_and_shadows/shadow_atlas/size.mobile" },
+ { "rendering/vram_compression/import_etc2", "rendering/textures/vram_compression/import_etc2_astc" },
+ { "rendering/vram_compression/import_s3tc", "rendering/textures/vram_compression/import_s3tc_bptc" },
+ { "window/size/width", "window/size/viewport_width" },
+ { "window/size/height", "window/size/viewport_height" },
+ { "window/size/test_width", "window/size/window_width_override" },
+ { "window/size/test_height", "window/size/window_height_override" },
+
+ { nullptr, nullptr },
+};
+
+const char *RenamesMap3To4::input_map_renames[][2] = {
+ { ",\"alt\":", ",\"alt_pressed\":" },
+ { ",\"shift\":", ",\"shift_pressed\":" },
+ { ",\"control\":", ",\"ctrl_pressed\":" },
+ { ",\"meta\":", ",\"meta_pressed\":" },
+ { ",\"scancode\":", ",\"keycode\":" },
+ { ",\"physical_scancode\":", ",\"physical_keycode\":" },
+ { ",\"doubleclick\":", ",\"double_click\":" },
+
+ { nullptr, nullptr },
+};
+
+const char *RenamesMap3To4::builtin_types_renames[][2] = {
+ { "PoolByteArray", "PackedByteArray" },
+ { "PoolColorArray", "PackedColorArray" },
+ { "PoolIntArray", "PackedInt32Array" },
+ { "PoolRealArray", "PackedFloat32Array" },
+ { "PoolStringArray", "PackedStringArray" },
+ { "PoolVector2Array", "PackedVector2Array" },
+ { "PoolVector3Array", "PackedVector3Array" },
+ { "Quat", "Quaternion" },
+ { "Transform", "Transform3D" },
+
+ { nullptr, nullptr },
+};
+
+const char *RenamesMap3To4::shaders_renames[][2] = {
+ { "ALPHA_SCISSOR", "ALPHA_SCISSOR_THRESHOLD" },
+ { "CAMERA_MATRIX", "INV_VIEW_MATRIX" },
+ { "INV_CAMERA_MATRIX", "VIEW_MATRIX" },
+ { "NORMALMAP", "NORMAL_MAP" },
+ { "NORMALMAP_DEPTH", "NORMAL_MAP_DEPTH" },
+ { "TRANSMISSION", "BACKLIGHT" },
+ { "WORLD_MATRIX", "MODEL_MATRIX" },
+ { "depth_draw_alpha_prepass", "depth_draw_opaque" },
+ { "hint_albedo", "source_color" },
+ { "hint_aniso", "hint_anisotropy" },
+ { "hint_black", "hint_default_black" },
+ { "hint_black_albedo", "hint_default_black" },
+ { "hint_color", "source_color" },
+ { "hint_white", "hint_default_white" },
+ { nullptr, nullptr },
+};
+
+const char *RenamesMap3To4::class_renames[][2] = {
+ // { "BulletPhysicsDirectBodyState", "BulletPhysicsDirectBodyState3D" }, // Class is not visible in ClassDB
+ // { "BulletPhysicsServer", "BulletPhysicsServer3D" }, // Class is not visible in ClassDB
+ // { "GDScriptFunctionState", "Node3D" }, // TODO - not sure to which should be changed
+ // { "GDScriptNativeClass", "Node3D" }, // TODO - not sure to which should be changed
+ // { "InputDefault",""}, // TODO ?
+ // { "Physics2DDirectBodyStateSW", "GodotPhysicsDirectBodyState2D" }, // Class is not visible in ClassDB
+ // { "Physics2DShapeQueryResult", "PhysicsShapeQueryResult2D" }, // Class is not visible in ClassDB
+ // { "PhysicsShapeQueryResult", "PhysicsShapeQueryResult3D" }, // Class is not visible in ClassDB
+ // { "NativeScript","GDExtension"}, ??
+ { "ARVRAnchor", "XRAnchor3D" },
+ { "ARVRCamera", "XRCamera3D" },
+ { "ARVRController", "XRController3D" },
+ { "ARVRInterface", "XRInterface" },
+ { "ARVRInterfaceGDNative", "Node3D" },
+ { "ARVROrigin", "XROrigin3D" },
+ { "ARVRPositionalTracker", "XRPositionalTracker" },
+ { "ARVRServer", "XRServer" },
+ { "AStar", "AStar3D" },
+ { "AnimatedSprite", "AnimatedSprite2D" },
+ { "AnimationTreePlayer", "AnimationTree" },
+ { "Area", "Area3D" }, // Be careful, this will be used everywhere
+ { "AudioStreamOGGVorbis", "AudioStreamOggVorbis" },
+ { "AudioStreamRandomPitch", "AudioStreamRandomizer" },
+ { "AudioStreamSample", "AudioStreamWAV" },
+ { "BakedLightmap", "LightmapGI" },
+ { "BakedLightmapData", "LightmapGIData" },
+ { "BitmapFont", "FontFile" },
+ { "BoneAttachment", "BoneAttachment3D" },
+ { "BoxShape", "BoxShape3D" },
+ { "CPUParticles", "CPUParticles3D" },
+ { "CSGBox", "CSGBox3D" },
+ { "CSGCombiner", "CSGCombiner3D" },
+ { "CSGCylinder", "CSGCylinder3D" },
+ { "CSGMesh", "CSGMesh3D" },
+ { "CSGPolygon", "CSGPolygon3D" },
+ { "CSGPrimitive", "CSGPrimitive3D" },
+ { "CSGShape", "CSGShape3D" },
+ { "CSGSphere", "CSGSphere3D" },
+ { "CSGTorus", "CSGTorus3D" },
+ { "Camera", "Camera3D" }, // Be careful, this will be used everywhere
+ { "CapsuleShape", "CapsuleShape3D" },
+ { "ClippedCamera", "Camera3D" },
+ { "CollisionObject", "CollisionObject3D" },
+ { "CollisionPolygon", "CollisionPolygon3D" },
+ { "CollisionShape", "CollisionShape3D" },
+ { "ConcavePolygonShape", "ConcavePolygonShape3D" },
+ { "ConeTwistJoint", "ConeTwistJoint3D" },
+ { "ConvexPolygonShape", "ConvexPolygonShape3D" },
+ { "CubeMap", "Cubemap" },
+ { "CubeMesh", "BoxMesh" },
+ { "CylinderShape", "CylinderShape3D" },
+ { "DirectionalLight", "DirectionalLight3D" },
+ { "DynamicFont", "FontFile" },
+ { "DynamicFontData", "FontFile" },
+ { "EditorNavigationMeshGenerator", "NavigationMeshGenerator" },
+ { "EditorSceneImporter", "EditorSceneFormatImporter" },
+ { "EditorSceneImporterFBX", "EditorSceneFormatImporterFBX" },
+ { "EditorSceneImporterGLTF", "EditorSceneFormatImporterGLTF" },
+ { "EditorSpatialGizmo", "EditorNode3DGizmo" },
+ { "EditorSpatialGizmoPlugin", "EditorNode3DGizmoPlugin" },
+ { "ExternalTexture", "ImageTexture" },
+ { "FuncRef", "Callable" },
+ { "GIProbe", "VoxelGI" },
+ { "GIProbeData", "VoxelGIData" },
+ { "Generic6DOFJoint", "Generic6DOFJoint3D" },
+ { "Geometry", "Geometry2D" }, // Geometry class is split between Geometry2D and Geometry3D so we need to choose one
+ { "GeometryInstance", "GeometryInstance3D" },
+ { "GradientTexture", "GradientTexture2D" },
+ { "HeightMapShape", "HeightMapShape3D" },
+ { "HingeJoint", "HingeJoint3D" },
+ { "IP_Unix", "IPUnix" },
+ { "ImmediateGeometry", "ImmediateMesh" },
+ { "ImmediateGeometry3D", "ImmediateMesh" },
+ { "InterpolatedCamera", "Camera3D" },
+ { "InterpolatedCamera3D", "Camera3D" },
+ { "JSONParseResult", "JSON" },
+ { "Joint", "Joint3D" },
+ { "KinematicBody", "CharacterBody3D" },
+ { "KinematicBody2D", "CharacterBody2D" },
+ { "KinematicCollision", "KinematicCollision3D" },
+ { "LargeTexture", "ImageTexture" },
+ { "Light", "Light3D" },
+ { "Light2D", "PointLight2D" },
+ { "LineShape2D", "WorldBoundaryShape2D" },
+ { "Listener", "AudioListener3D" },
+ { "Listener2D", "AudioListener2D" },
+ { "MeshInstance", "MeshInstance3D" },
+ { "MultiMeshInstance", "MultiMeshInstance3D" },
+ { "MultiplayerPeerGDNative", "MultiplayerPeerExtension" },
+ { "Navigation", "Node3D" },
+ { "Navigation2D", "Node2D" },
+ { "Navigation2DServer", "NavigationServer2D" },
+ { "Navigation3D", "Node3D" },
+ { "NavigationAgent", "NavigationAgent3D" },
+ { "NavigationMeshInstance", "NavigationRegion3D" },
+ { "NavigationObstacle", "NavigationObstacle3D" },
+ { "NavigationPolygonInstance", "NavigationRegion2D" },
+ { "NavigationRegion", "NavigationRegion3D" },
+ { "NavigationServer", "NavigationServer3D" },
+ { "NetworkedMultiplayerENet", "ENetMultiplayerPeer" },
+ { "NetworkedMultiplayerPeer", "MultiplayerPeer" },
+ { "Occluder", "OccluderInstance3D" },
+ { "OmniLight", "OmniLight3D" },
+ { "PHashTranslation", "OptimizedTranslation" },
+ { "PacketPeerGDNative", "PacketPeerExtension" },
+ { "PanoramaSky", "Sky" },
+ { "Particles", "GPUParticles3D" }, // Be careful, this will be used everywhere
+ { "Particles2D", "GPUParticles2D" },
+ { "ParticlesMaterial", "ParticleProcessMaterial" },
+ { "Path", "Path3D" }, // Be careful, this will be used everywhere
+ { "PathFollow", "PathFollow3D" },
+ { "PhysicalBone", "PhysicalBone3D" },
+ { "Physics2DDirectBodyState", "PhysicsDirectBodyState2D" },
+ { "Physics2DDirectSpaceState", "PhysicsDirectSpaceState2D" },
+ { "Physics2DServer", "PhysicsServer2D" },
+ { "Physics2DServerSW", "GodotPhysicsServer2D" },
+ { "Physics2DShapeQueryParameters", "PhysicsShapeQueryParameters2D" },
+ { "Physics2DTestMotionResult", "PhysicsTestMotionResult2D" },
+ { "PhysicsBody", "PhysicsBody3D" },
+ { "PhysicsDirectBodyState", "PhysicsDirectBodyState3D" },
+ { "PhysicsDirectSpaceState", "PhysicsDirectSpaceState3D" },
+ { "PhysicsServer", "PhysicsServer3D" },
+ { "PhysicsShapeQueryParameters", "PhysicsShapeQueryParameters3D" },
+ { "PhysicsTestMotionResult", "PhysicsTestMotionResult3D" },
+ { "PinJoint", "PinJoint3D" },
+ { "PlaneShape", "WorldBoundaryShape3D" },
+ { "PopupDialog", "Popup" },
+ { "Position2D", "Marker2D" },
+ { "Position3D", "Marker3D" },
+ { "ProceduralSky", "Sky" },
+ { "RayCast", "RayCast3D" },
+ { "RayShape", "SeparationRayShape3D" },
+ { "RayShape2D", "SeparationRayShape2D" },
+ { "Reference", "RefCounted" }, // Be careful, this will be used everywhere
+ { "RemoteTransform", "RemoteTransform3D" },
+ { "ResourceInteractiveLoader", "ResourceLoader" },
+ { "RigidBody", "RigidBody3D" },
+ { "SceneTreeTween", "Tween" },
+ { "Shape", "Shape3D" }, // Be careful, this will be used everywhere
+ { "ShortCut", "Shortcut" },
+ { "Skeleton", "Skeleton3D" },
+ { "SkeletonIK", "SkeletonIK3D" },
+ { "SliderJoint", "SliderJoint3D" },
+ { "SoftBody", "SoftBody3D" },
+ { "Spatial", "Node3D" },
+ { "SpatialGizmo", "Node3DGizmo" },
+ { "SpatialMaterial", "StandardMaterial3D" },
+ { "SphereShape", "SphereShape3D" },
+ { "SpotLight", "SpotLight3D" },
+ { "SpringArm", "SpringArm3D" },
+ { "Sprite", "Sprite2D" },
+ { "StaticBody", "StaticBody3D" },
+ { "StreamCubemap", "CompressedCubemap" },
+ { "StreamCubemapArray", "CompressedCubemapArray" },
+ { "StreamPeerGDNative", "StreamPeerExtension" },
+ { "StreamPeerSSL", "StreamPeerTLS" },
+ { "StreamTexture", "CompressedTexture2D" },
+ { "StreamTexture2D", "CompressedTexture2D" },
+ { "StreamTexture2DArray", "CompressedTexture2DArray" },
+ { "StreamTextureLayered", "CompressedTextureLayered" },
+ { "TCP_Server", "TCPServer" },
+ { "Tabs", "TabBar" }, // Be careful, this will be used everywhere
+ { "TextFile", "Node3D" },
+ { "Texture", "Texture2D" }, // May broke TextureRect
+ { "TextureArray", "Texture2DArray" },
+ { "TextureProgress", "TextureProgressBar" },
+ { "ToolButton", "Button" },
+ { "VehicleBody", "VehicleBody3D" },
+ { "VehicleWheel", "VehicleWheel3D" },
+ { "VideoPlayer", "VideoStreamPlayer" },
+ { "Viewport", "SubViewport" },
+ { "ViewportContainer", "SubViewportContainer" },
+ { "VisibilityEnabler", "VisibleOnScreenEnabler3D" },
+ { "VisibilityEnabler2D", "VisibleOnScreenEnabler2D" },
+ { "VisibilityNotifier", "VisibleOnScreenNotifier3D" },
+ { "VisibilityNotifier2D", "VisibleOnScreenNotifier2D" },
+ { "VisibilityNotifier3D", "VisibleOnScreenNotifier3D" },
+ { "VisualInstance", "VisualInstance3D" },
+ { "VisualServer", "RenderingServer" },
+ { "VisualShaderNodeCubeMap", "VisualShaderNodeCubemap" },
+ { "VisualShaderNodeScalarClamp", "VisualShaderNodeClamp" },
+ { "VisualShaderNodeScalarConstant", "VisualShaderNodeFloatConstant" },
+ { "VisualShaderNodeScalarFunc", "VisualShaderNodeFloatFunc" },
+ { "VisualShaderNodeScalarInterp", "VisualShaderNodeMix" },
+ { "VisualShaderNodeScalarOp", "VisualShaderNodeFloatOp" },
+ { "VisualShaderNodeScalarSmoothStep", "VisualShaderNodeSmoothStep" },
+ { "VisualShaderNodeScalarSwitch", "VisualShaderNodeSwitch" },
+ { "VisualShaderNodeScalarTransformMult", "VisualShaderNodeTransformOp" },
+ { "VisualShaderNodeTransformMult", "VisualShaderNode" },
+ { "VisualShaderNodeVectorClamp", "VisualShaderNodeClamp" },
+ { "VisualShaderNodeVectorInterp", "VisualShaderNodeMix" },
+ { "VisualShaderNodeVectorScalarMix", "VisualShaderNodeMix" },
+ { "VisualShaderNodeVectorScalarSmoothStep", "VisualShaderNodeSmoothStep" },
+ { "VisualShaderNodeVectorScalarStep", "VisualShaderNodeStep" },
+ { "VisualShaderNodeVectorSmoothStep", "VisualShaderNodeSmoothStep" },
+ { "VisualShaderNodeBooleanUniform", "VisualShaderNodeBooleanParameter" },
+ { "VisualShaderNodeColorUniform", "VisualShaderNodeColorParameter" },
+ { "VisualShaderNodeScalarUniform", "VisualShaderNodeFloatParameter" },
+ { "VisualShaderNodeCubemapUniform", "VisualShaderNodeCubemapParameter" },
+ { "VisualShaderNodeTextureUniform", "VisualShaderNodeTexture2DParameter" },
+ { "VisualShaderNodeTextureUniformTriplanar", "VisualShaderNodeTextureParameterTriplanar" },
+ { "VisualShaderNodeTransformUniform", "VisualShaderNodeTransformParameter" },
+ { "VisualShaderNodeVec3Uniform", "VisualShaderNodeVec3Parameter" },
+ { "VisualShaderNodeUniform", "VisualShaderNodeParameter" },
+ { "VisualShaderNodeUniformRef", "VisualShaderNodeParameterRef" },
+ { "WebRTCDataChannelGDNative", "WebRTCDataChannelExtension" },
+ { "WebRTCMultiplayer", "WebRTCMultiplayerPeer" },
+ { "WebRTCPeerConnectionGDNative", "WebRTCPeerConnectionExtension" },
+ { "WindowDialog", "Window" },
+ { "World", "World3D" }, // Be careful, this will be used everywhere
+ { "XRAnchor", "XRAnchor3D" },
+ { "XRController", "XRController3D" },
+ { "XROrigin", "XROrigin3D" },
+ { "YSort", "Node2D" },
+
+ { "CullInstance", "Node3D" }, // Probably this type needs to be added to Godot 4.0, since it is for now only available only in Godot 3.x
+ { "RoomGroup", "Node3D" }, // Probably this type needs to be added to Godot 4.0, since it is for now only available only in Godot 3.x
+ { "Room", "Node3D" }, // Probably this type needs to be added to Godot 4.0, since it is for now only available only in Godot 3.x
+ { "RoomManager", "Node3D" }, // Probably this type needs to be added to Godot 4.0, since it is for now only available only in Godot 3.x
+ { "Portal", "Node3D" }, // Probably this type needs to be added to Godot 4.0, since it is for now only available only in Godot 3.x
+
+ { nullptr, nullptr },
+};
+
+const char *RenamesMap3To4::color_renames[][2] = {
+ { "aliceblue", "ALICE_BLUE" },
+ { "antiquewhite", "ANTIQUE_WHITE" },
+ { "aqua", "AQUA" },
+ { "aquamarine", "AQUAMARINE" },
+ { "azure", "AZURE" },
+ { "beige", "BEIGE" },
+ { "bisque", "BISQUE" },
+ { "black", "BLACK" },
+ { "blanchedalmond", "BLANCHED_ALMOND" },
+ { "blue", "BLUE" },
+ { "blueviolet", "BLUE_VIOLET" },
+ { "brown", "BROWN" },
+ { "burlywood", "BURLYWOOD" },
+ { "cadetblue", "CADET_BLUE" },
+ { "chartreuse", "CHARTREUSE" },
+ { "chocolate", "CHOCOLATE" },
+ { "coral", "CORAL" },
+ { "cornflowerblue", "CORNFLOWER_BLUE" },
+ { "cornsilk", "CORNSILK" },
+ { "crimson", "CRIMSON" },
+ { "cyan", "CYAN" },
+ { "darkblue", "DARK_BLUE" },
+ { "darkcyan", "DARK_CYAN" },
+ { "darkgoldenrod", "DARK_GOLDENROD" },
+ { "darkgray", "DARK_GRAY" },
+ { "darkgreen", "DARK_GREEN" },
+ { "darkkhaki", "DARK_KHAKI" },
+ { "darkmagenta", "DARK_MAGENTA" },
+ { "darkolivegreen", "DARK_OLIVE_GREEN" },
+ { "darkorange", "DARK_ORANGE" },
+ { "darkorchid", "DARK_ORCHID" },
+ { "darkred", "DARK_RED" },
+ { "darksalmon", "DARK_SALMON" },
+ { "darkseagreen", "DARK_SEA_GREEN" },
+ { "darkslateblue", "DARK_SLATE_BLUE" },
+ { "darkslategray", "DARK_SLATE_GRAY" },
+ { "darkturquoise", "DARK_TURQUOISE" },
+ { "darkviolet", "DARK_VIOLET" },
+ { "deeppink", "DEEP_PINK" },
+ { "deepskyblue", "DEEP_SKY_BLUE" },
+ { "dimgray", "DIM_GRAY" },
+ { "dodgerblue", "DODGER_BLUE" },
+ { "firebrick", "FIREBRICK" },
+ { "floralwhite", "FLORAL_WHITE" },
+ { "forestgreen", "FOREST_GREEN" },
+ { "fuchsia", "FUCHSIA" },
+ { "gainsboro", "GAINSBORO" },
+ { "ghostwhite", "GHOST_WHITE" },
+ { "gold", "GOLD" },
+ { "goldenrod", "GOLDENROD" },
+ { "gray", "GRAY" },
+ { "green", "GREEN" },
+ { "greenyellow", "GREEN_YELLOW" },
+ { "honeydew", "HONEYDEW" },
+ { "hotpink", "HOT_PINK" },
+ { "indianred", "INDIAN_RED" },
+ { "indigo", "INDIGO" },
+ { "ivory", "IVORY" },
+ { "khaki", "KHAKI" },
+ { "lavender", "LAVENDER" },
+ { "lavenderblush", "LAVENDER_BLUSH" },
+ { "lawngreen", "LAWN_GREEN" },
+ { "lemonchiffon", "LEMON_CHIFFON" },
+ { "lightblue", "LIGHT_BLUE" },
+ { "lightcoral", "LIGHT_CORAL" },
+ { "lightcyan", "LIGHT_CYAN" },
+ { "lightgoldenrod", "LIGHT_GOLDENROD" },
+ { "lightgray", "LIGHT_GRAY" },
+ { "lightgreen", "LIGHT_GREEN" },
+ { "lightpink", "LIGHT_PINK" },
+ { "lightsalmon", "LIGHT_SALMON" },
+ { "lightseagreen", "LIGHT_SEA_GREEN" },
+ { "lightskyblue", "LIGHT_SKY_BLUE" },
+ { "lightslategray", "LIGHT_SLATE_GRAY" },
+ { "lightsteelblue", "LIGHT_STEEL_BLUE" },
+ { "lightyellow", "LIGHT_YELLOW" },
+ { "lime", "LIME" },
+ { "limegreen", "LIME_GREEN" },
+ { "linen", "LINEN" },
+ { "magenta", "MAGENTA" },
+ { "maroon", "MAROON" },
+ { "mediumaquamarine", "MEDIUM_AQUAMARINE" },
+ { "mediumblue", "MEDIUM_BLUE" },
+ { "mediumorchid", "MEDIUM_ORCHID" },
+ { "mediumpurple", "MEDIUM_PURPLE" },
+ { "mediumseagreen", "MEDIUM_SEA_GREEN" },
+ { "mediumslateblue", "MEDIUM_SLATE_BLUE" },
+ { "mediumspringgreen", "MEDIUM_SPRING_GREEN" },
+ { "mediumturquoise", "MEDIUM_TURQUOISE" },
+ { "mediumvioletred", "MEDIUM_VIOLET_RED" },
+ { "midnightblue", "MIDNIGHT_BLUE" },
+ { "mintcream", "MINT_CREAM" },
+ { "mistyrose", "MISTY_ROSE" },
+ { "moccasin", "MOCCASIN" },
+ { "navajowhite", "NAVAJO_WHITE" },
+ { "navyblue", "NAVY_BLUE" },
+ { "oldlace", "OLD_LACE" },
+ { "olive", "OLIVE" },
+ { "olivedrab", "OLIVE_DRAB" },
+ { "orange", "ORANGE" },
+ { "orangered", "ORANGE_RED" },
+ { "orchid", "ORCHID" },
+ { "palegoldenrod", "PALE_GOLDENROD" },
+ { "palegreen", "PALE_GREEN" },
+ { "paleturquoise", "PALE_TURQUOISE" },
+ { "palevioletred", "PALE_VIOLET_RED" },
+ { "papayawhip", "PAPAYA_WHIP" },
+ { "peachpuff", "PEACH_PUFF" },
+ { "peru", "PERU" },
+ { "pink", "PINK" },
+ { "plum", "PLUM" },
+ { "powderblue", "POWDER_BLUE" },
+ { "purple", "PURPLE" },
+ { "rebeccapurple", "REBECCA_PURPLE" },
+ { "red", "RED" },
+ { "rosybrown", "ROSY_BROWN" },
+ { "royalblue", "ROYAL_BLUE" },
+ { "saddlebrown", "SADDLE_BROWN" },
+ { "salmon", "SALMON" },
+ { "sandybrown", "SANDY_BROWN" },
+ { "seagreen", "SEA_GREEN" },
+ { "seashell", "SEASHELL" },
+ { "sienna", "SIENNA" },
+ { "silver", "SILVER" },
+ { "skyblue", "SKY_BLUE" },
+ { "slateblue", "SLATE_BLUE" },
+ { "slategray", "SLATE_GRAY" },
+ { "snow", "SNOW" },
+ { "springgreen", "SPRING_GREEN" },
+ { "steelblue", "STEEL_BLUE" },
+ { "tan", "TAN" },
+ { "teal", "TEAL" },
+ { "thistle", "THISTLE" },
+ { "tomato", "TOMATO" },
+ { "transparent", "TRANSPARENT" },
+ { "turquoise", "TURQUOISE" },
+ { "violet", "VIOLET" },
+ { "webgray", "WEB_GRAY" },
+ { "webgreen", "WEB_GREEN" },
+ { "webmaroon", "WEB_MAROON" },
+ { "webpurple", "WEB_PURPLE" },
+ { "wheat", "WHEAT" },
+ { "white", "WHITE" },
+ { "whitesmoke", "WHITE_SMOKE" },
+ { "yellow", "YELLOW" },
+ { "yellowgreen", "YELLOW_GREEN" },
+
+ { nullptr, nullptr },
+};
+
+#endif // DISABLE_DEPRECATED
diff --git a/platform/ios/godot_view_gesture_recognizer.h b/editor/renames_map_3_to_4.h
index 57bfc75568..119ededf43 100644
--- a/platform/ios/godot_view_gesture_recognizer.h
+++ b/editor/renames_map_3_to_4.h
@@ -1,5 +1,5 @@
/**************************************************************************/
-/* godot_view_gesture_recognizer.h */
+/* renames_map_3_to_4.h */
/**************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
@@ -28,19 +28,27 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/**************************************************************************/
-// GLViewGestureRecognizer allows iOS gestures to work correctly by
-// emulating UIScrollView's UIScrollViewDelayedTouchesBeganGestureRecognizer.
-// It catches all gestures incoming to UIView and delays them for 150ms
-// (the same value used by UIScrollViewDelayedTouchesBeganGestureRecognizer)
-// If touch cancellation or end message is fired it fires delayed
-// begin touch immediately as well as last touch signal
+#ifndef RENAMES_MAP_3_TO_4_H
+#define RENAMES_MAP_3_TO_4_H
-#import <UIKit/UIKit.h>
+#ifndef DISABLE_DEPRECATED
-@interface GodotViewGestureRecognizer : UIGestureRecognizer
+struct RenamesMap3To4 {
+ static const char *enum_renames[][2];
+ static const char *gdscript_function_renames[][2];
+ static const char *csharp_function_renames[][2];
+ static const char *gdscript_properties_renames[][2];
+ static const char *csharp_properties_renames[][2];
+ static const char *gdscript_signals_renames[][2];
+ static const char *csharp_signals_renames[][2];
+ static const char *project_settings_renames[][2];
+ static const char *input_map_renames[][2];
+ static const char *builtin_types_renames[][2];
+ static const char *shaders_renames[][2];
+ static const char *class_renames[][2];
+ static const char *color_renames[][2];
+};
-@property(nonatomic, readonly, assign) NSTimeInterval delayTimeInterval;
+#endif // DISABLE_DEPRECATED
-- (instancetype)init;
-
-@end
+#endif // RENAMES_MAP_3_TO_4_H
diff --git a/editor/translations/editor/ar.po b/editor/translations/editor/ar.po
index 0fb924089d..51d860efe7 100644
--- a/editor/translations/editor/ar.po
+++ b/editor/translations/editor/ar.po
@@ -34,7 +34,7 @@
# Ahmed Shahwan <dev.ahmed.shahwan@gmail.com>, 2019.
# hshw <shw@tutanota.com>, 2020.
# Youssef Harmal <the.coder.crab@gmail.com>, 2020.
-# Nabeel20 <nabeelandnizam@gmail.com>, 2020, 2021, 2022.
+# Nabeel20 <nabeelandnizam@gmail.com>, 2020, 2021, 2022, 2023.
# merouche djallal <kbordora@gmail.com>, 2020.
# Airbus5717 <Abdussamadf350@gmail.com>, 2020.
# tamsamani mohamed <tamsmoha@gmail.com>, 2020.
@@ -76,8 +76,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: 2022-12-21 07:01+0000\n"
-"Last-Translator: Abdulrahman <abdelrahman.ramadan686@gmail.com>\n"
+"PO-Revision-Date: 2023-02-09 09:37+0000\n"
+"Last-Translator: Nabeel20 <nabeelandnizam@gmail.com>\n"
"Language-Team: Arabic <https://hosted.weblate.org/projects/godot-engine/"
"godot/ar/>\n"
"Language: ar\n"
@@ -86,14 +86,66 @@ 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.15.1-dev\n"
+"X-Generator: Weblate 4.16-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 "Mouse Wheel Left"
+msgstr "زر العجلة يساراً"
+
+msgid "Mouse Wheel Right"
+msgstr "زر العجلة يميناً"
+
+msgid "Mouse Thumb Button 1"
+msgstr "زر الÙأرة الأول الخاص بالإبهام"
+
+msgid "Mouse Thumb Button 2"
+msgstr "زر الÙأرة الثاني الخاص بالإبهام"
+
msgid "Button"
msgstr "زر"
+msgid "Double Click"
+msgstr "نقرة مضاعÙØ©"
+
+msgid "Mouse motion at position (%s) with velocity (%s)"
+msgstr "حركة الÙأرة بالموضع (%s) بالسرعة (%s)"
+
+msgid "Left Stick X-Axis, Joystick 0 X-Axis"
+msgstr "المحور الأÙقي لعصا التحكم اليسرى، محور التحكمJoystick الأÙقي 0"
+
+msgid "Left Stick Y-Axis, Joystick 0 Y-Axis"
+msgstr "المحور العمودي لعصا التحكم اليسرى، محور التحكم Joystick العمودي 0"
+
+msgid "Right Stick X-Axis, Joystick 1 X-Axis"
+msgstr "المحور الأÙقي لعصا التحكم اليمنى، محور التحكم Joystick الأÙقي 1"
+
+msgid "Right Stick Y-Axis, Joystick 1 Y-Axis"
+msgstr "المحور العمودي لعصا التحكم اليمنى، محور التحكم Joystickالعمودي 1"
+
+msgid "Joystick 2 X-Axis, Left Trigger, Sony L2, Xbox LT"
+msgstr ""
+"المحور الأÙقي لمركز التحكم Joystick الثاني، المÙطلق الأيسر، Sony L2ØŒ Xbox LT"
+
msgid "Select"
msgstr "حدد"
@@ -601,6 +653,9 @@ msgstr "من إشارة:"
msgid "Scene does not contain any script."
msgstr "لا يحتوي المشهد علي اي برنامج نصي."
+msgid "Select Method"
+msgstr "إختر طريقة"
+
msgid "Remove"
msgstr "إمسح"
@@ -656,9 +711,6 @@ msgstr "قطع الاتصال"
msgid "Connect a Signal to a Method"
msgstr "قم بوصل الإشارة إلى الدالة"
-msgid "Edit Connection:"
-msgstr "تعديل الإتصال:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr "هل أنت متأكد أنك تود إزالة كل الإتصالات من الإشارة \"%s\"؟"
@@ -803,23 +855,8 @@ msgstr "تحذير:"
msgid "Error:"
msgstr "خطأ:"
-msgid "C++ Error"
-msgstr "خطأ ÙÙŠ C++"
-
-msgid "C++ Error:"
-msgstr "خطأ C++ :"
-
-msgid "Source"
-msgstr "مصدر"
-
-msgid "C++ Source"
-msgstr "مصدر C++"
-
-msgid "Source:"
-msgstr "مصدر:"
-
-msgid "C++ Source:"
-msgstr "مصدر C++:"
+msgid "%s Error"
+msgstr "٪s خطأ"
msgid "Stack Trace"
msgstr "تتبع المÙكدس Stack Trace"
@@ -830,6 +867,9 @@ msgstr "خطأ ÙÙŠ نسخ"
msgid "Open C++ Source on GitHub"
msgstr "اÙتح مصدر ++C على GitHub"
+msgid "C++ Source"
+msgstr "مصدر C++"
+
msgid "Video RAM"
msgstr "الذاكرة العشوائية للÙيديو"
@@ -1658,7 +1698,7 @@ msgid "Styles"
msgstr "مظاهر"
msgid "Enumerations"
-msgstr "تعداد"
+msgstr "تعدادات"
msgid "Property Descriptions"
msgstr "أوصا٠المÙلكية"
@@ -1776,12 +1816,12 @@ msgstr "إظهار جميع المَحليّات Locales"
msgid "Show Selected Locales Only"
msgstr "إظهار المَحليّات المÙختارة Ùحسب"
+msgid "Edit Filters"
+msgstr "تعديل المÙرشحات"
+
msgid "Language:"
msgstr "اللغة:"
-msgid "Script"
-msgstr "النص البرمجي"
-
msgid "Clear Output"
msgstr "مسح المÙخرجات"
@@ -2287,7 +2327,7 @@ msgid "FileSystem"
msgstr "نظام الملÙات"
msgid "Inspector"
-msgstr "Ù…ÙتÙحص"
+msgstr "الÙاحص"
msgid "Node"
msgstr "وحدة"
@@ -2311,23 +2351,6 @@ msgid "Install from file"
msgstr "تثبيت من ملÙ"
msgid ""
-"This will set up your project for custom Android builds by installing the "
-"source template to \"res://android/build\".\n"
-"You can then apply modifications and build your own custom APK on export "
-"(adding modules, changing the AndroidManifest.xml, etc.).\n"
-"Note that in order to make custom builds instead of using pre-built APKs, "
-"the \"Use Custom Build\" option should be enabled in the Android export "
-"preset."
-msgstr ""
-"بهذه الطريقة سيتم إعداد المشروع الخاص بك لأجل نسخ بناء أندرويد مخصص عن طريق "
-"تثبيت قوالب المصدر البرمجي ÙÙŠ \"res://android/build\".\n"
-"يمكنك تطبيق تعديلات الخاصة على نسخة البناء للحصول على حزمة تطبيق أندرويد APK "
-"معدّلة عند التصدير (زيادة Ù…Ùلحقات، تعديل مل٠AndroidManifest.xml إلخ..).\n"
-"ضع ÙÙŠ بالك أنه من أجل إنشاء نسخ بناء مخصوصة بدلاً من الحزم APKs المبنية سلÙاً، "
-"ينبغي أن يكون إعداد \"استخدام بناء مخصص\" ممكناً ÙÙŠ إعدادات تصدير الأندرويد "
-"Android export preset."
-
-msgid ""
"The Android build template is already installed in this project and it won't "
"be overwritten.\n"
"Remove the \"res://android/build\" directory manually before attempting this "
@@ -2548,9 +2571,6 @@ msgstr "الاختصارات"
msgid "Binding"
msgstr "الربط"
-msgid "%s Error"
-msgstr "٪s خطأ"
-
msgid "All Devices"
msgstr "جميع الأجهزة"
@@ -3365,6 +3385,9 @@ msgstr "حدد وحرك النقاط، أنشئ النقاط باستخدام RM
msgid "Enable snap and show grid."
msgstr "تمكين المحاذاة وإظهار الشبكة."
+msgid "Blend:"
+msgstr "الدمج:"
+
msgid "Point"
msgstr "نقطة"
@@ -3408,15 +3431,9 @@ msgstr "مسح النقط والمثلثات."
msgid "Generate blend triangles automatically (instead of manually)"
msgstr "توليد مثلثات دمج بصورة تلقائية (بدلاً من اليدوية)"
-msgid "Blend:"
-msgstr "الدمج:"
-
msgid "Parameter Changed:"
msgstr "لقد تم تغيير المَعلم:"
-msgid "Edit Filters"
-msgstr "تعديل المÙرشحات"
-
msgid "Output node can't be added to the blend tree."
msgstr "لا يمكن إضاÙØ© مخرجات الوحدة إلى شجرة الدمج."
@@ -3535,9 +3552,6 @@ msgstr "تشغيل الرسم المتحرك المختار بشكل عكسي م
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "تشغيل الرسم المتحرك المختار بشكل عكسي من النهاية. (Shift+A)"
-msgid "Stop animation playback. (S)"
-msgstr "إيقا٠تشغيل الرسم المتحرك. (S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "تشغيل الرسم المتحرك المحدد من البداية. (Shift+D)"
@@ -4710,12 +4724,6 @@ msgstr "تعديل Notifier AABB"
msgid "Change Particles AABB"
msgstr "تعديل جÙزيئات AABB"
-msgid "Change Box Shape Extents"
-msgstr "تعديل حجم الشكل الصندوقي"
-
-msgid "Change Probe Extents"
-msgstr "تعديل نطاقات المسبر Probe Extents"
-
msgid "Change Capsule Shape Radius"
msgstr "تعديل نص٠قطر الشكل الكبسولي Capsule Shape"
@@ -5522,6 +5530,9 @@ msgstr "معياري"
msgid "Connections to method:"
msgstr "الاتصالات لدالة:"
+msgid "Source"
+msgstr "مصدر"
+
msgid "Target"
msgstr "الهدÙ"
@@ -5763,12 +5774,6 @@ msgstr "(Ùارغ)"
msgid "Animations:"
msgstr "الرسومات المتحركة:"
-msgid "Speed:"
-msgstr "السرعة:"
-
-msgid "Loop"
-msgstr "حلقة Loop"
-
msgid "Animation Frames:"
msgstr "إطارات الرسومات المتحركة:"
@@ -7045,9 +7050,6 @@ msgstr "إضاÙØ© إجراء إدخال"
msgid "Change Action deadzone"
msgstr "تغيير المنطقة الميتة للÙعالية Action deadzone"
-msgid "Add Input Action Event"
-msgstr "إضاÙØ© حدث Ùعالية الإدخال"
-
msgid "Erase Input Action"
msgstr "مسح إجراء الإدخال"
@@ -7072,9 +7074,6 @@ msgstr "انتقاء الخاصية"
msgid "Select Virtual Method"
msgstr "اختر الطريقة الإÙتراضية"
-msgid "Select Method"
-msgstr "إختر طريقة"
-
msgid "Batch Rename"
msgstr "إعادة تسمية الدÙعة"
@@ -7775,14 +7774,6 @@ msgstr "Ù…Ùتاح عام غير صالح لأجل تصدير حزمة تطبيÙ
msgid "Invalid package name:"
msgstr "اسم رÙزمة غير صالح:"
-msgid "\"Use Custom Build\" must be enabled to use the plugins."
-msgstr "يجب تÙعيل \"Use Custom Build\" لإستخدام الإضاÙات."
-
-msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled."
-msgstr ""
-"يصبح خيار \"تصدير ABB\" صالحاً Ùقط عندما يتم اختيار \"استعمال تصدير مخصص "
-"Custom Build\"."
-
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."
@@ -7826,13 +7817,6 @@ msgid "Unsupported export format!"
msgstr "تنسيق تصدير غير مدعوم!"
msgid ""
-"Trying to build from a custom built template, but no version info for it "
-"exists. Please reinstall from the 'Project' menu."
-msgstr ""
-"تتم محاولة البناء من قالب بناء Ù…Ùخصص، ولكن لا تتواجد معلومات النسخة. من Ùضلك "
-"أعد التحميل من قائمة \"المشروع\"."
-
-msgid ""
"Android build version mismatch: Template installed: %s, Godot version: %s. "
"Please reinstall Android build template from 'Project' menu."
msgstr ""
@@ -8206,6 +8190,9 @@ msgstr "مصدر غير صالح للمعاينة."
msgid "Invalid source for shader."
msgstr "مصدر غير صالح لتظليل."
+msgid "Filter"
+msgstr "المÙرشح"
+
msgid "Repeat"
msgstr "كرر"
diff --git a/editor/translations/editor/bg.po b/editor/translations/editor/bg.po
index e6e20fe39f..227c371174 100644
--- a/editor/translations/editor/bg.po
+++ b/editor/translations/editor/bg.po
@@ -11,7 +11,7 @@
# Whod <whodizhod@gmail.com>, 2020.
# Stoyan <stoyan.stoyanov99@protonmail.com>, 2020.
# zooid <the.zooid@gmail.com>, 2020, 2022.
-# Любомир ВаÑилев <lyubomirv@gmx.com>, 2020, 2021, 2022.
+# Любомир ВаÑилев <lyubomirv@gmx.com>, 2020, 2021, 2022, 2023.
# Ziv D <wizdavid@gmail.com>, 2020.
# Violin Iliev <violin.developer@gmail.com>, 2021.
# Ivan Gechev <ivan_banov@abv.bg>, 2022.
@@ -23,8 +23,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: 2022-10-25 15:43+0000\n"
-"Last-Translator: Vosh <vosh4k@gmail.com>\n"
+"PO-Revision-Date: 2023-02-10 14:12+0000\n"
+"Last-Translator: Любомир ВаÑилев <lyubomirv@gmx.com>\n"
"Language-Team: Bulgarian <https://hosted.weblate.org/projects/godot-engine/"
"godot/bg/>\n"
"Language: bg\n"
@@ -32,7 +32,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.14.2-dev\n"
+"X-Generator: Weblate 4.16-dev\n"
msgid "Physical"
msgstr "ФизичеÑки"
@@ -363,6 +363,16 @@ msgstr "Ðомер на реда:"
msgid "%d replaced."
msgstr "%d заменени."
+msgid "%d match"
+msgid_plural "%d matches"
+msgstr[0] "%d Ñъвпадение"
+msgstr[1] "%d ÑъвпадениÑ"
+
+msgid "%d of %d match"
+msgid_plural "%d of %d matches"
+msgstr[0] "%d от %d Ñъвпадение"
+msgstr[1] "%d от %d ÑъвпадениÑ"
+
msgid "Match Case"
msgstr "Различаване на малки и главни букви"
@@ -402,6 +412,9 @@ msgstr "От Ñигнал:"
msgid "Scene does not contain any script."
msgstr "Сцената не Ñъдържа Ñкриптове."
+msgid "Select Method"
+msgstr "Избиране на метод"
+
msgid "Remove"
msgstr "Премахване"
@@ -438,9 +451,6 @@ msgstr "Разкачване"
msgid "Connect a Signal to a Method"
msgstr "Свързване на Ñигнала към метод"
-msgid "Edit Connection:"
-msgstr "Редактиране на Връзката:"
-
msgid "Signals"
msgstr "Сигнали"
@@ -498,11 +508,8 @@ msgstr "Предупреждение:"
msgid "Error:"
msgstr "Грешка:"
-msgid "C++ Error"
-msgstr "Грешка в C++"
-
-msgid "C++ Error:"
-msgstr "Грешка в C++:"
+msgid "%s Error"
+msgstr "Грешка от %s"
msgid "Copy Error"
msgstr "Копиране на грешката"
@@ -1050,12 +1057,12 @@ msgstr "Показване на вÑички езици"
msgid "Show Selected Locales Only"
msgstr "Показване Ñамо на избраните езици"
+msgid "Edit Filters"
+msgstr "Редактиране на филтрите"
+
msgid "Language:"
msgstr "Език:"
-msgid "Script"
-msgstr "Скрипт"
-
msgid "Clear Output"
msgstr "ИзчиÑтване на изхода"
@@ -1332,24 +1339,6 @@ msgstr "Управление на шаблоните"
msgid "Install from file"
msgstr "ИнÑталиране от файл"
-msgid ""
-"This will set up your project for custom Android builds by installing the "
-"source template to \"res://android/build\".\n"
-"You can then apply modifications and build your own custom APK on export "
-"(adding modules, changing the AndroidManifest.xml, etc.).\n"
-"Note that in order to make custom builds instead of using pre-built APKs, "
-"the \"Use Custom Build\" option should be enabled in the Android export "
-"preset."
-msgstr ""
-"Това ще наÑтрои проекта Ви за перÑонализирано компилиране за Android, като "
-"инÑталира Ð¸Ð·Ñ…Ð¾Ð´Ð½Ð¸Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½ в „res://android/build“.\n"
-"След това ще можете да го промените (като добавите модули, промените файла "
-"„AndroidManifest.xml“ и Ñ‚.н.) и да Ñъздадете Ñвой ÑобÑтвен APK за "
-"изнаÑÑнето.\n"
-"Имайте предвид, че за да ползвате перÑонализирани файлове APK, вмеÑто "
-"предварително готовите, в конфигурациÑта за изнаÑÑне за Android Ñ‚Ñ€Ñбва да "
-"поÑтавена отметка в „Използване на ÑобÑтвена компилациÑ“."
-
msgid "Import Templates From ZIP File"
msgstr "ВнаÑÑне на шаблони от архив във формат ZIP"
@@ -1429,9 +1418,6 @@ msgstr "ÐаÑтройки на редактора"
msgid "General"
msgstr "Общи"
-msgid "%s Error"
-msgstr "Грешка от %s"
-
msgid "All Devices"
msgstr "Ð’Ñички уÑтройÑтва"
@@ -1745,39 +1731,107 @@ msgstr "Допълнителни наÑтройки на реÑурÑа."
msgid "Edit Resource from Clipboard"
msgstr "Редактиране на реÑÑƒÑ€Ñ Ð¾Ñ‚ буфера за обмен"
+msgid "Go to previous edited object in history."
+msgstr "Преминаване към Ð¿Ñ€ÐµÐ´Ñ…Ð¾Ð´Ð½Ð¸Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð°Ð½ обект в иÑториÑта."
+
+msgid "Go to next edited object in history."
+msgstr "Преминаване към ÑÐ»ÐµÐ´Ð²Ð°Ñ‰Ð¸Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð°Ð½ обект в иÑториÑта."
+
msgid "History of recently edited objects."
msgstr "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ð° поÑледно редактираните обекти."
msgid "Open documentation for this object."
msgstr "ОтварÑне на документациÑта за този обект."
+msgid "Filter Properties"
+msgstr "Филтриране на ÑвойÑтвата"
+
msgid "Manage object properties."
msgstr "Управление на ÑвойÑтвата на обекта."
+msgid "This cannot be undone. Are you sure?"
+msgstr "Това дейÑтвие е необратимо. ÐаиÑтина ли го иÑкате?"
+
msgid "Add %d Translations"
msgstr "ДобавÑне на %d превода"
msgid "Remove Translation"
msgstr "Премахване на превода"
+msgid "Add %d file(s) for POT generation"
+msgstr "ДобавÑне на %d файл(а) за Ñъздаване на POT"
+
+msgid "Remove file from POT generation"
+msgstr "Премахване на файла от процеÑа за Ñъздаване на POT"
+
+msgid "Removed"
+msgstr "Премахнато"
+
+msgid "%s cannot be found."
+msgstr "%s не може да бъде намерено."
+
+msgid "Translations"
+msgstr "Преводи"
+
+msgid "Translations:"
+msgstr "Преводи:"
+
+msgid "Resources:"
+msgstr "РеÑурÑи:"
+
msgid "Locale"
msgstr "Локал"
+msgid "POT Generation"
+msgstr "Създаване на POT"
+
+msgid "Files with translation strings:"
+msgstr "Файлове Ñ Ð½Ð¸Ð·Ð¾Ð²Ðµ за превод:"
+
+msgid "Generate POT"
+msgstr "Създаване на POT"
+
+msgid "Set %s on %d nodes"
+msgstr "Задаване на %s на %d обекта"
+
+msgid "%s (%d Selected)"
+msgstr "%s (%d избран(и))"
+
msgid "Select a single node to edit its signals and groups."
msgstr "Изберете един обект, за да редактирате Ñигналите и групите му."
+msgid "Plugin name cannot be blank."
+msgstr "Името на приÑтавката не може да бъде празно."
+
+msgid "Script extension must match chosen language extension (.%s)."
+msgstr ""
+"Разширението на Ñкрипта Ñ‚Ñ€Ñбва да Ñъвпада Ñ Ñ€Ð°Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð¸ÐµÑ‚Ð¾ на Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ ÐµÐ·Ð¸Ðº (."
+"%s)."
+
+msgid "Subfolder name is not a valid folder name."
+msgstr "Името на подпапката не е правилно име на папка."
+
+msgid "Subfolder cannot be one which already exists."
+msgstr "Вече ÑъщеÑтвува подпапка Ñ Ñ‚Ð¾Ð²Ð° име."
+
msgid "Edit a Plugin"
msgstr "Редактиране на приÑтавка"
msgid "Create a Plugin"
msgstr "Създаване на приÑтавка"
+msgid "Update"
+msgstr "ОбновÑване"
+
msgid "Plugin Name:"
msgstr "Име на приÑтавката:"
msgid "Subfolder:"
msgstr "Подпапка:"
+msgid "Author:"
+msgstr "Ðвтор:"
+
msgid "Version:"
msgstr "ВерÑиÑ:"
@@ -1829,6 +1883,17 @@ msgstr "Зареждане..."
msgid "Move Node Point"
msgstr "ПремеÑтване на точката на обекта"
+msgid "Change BlendSpace1D Config"
+msgstr "ПромÑна на конфигурациÑта на BlendSpace1D"
+
+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 ""
"Този тип обект не може да бъде използван. Разрешени Ñа Ñамо коренни обекти."
@@ -1842,6 +1907,9 @@ msgstr "ДобавÑне на точки за анимациÑ"
msgid "Remove BlendSpace1D Point"
msgstr "Премахване на точка на BlendSpace1D"
+msgid "Move BlendSpace1D Node Point"
+msgstr "ПремеÑтване на точката на обекта за BlendSpace1D"
+
msgid ""
"AnimationTree is inactive.\n"
"Activate to enable playback, check node warnings if activation fails."
@@ -1859,6 +1927,12 @@ msgstr "Избиране и премеÑтване на точки; Ñъздав
msgid "Enable snap and show grid."
msgstr "Включване на прилепването и показване на решетката."
+msgid "Sync:"
+msgstr "Синхронизиране:"
+
+msgid "Blend:"
+msgstr "СмеÑване:"
+
msgid "Point"
msgstr "Точка"
@@ -1874,8 +1948,17 @@ msgstr "Триъгълникът вече ÑъщеÑтвува."
msgid "Add Triangle"
msgstr "ДобавÑне на триъгълник"
+msgid "Change BlendSpace2D Config"
+msgstr "ПромÑна на конфигурациÑта на BlendSpace2D"
+
+msgid "Change BlendSpace2D Labels"
+msgstr "ПромÑна на етикетите на BlendSpace2D"
+
msgid "Remove BlendSpace2D Point"
-msgstr "ПремеÑтване на точка на BlendSpace2D"
+msgstr "Премахване на точката на BlendSpace2D"
+
+msgid "Remove BlendSpace2D Triangle"
+msgstr "Премахване на триъгълника на BlendSpace2D"
msgid "BlendSpace2D does not belong to an AnimationTree node."
msgstr "BlendSpace2D не принадлежи на обект от тип AnimationTree."
@@ -1895,14 +1978,14 @@ msgstr "Изтриване на точки и триъгълници."
msgid "Generate blend triangles automatically (instead of manually)"
msgstr "Създаване на триъгълници за ÑмеÑване автоматично (а не ръчно)"
-msgid "Blend:"
-msgstr "СмеÑване:"
-
msgid "Parameter Changed:"
msgstr "Параметърът е променен:"
-msgid "Edit Filters"
-msgstr "Редактиране на филтрите"
+msgid "Inspect Filters"
+msgstr "Разглеждане на филтрите"
+
+msgid "Output node can't be added to the blend tree."
+msgstr "РезултатниÑÑ‚ обект не може да бъде добавен към дървото за ÑмеÑване."
msgid "Add Node to BlendTree"
msgstr "ДобавÑне на обекта към BlendTree"
@@ -1945,6 +2028,9 @@ msgstr "Ðудио клипове"
msgid "Functions"
msgstr "Функции"
+msgid "Inspect Filtered Tracks:"
+msgstr "Разглеждане на филтрираните пътечки:"
+
msgid "Edit Filtered Tracks:"
msgstr "Редактиране на филтрираните пътечки:"
@@ -1957,9 +2043,86 @@ msgstr "ДобавÑне на обект…"
msgid "Enable Filtering"
msgstr "Включване на филтрирането"
+msgid "Library Name:"
+msgstr "Име на библиотеката:"
+
+msgid "Animation name can't be empty."
+msgstr "Името на анимациÑта не може да бъде празно."
+
+msgid "Animation name contains invalid characters: '/', ':', ',' or '['."
+msgstr ""
+"Името на анимациÑта Ñъдържа нÑкой/и от Ñледните непозволени знаци: / : , или "
+"[."
+
+msgid "Animation with the same name already exists."
+msgstr "Вече ÑъщеÑтвува Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ñ Ñ‚Ð¾Ð²Ð° име."
+
+msgid "Enter a library name."
+msgstr "Въведете име за библиотеката."
+
+msgid "Library name contains invalid characters: '/', ':', ',' or '['."
+msgstr ""
+"Името на библиотеката Ñъдържа нÑкой/и от Ñледните непозволени знаци: / : , "
+"или [."
+
+msgid "Library with the same name already exists."
+msgstr "Вече ÑъщеÑтвува библиотека Ñ Ñ‚Ð¾Ð²Ð° име."
+
+msgid "Animation name is valid."
+msgstr "Името на анимациÑта Ð¾Ñ‚Ð³Ð¾Ð²Ð°Ñ€Ñ Ð½Ð° изиÑкваниÑта."
+
+msgid "Global library will be created."
+msgstr "Ще бъде Ñъздадена глобална библиотека."
+
+msgid "Library name is valid."
+msgstr "Името на библиотеката Ð¾Ñ‚Ð³Ð¾Ð²Ð°Ñ€Ñ Ð½Ð° изиÑкваниÑта."
+
+msgid "Add Animation to Library: %s"
+msgstr "ДобавÑне на Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ ÐºÑŠÐ¼ библиотеката: %s"
+
+msgid "Add Animation Library: %s"
+msgstr "ДобавÑне на анимационна библиотека: %s"
+
msgid "Load Animation"
msgstr "Зареждане на анимациÑ"
+msgid ""
+"This animation library can't be saved because it does not belong to the "
+"edited scene. Make it unique first."
+msgstr ""
+"Тази анимационна библиотека не може да бъде запазена, тъй като не принадлежи "
+"на редактираната Ñцена. Ðаправете Ñ ÑƒÐ½Ð¸ÐºÐ°Ð»Ð½Ð° първо."
+
+msgid ""
+"This animation library can't be saved because it was imported from another "
+"file. Make it unique first."
+msgstr ""
+"Тази анимационна библиотека не може да бъде запазена, тъй като е била "
+"внеÑена от друг файл. Ðаправете Ñ ÑƒÐ½Ð¸ÐºÐ°Ð»Ð½Ð° първо."
+
+msgid "Save Library"
+msgstr "Запазване на библиотеката"
+
+msgid "Make Animation Library Unique: %s"
+msgstr "Превръщане на анимационна библиотека в уникална: %s"
+
+msgid ""
+"This animation can't be saved because it does not belong to the edited "
+"scene. Make it unique first."
+msgstr ""
+"Тази Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ð½Ðµ може да бъде запазена, тъй като не принадлежи на "
+"редактираната Ñцена. Ðаправете Ñ ÑƒÐ½Ð¸ÐºÐ°Ð»Ð½Ð° първо."
+
+msgid ""
+"This animation can't be saved because it was imported from another file. "
+"Make it unique first."
+msgstr ""
+"Тази Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ð½Ðµ може да бъде запазена, тъй като е била внеÑена от друг "
+"файл. Ðаправете Ñ ÑƒÐ½Ð¸ÐºÐ°Ð»Ð½Ð° първо."
+
+msgid "Save Animation"
+msgstr "Запазване на анимациÑта"
+
msgid "Animation Name:"
msgstr "Име на анимациÑта:"
@@ -2003,9 +2166,6 @@ msgstr ""
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "Възпроизвеждане на избраната Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ð½Ð°Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ð¾ от краÑ. (Shift+A)"
-msgid "Stop animation playback. (S)"
-msgstr "Спиране на възпроизвеждането на анимациÑта. (S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "Възпроизвеждане на избраната Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ началото. (Shift+D)"
@@ -2130,21 +2290,51 @@ msgstr "Съдържание:"
msgid "View Files"
msgstr "Преглед на файловете"
+msgid "Download"
+msgstr "СвалÑне"
+
msgid "Connection error, please try again."
msgstr "Грешка във връзката. МолÑ, опитайте отново."
+msgid "Can't connect."
+msgstr "Ðе може да Ñе оÑъщеÑтви връзка."
+
+msgid "Can't connect to host:"
+msgstr "Ðе може да Ñе оÑъщеÑтви връзка ÑÑŠÑ Ñървъра:"
+
+msgid "No response from host:"
+msgstr "ÐÑма отговор от Ñървъра:"
+
+msgid "No response."
+msgstr "ÐÑма отговор."
+
msgid "Request failed, return code:"
msgstr "ЗаÑвката беше неуÑпешна. Код:"
msgid "Cannot save response to:"
msgstr "Отговорът не може да бъде запазен в:"
+msgid "Write error."
+msgstr "Грешка при запиÑ."
+
msgid "Request failed, too many redirects"
msgstr "ЗаÑвката Ñе провали. Твърде много пренаÑочваниÑ"
+msgid "Redirect loop."
+msgstr "Цикъл от пренаÑочваниÑ."
+
msgid "Request failed, timeout"
msgstr "ЗаÑвката е неуÑпешна, изчакването е неуÑпешно"
+msgid "Timeout."
+msgstr "Изтекло време."
+
+msgid "Failed:"
+msgstr "ÐеуÑпешно:"
+
+msgid "Bad download hash, assuming file has been tampered with."
+msgstr "Ðеправилна хеш-Ñума на ÑÐ²Ð°Ð»ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð». Приема Ñе, че той е бил увреден."
+
msgid "Expected:"
msgstr "Очаквано:"
@@ -2154,6 +2344,9 @@ msgstr "Получено:"
msgid "Failed SHA-256 hash check"
msgstr "ÐеуÑпешна проверка на хеш от вид SHA-256"
+msgid "Ready to install!"
+msgstr "Готово за инÑталиране!"
+
msgid "Downloading (%s / %s)..."
msgstr "СвалÑне (%s / %s)..."
@@ -2181,6 +2374,12 @@ msgstr "ПоÑледно обновени"
msgid "Least Recently Updated"
msgstr "Обновени отдавна"
+msgid "Name (A-Z)"
+msgstr "Име (Ð-Я)"
+
+msgid "Name (Z-A)"
+msgstr "Име (Я-Ð)"
+
msgid "License (A-Z)"
msgstr "Лиценз (Ð-Я)"
@@ -2196,9 +2395,43 @@ msgstr "ТеÑтово"
msgid "Loading..."
msgstr "Зареждане…"
+msgctxt "Pagination"
+msgid "First"
+msgstr "Първа"
+
+msgctxt "Pagination"
+msgid "Previous"
+msgstr "Предишна"
+
+msgctxt "Pagination"
+msgid "Next"
+msgstr "Следваща"
+
+msgctxt "Pagination"
+msgid "Last"
+msgstr "ПоÑледна"
+
msgid "All"
msgstr "Ð’Ñички"
+msgid "No results for \"%s\" for support level(s): %s."
+msgstr "ÐÑма резултати за „%s“ за нивото/нивата на поддръжка: %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 ""
+"ÐÑма резултати ÑъвмеÑтими Ñ â€ž%s“ за нивото/нивата на поддръжка: %s.\n"
+"Проверете включените нива на поддръжка чрез бутона „Поддръжка“ в Ð³Ð¾Ñ€Ð½Ð¸Ñ "
+"деÑен ъгъл."
+
+msgid "Search Templates, Projects, and Demos"
+msgstr "ТърÑене на шаблони, проекти и демота"
+
+msgid "Search Assets (Excluding Templates, Projects, and Demos)"
+msgstr "ТърÑене на материали (изключвайки шаблони, проекти и демота)"
+
msgid "Import..."
msgstr "ВнаÑÑне…"
@@ -2436,6 +2669,9 @@ msgstr ""
"Ðко тази наÑтройка е включено, навигационните полигони и мрежи ще бъдат "
"видими в изпълнÑÐ²Ð°Ñ‰Ð¸Ñ Ñе проект."
+msgid " - Variation"
+msgstr " – ВариациÑ"
+
msgid "Convert to CPUParticles2D"
msgstr "Преобразуване в CPUParticles2D"
@@ -2574,6 +2810,9 @@ msgstr "Източник за полигонна мрежа:"
msgid "Mesh Up Axis:"
msgstr "ÐžÑ Ñочеща нагоре за полигонната мрежа:"
+msgid "Objects: %d\n"
+msgstr "Обекти: %d\n"
+
msgid "Top View."
msgstr "Изглед отгоре."
@@ -3159,11 +3398,8 @@ msgstr "(празно)"
msgid "Animations:"
msgstr "Ðнимации:"
-msgid "Speed:"
-msgstr "СкороÑÑ‚:"
-
-msgid "Loop"
-msgstr "ПовтарÑне"
+msgid "Delete Animation"
+msgstr "Изтриване на анимациÑта"
msgid "Animation Frames:"
msgstr "Кадри на анимациÑта:"
@@ -3207,9 +3443,29 @@ msgstr "Стъпка:"
msgid "Styleboxes"
msgstr "Стилове"
+msgid "1 color"
+msgid_plural "{num} colors"
+msgstr[0] "1 цвÑÑ‚"
+msgstr[1] "{num} цвÑта"
+
+msgid "1 constant"
+msgid_plural "{num} constants"
+msgstr[0] "конÑтанта"
+msgstr[1] "{num} конÑтанти"
+
msgid "No constants found."
msgstr "ÐÑма намерени конÑтанти."
+msgid "1 font size"
+msgid_plural "{num} font sizes"
+msgstr[0] "1 размер на шрифт"
+msgstr[1] "{num} размера на шрифт"
+
+msgid "1 stylebox"
+msgid_plural "{num} styleboxes"
+msgstr[0] "1 Ñтилова кутиÑ"
+msgstr[1] "{num} Ñтилови кутии"
+
msgid "Importing Theme Items"
msgstr "ВнаÑÑне на елементите на темата"
@@ -3728,9 +3984,6 @@ msgstr "Избиране на ÑвойÑтво"
msgid "Select Virtual Method"
msgstr "Избиране на виртуален метод"
-msgid "Select Method"
-msgstr "Избиране на метод"
-
msgid "Batch Rename"
msgstr "МаÑово преименуване"
@@ -3868,6 +4121,11 @@ msgstr "Група бутони"
msgid "(Connecting From)"
msgstr "(Свързване от)"
+msgid "Node has one connection."
+msgid_plural "Node has {num} connections."
+msgstr[0] "Обектът има една връзка."
+msgstr[1] "Обектът има {num} връзки."
+
msgid "Open Script:"
msgstr "ОтварÑне на Ñкрипт:"
@@ -4013,6 +4271,9 @@ msgstr "Размер"
msgid "Network Profiler"
msgstr "Профилиране на мрежата"
+msgid "Delete Property?"
+msgstr "Изтриване на ÑвойÑтвото?"
+
msgid "A NavigationMesh resource must be set or created for this node to work."
msgstr ""
"ТрÑбва да Ñе зададе или Ñъздаде реÑÑƒÑ€Ñ Ð¾Ñ‚ тип NavigationMesh, за може да "
@@ -4110,16 +4371,6 @@ msgstr "Ðеправилен публичен ключ за разширение
msgid "Invalid package name:"
msgstr "Ðеправилно име на пакет:"
-msgid "\"Use Custom Build\" must be enabled to use the plugins."
-msgstr ""
-"„Използване на ÑобÑтвена компилациÑ“ Ñ‚Ñ€Ñбва да е включено, за да могат да Ñе "
-"използват приÑтавките."
-
-msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled."
-msgstr ""
-"„ИзнаÑÑне на AAB“ може да Ñе ползва Ñамо когато е включено „Използване на "
-"ÑобÑтвена компилациÑ“."
-
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."
@@ -4180,7 +4431,7 @@ msgid "Creating APK..."
msgstr "Създаване на APK…"
msgid "Could not find template APK to export: \"%s\"."
-msgstr "Ðе е намерен шаблонен файл APK за изнаÑÑне: %s"
+msgstr "Ðе е намерен шаблонен файл APK за изнаÑÑне: „%s“."
msgid ""
"Missing libraries in the export template for the selected architectures: %s. "
@@ -4227,10 +4478,28 @@ msgstr "Ðеправилна верÑÐ¸Ñ Ð½Ð° файла:"
msgid "Invalid product version:"
msgstr "Ðеправилна верÑÐ¸Ñ Ð½Ð° продукта:"
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, CharacterBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon2D Ñлужи Ñамо, за да даде форма за колизии на обект оÑнован "
+"на CollisionObject2D. Използвайте го Ñамо като под-обект на Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D и т.н., за да им дадете форма."
+
msgid "An empty CollisionPolygon2D has no effect on collision."
msgstr "Празен CollisionPolygon2D не влиÑе на колизиите."
msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, CharacterBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionShape2D Ñлужи Ñамо, за да даде форма за колизии на обект оÑнован на "
+"CollisionObject2D. Използвайте го Ñамо като наÑледник на Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, и т.н., за да им дадете форма."
+
+msgid ""
"A shape must be provided for CollisionShape2D to function. Please create a "
"shape resource for it!"
msgstr ""
@@ -4269,6 +4538,17 @@ msgstr ""
"СвойÑтвото „Path“ Ñ‚Ñ€Ñбва да Ñочи към дейÑтвителен обект от тип Node2D, за да "
"работи."
+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, "
+"CharacterBody3D, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon3D Ñлужи Ñамо, за да даде форма за колизии на обект оÑнован "
+"на CollisionObject3D.\n"
+"Използвайте го Ñамо като под-обект на Area3D, StaticBody3D, RigidBody3D, "
+"KinematicBody3D и т.н., за да им дадете форма."
+
msgid "Nothing is visible because no mesh has been assigned."
msgstr "Ðе Ñе вижда нищо, той като нÑма зададена полигонна мрежа."
@@ -4303,5 +4583,12 @@ msgstr "ТрÑбва да Ñе използва правилно разширеÐ
msgid "(Other)"
msgstr "(Други)"
+msgid ""
+"Shader keywords cannot be used as parameter names.\n"
+"Choose another name."
+msgstr ""
+"Шейдърните Ñлужебни думи не могат да Ñе ползват като имена на ÑвойÑтва.\n"
+"Изберете друго име."
+
msgid "Constants cannot be modified."
msgstr "КонÑтантите не могат да бъдат променени."
diff --git a/editor/translations/editor/ca.po b/editor/translations/editor/ca.po
index 4cad0ebca6..6d888c3448 100644
--- a/editor/translations/editor/ca.po
+++ b/editor/translations/editor/ca.po
@@ -557,6 +557,9 @@ msgstr "Des del Senyal:"
msgid "Scene does not contain any script."
msgstr "L'escena no conté cap script."
+msgid "Select Method"
+msgstr "Selecciona un Mètode"
+
msgid "Remove"
msgstr "Treu"
@@ -614,9 +617,6 @@ msgstr "Desconnectar"
msgid "Connect a Signal to a Method"
msgstr "Connectar un Senyal a un Mètode"
-msgid "Edit Connection:"
-msgstr "Editar Connexió:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
"Esteu segurs de que voleu eliminar totes les connexions del senyal \"%s\"?"
@@ -735,12 +735,6 @@ msgstr "Bytes:"
msgid "Error:"
msgstr "Error:"
-msgid "Source"
-msgstr "Font"
-
-msgid "Source:"
-msgstr "Font:"
-
msgid "Copy Error"
msgstr "Copia l'error"
@@ -1645,12 +1639,12 @@ msgstr "Mostrar tots els idiomes"
msgid "Show Selected Locales Only"
msgstr "Mostrar només els idiomes seleccionats"
+msgid "Edit Filters"
+msgstr "Edita Filtres"
+
msgid "Language:"
msgstr "Llengua:"
-msgid "Script"
-msgstr "Script"
-
msgid "Clear Output"
msgstr "Buida la Sortida"
@@ -2175,22 +2169,6 @@ msgid "Install from file"
msgstr "Instal·la des d'un fitxer"
msgid ""
-"This will set up your project for custom Android builds by installing the "
-"source template to \"res://android/build\".\n"
-"You can then apply modifications and build your own custom APK on export "
-"(adding modules, changing the AndroidManifest.xml, etc.).\n"
-"Note that in order to make custom builds instead of using pre-built APKs, "
-"the \"Use Custom Build\" option should be enabled in the Android export "
-"preset."
-msgstr ""
-"S'inicialitzarà el projecte per a compilar per Android. La plantilla "
-"s'instal·larà a \"res://android/build\".\n"
-"Pots aplicar modificacions i generar el teu propi APK en exportar ( afegir "
-"mòduls, canviar el manifest AndroidManifest.xml, etc.).\n"
-"Habilita l'opció \"Utilitza Compilació Personalitzada\" en la configuració "
-"d'exportació per a Android per personalitzar la compilació."
-
-msgid ""
"The Android build template is already installed in this project and it won't "
"be overwritten.\n"
"Remove the \"res://android/build\" directory manually before attempting this "
@@ -3074,6 +3052,9 @@ msgstr "Selecciona i mou els punts, crea punts fent clic dret."
msgid "Enable snap and show grid."
msgstr "Habilitar ajustament i mostrar quadrícula."
+msgid "Blend:"
+msgstr "Mescla:"
+
msgid "Point"
msgstr "Punt"
@@ -3116,15 +3097,9 @@ msgstr "Elimina punts i triangles."
msgid "Generate blend triangles automatically (instead of manually)"
msgstr "Genera automàticament triangles de mescla (en comptes d'a mà)"
-msgid "Blend:"
-msgstr "Mescla:"
-
msgid "Parameter Changed:"
msgstr "Paràmetre canviat:"
-msgid "Edit Filters"
-msgstr "Edita Filtres"
-
msgid "Output node can't be added to the blend tree."
msgstr "No es pot afegir el node de sortida a l'arbre de mescla."
@@ -3245,9 +3220,6 @@ msgstr ""
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "Reprodueix enrera l'animació seleccionada des del final. (Maj+A)"
-msgid "Stop animation playback. (S)"
-msgstr "Aturar la reproducció de l'animació. (S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "Reproduir l'animació seleccionada des de l'inici. (Maj+D)"
@@ -4116,12 +4088,6 @@ msgstr "Canviar Notificador AABB"
msgid "Change Particles AABB"
msgstr "Modifica les Partícules AABB"
-msgid "Change Box Shape Extents"
-msgstr "Modifica l'abast de la Forma Caixa"
-
-msgid "Change Probe Extents"
-msgstr "Modifica l'abast de la Sonda"
-
msgid "Change Capsule Shape Radius"
msgstr "Modifica el radi d'una Forma Càpsula"
@@ -4804,6 +4770,9 @@ msgstr "Estàndard"
msgid "Connections to method:"
msgstr "Connexions al mètode:"
+msgid "Source"
+msgstr "Font"
+
msgid "Target"
msgstr "Objectiu"
@@ -5010,9 +4979,6 @@ msgstr "(buit)"
msgid "Animations:"
msgstr "Animacions:"
-msgid "Loop"
-msgstr "Bucle"
-
msgid "Animation Frames:"
msgstr "Fotogrames d'Animació:"
@@ -5666,9 +5632,6 @@ msgstr "Afegeix una Acció d'Entrada"
msgid "Change Action deadzone"
msgstr "Canviar zona morta de l'acció"
-msgid "Add Input Action Event"
-msgstr "Afegeix un Incidència d'Acció de Entrada"
-
msgid "Erase Input Action"
msgstr "Elimina l'Acció d'Entrada"
@@ -5693,9 +5656,6 @@ msgstr "Selecciona una Propietat"
msgid "Select Virtual Method"
msgstr "Selecciona un Mètode Virtual"
-msgid "Select Method"
-msgstr "Selecciona un Mètode"
-
msgid "Batch Rename"
msgstr "Reanomena en lot"
diff --git a/editor/translations/editor/cs.po b/editor/translations/editor/cs.po
index 8509e80fbb..3c58f37106 100644
--- a/editor/translations/editor/cs.po
+++ b/editor/translations/editor/cs.po
@@ -33,13 +33,14 @@
# Mirinek <mirek.nozicka77@gmail.com>, 2022.
# Lubomír Baloun <lubosbaloun@gmail.com>, 2022.
# Ondřej Pavelka <flamekick97@gmail.com>, 2022, 2023.
+# ElisHoli <eliskaholz@seznam.cz>, 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-01-06 09:58+0000\n"
-"Last-Translator: Ondřej Pavelka <flamekick97@gmail.com>\n"
+"PO-Revision-Date: 2023-02-09 01:51+0000\n"
+"Last-Translator: ElisHoli <eliskaholz@seznam.cz>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/godot-engine/godot/"
"cs/>\n"
"Language: cs\n"
@@ -47,7 +48,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.15.1-dev\n"
+"X-Generator: Weblate 4.16-dev\n"
msgid "Button"
msgstr "TlaÄítko"
@@ -479,6 +480,18 @@ msgstr "Číslo řádku:"
msgid "%d replaced."
msgstr "%d nahrazeno."
+msgid "%d match"
+msgid_plural "%d matches"
+msgstr[0] "%d shoda."
+msgstr[1] "%d shod."
+msgstr[2] "%d shody."
+
+msgid "%d of %d match"
+msgid_plural "%d of %d matches"
+msgstr[0] "%d shoda."
+msgstr[1] "%d shod."
+msgstr[2] "%d shody."
+
msgid "Match Case"
msgstr "Rozlišovat malá/velká"
@@ -540,6 +553,9 @@ msgstr "Ze signálu:"
msgid "Scene does not contain any script."
msgstr "Scéna neobsahuje žádný skript."
+msgid "Select Method"
+msgstr "Vybrat metodu"
+
msgid "Remove"
msgstr "Odebrat"
@@ -595,9 +611,6 @@ msgstr "Odpojit"
msgid "Connect a Signal to a Method"
msgstr "Připojit signál k metodě"
-msgid "Edit Connection:"
-msgstr "Upravit spojení:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
"Jste si jisti, že chcete odstranit všechna připojení ze signálu \"%s\"?"
@@ -740,30 +753,15 @@ msgstr "Varování:"
msgid "Error:"
msgstr "Chyba:"
-msgid "C++ Error"
-msgstr "Chyba C++"
-
-msgid "C++ Error:"
-msgstr "Chyba C++:"
-
-msgid "Source"
-msgstr "Zdroj"
-
-msgid "C++ Source"
-msgstr "Zdroj C++"
-
-msgid "Source:"
-msgstr "Zdroj:"
-
-msgid "C++ Source:"
-msgstr "Zdroj C++:"
-
msgid "Stack Trace"
msgstr "Trasování zásobníku"
msgid "Copy Error"
msgstr "Kopírovat chybu"
+msgid "C++ Source"
+msgstr "Zdroj C++"
+
msgid "Video RAM"
msgstr "Video RAM"
@@ -1568,6 +1566,9 @@ msgstr "Vlastnosti"
msgid "default:"
msgstr "výchozí:"
+msgid "Operators"
+msgstr "Operátory"
+
msgid "Theme Properties"
msgstr "Vlastnosti motivu"
@@ -1703,12 +1704,12 @@ msgstr "Zobrazit všechny jazyky"
msgid "Show Selected Locales Only"
msgstr "Zobrazit pouze vybrané jazyky"
+msgid "Edit Filters"
+msgstr "Editovat filtry"
+
msgid "Language:"
msgstr "Jazyk:"
-msgid "Script"
-msgstr "Skript"
-
msgid "Clear Output"
msgstr "Vymazat výstup"
@@ -2240,23 +2241,6 @@ msgid "Install from file"
msgstr "Instalovat ze souboru"
msgid ""
-"This will set up your project for custom Android builds by installing the "
-"source template to \"res://android/build\".\n"
-"You can then apply modifications and build your own custom APK on export "
-"(adding modules, changing the AndroidManifest.xml, etc.).\n"
-"Note that in order to make custom builds instead of using pre-built APKs, "
-"the \"Use Custom Build\" option should be enabled in the Android export "
-"preset."
-msgstr ""
-"Tato možnost připraví váš projekt na vaše vlastní sestavení pro Android "
-"instalací zdrojové šablony v \"res://android/build\".\n"
-"Poté můžete při exportu přidat úpravy a vytvořit si vlastní soubor APK "
-"(přidání modulů, změna souboru AndroidManifest.xml, atd.)\n"
-"Upozorňujeme, že pokud chcete vytvořit vlastní sestavení namísto použití "
-"připraveného souboru APK, měla by být v exportním profilu Androidu povolena "
-"možnost \"Použít vlastní sestavení\"."
-
-msgid ""
"The Android build template is already installed in this project and it won't "
"be overwritten.\n"
"Remove the \"res://android/build\" directory manually before attempting this "
@@ -2476,6 +2460,13 @@ msgstr "Zkratky"
msgid "Binding"
msgstr "Vazba"
+msgid ""
+"Hold %s to round to integers.\n"
+"Hold Shift for more precise changes."
+msgstr ""
+"Podržte %s pro zaokrouhlení na celá Äísla.\n"
+" Pro přesnější změny podržte Shift."
+
msgid "All Devices"
msgstr "Všechna zařízení"
@@ -2488,6 +2479,9 @@ msgstr "Ukládám soubor:"
msgid "No export template found at the expected path:"
msgstr "Na oÄekávané cestÄ› nebyly nalezeny žádné Å¡ablony exportu:"
+msgid "Could not open file to read from path \"%s\"."
+msgstr "Nelze otevřít soubor pro Ätení z cesty \"%s\"."
+
msgid "Packing"
msgstr "Balím"
@@ -3179,6 +3173,9 @@ msgstr "Mapování na základě jazyku:"
msgid "Locale"
msgstr "Jazyky"
+msgid "Set %s on %d nodes"
+msgstr "Nastavit %s na %d uzlech"
+
msgid "Select a single node to edit its signals and groups."
msgstr "Zvolte vybraný uzel pro editaci jeho signálů a skupin."
@@ -3286,6 +3283,9 @@ msgstr "Zvolte a přesuňte body. Nové uzly vytvořte pomocí RMB."
msgid "Enable snap and show grid."
msgstr "Aktivovat přichytávání a zobrazit mřížku."
+msgid "Blend:"
+msgstr "Prolínání:"
+
msgid "Point"
msgstr "Bod"
@@ -3328,15 +3328,9 @@ msgstr "Odstranit body a trojúhelníky."
msgid "Generate blend triangles automatically (instead of manually)"
msgstr "Vygenerovat blend trojúhelníky automaticky (ne manuálně)"
-msgid "Blend:"
-msgstr "Prolínání:"
-
msgid "Parameter Changed:"
msgstr "Změněný parametr:"
-msgid "Edit Filters"
-msgstr "Editovat filtry"
-
msgid "Output node can't be added to the blend tree."
msgstr "Výstupní uzly nemohou být přidané do blend stromu."
@@ -3452,9 +3446,6 @@ msgstr "PÅ™ehrát zvolenou animaci pozpátku ze souÄasné pozice. (A)"
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "Přehrát zvolenou animaci pozpátku od konce. (A)"
-msgid "Stop animation playback. (S)"
-msgstr "Zastavit přehrávání animace. (S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "PÅ™ehrát vybranou animaci od zaÄátku. (Shift+D)"
@@ -3575,6 +3566,9 @@ msgstr "Připojit uzly."
msgid "Remove selected node or transition."
msgstr "Odstranit vybraný uzel nebo přechod."
+msgid "Transition:"
+msgstr "Přechod:"
+
msgid "Play Mode:"
msgstr "Režim přehrávání:"
@@ -3821,6 +3815,9 @@ msgstr "Seskupené"
msgid "Add Node Here"
msgstr "Přidání uzlu sem"
+msgid "Scaling:"
+msgstr "Škálování:"
+
msgid ""
"Project Camera Override\n"
"Overrides the running project's camera with the editor viewport camera."
@@ -4289,6 +4286,9 @@ msgstr ""
"Při vzdáleném použití na zařízení je tato možnost efektivnější, když je "
"povolen síťový souborový systém."
+msgid " - Variation"
+msgstr " - Variace"
+
msgid "Convert to CPUParticles2D"
msgstr "Převést na CPUParticles2D"
@@ -4328,6 +4328,9 @@ msgstr "Povrchové body+Normály (orientované)"
msgid "Volume"
msgstr "Hlasitost"
+msgid "Emission Source:"
+msgstr "Zdroj emisí:"
+
msgid "Generate Visibility AABB"
msgstr "Generovat viditelnostní AABB"
@@ -4596,12 +4599,6 @@ msgstr "Změnit AABB Notifier"
msgid "Change Particles AABB"
msgstr "ZmÄ›nit Äástice AABB"
-msgid "Change Box Shape Extents"
-msgstr "Změnit rozsahy Box Shape"
-
-msgid "Change Probe Extents"
-msgstr "Změnit rozsahy Probe"
-
msgid "Change Capsule Shape Radius"
msgstr "Změnit poloměr Capsule Shape"
@@ -4644,6 +4641,9 @@ msgstr "KlíÄování je deaktivováno (není vložen žádný klíÄ)."
msgid "Animation Key Inserted."
msgstr "AnimaÄní klÃ­Ä vložen."
+msgid "Objects: %d\n"
+msgstr "Objekty: %d\n"
+
msgid "Top View."
msgstr "Pohled shora."
@@ -4677,6 +4677,9 @@ msgstr "OtoÄit"
msgid "Translate"
msgstr "Posunout"
+msgid "Translating:"
+msgstr "Posun:"
+
msgid "Rotating %s degrees."
msgstr "Rotuji %s stupňů."
@@ -4698,6 +4701,9 @@ msgstr "Rentgen pohled"
msgid "Display Unshaded"
msgstr "Bezestínový pohled"
+msgid "Normal Buffer"
+msgstr "Normální vyrovnávací paměť"
+
msgid "View Environment"
msgstr "Zobrazit prostředí"
@@ -5347,6 +5353,9 @@ msgstr "Standard"
msgid "Connections to method:"
msgstr "Připojení k metodě:"
+msgid "Source"
+msgstr "Zdroj"
+
msgid "Target"
msgstr "Cíl"
@@ -5525,6 +5534,15 @@ msgstr "Neplatná geometrie, nelze vytvořit light occluder."
msgid "Create LightOccluder2D Sibling"
msgstr "Vytvořit sourozence LightOccluder2D"
+msgid "Simplification:"
+msgstr "Zjednodušení:"
+
+msgid "Shrink (Pixels):"
+msgstr "Zmenšení (pixely):"
+
+msgid "Grow (Pixels):"
+msgstr "Zvětšení (pixely):"
+
msgid "Update Preview"
msgstr "Obnovit náhled"
@@ -5570,11 +5588,8 @@ msgstr "(prázdný)"
msgid "Animations:"
msgstr "Animace:"
-msgid "Speed:"
-msgstr "Rychlost:"
-
-msgid "Loop"
-msgstr "SmyÄka"
+msgid "Delete Animation"
+msgstr "Smazat animaci"
msgid "Animation Frames:"
msgstr "Snímky animace:"
@@ -5624,18 +5639,48 @@ msgstr "Automatický řez"
msgid "Step:"
msgstr "Krok:"
+msgid "1 color"
+msgid_plural "{num} colors"
+msgstr[0] "Barvy"
+msgstr[1] "Barev"
+msgstr[2] "Barvy"
+
msgid "No colors found."
msgstr "Nebyly nalezeny žádné barvy."
+msgid "1 constant"
+msgid_plural "{num} constants"
+msgstr[0] "Konstantní"
+msgstr[1] "Konstantních"
+msgstr[2] "Konstantní"
+
msgid "No constants found."
msgstr "Nebyly nalezeny žádné konstanty."
msgid "No fonts found."
msgstr "Nebyla nalezena žádná písma."
+msgid "1 font size"
+msgid_plural "{num} font sizes"
+msgstr[0] "Velikost písma"
+msgstr[1] "Velikost písem"
+msgstr[2] "Velikosti písma"
+
msgid "No icons found."
msgstr "Nebyly nalezeny žádné ikony."
+msgid "1 stylebox"
+msgid_plural "{num} styleboxes"
+msgstr[0] "Styl"
+msgstr[1] "Stylů"
+msgstr[2] "Styly"
+
+msgid "{num} currently selected"
+msgid_plural "{num} currently selected"
+msgstr[0] "právě vybráno {num}"
+msgstr[1] "právě vybráno {num}"
+msgstr[2] "právě vybráno {num}"
+
msgid "Nothing was selected for the import."
msgstr "Nic nebylo vybráno pro import."
@@ -5816,6 +5861,9 @@ msgstr "Převrátit horizontálně"
msgid "Flip Vertically"
msgstr "Převrátit vertikálně"
+msgid "Scattering:"
+msgstr "Rozptyl:"
+
msgid "Yes"
msgstr "Ano"
@@ -6528,6 +6576,61 @@ msgid "Can't open project at '%s'."
msgstr "Nelze otevřít projekt v '%s'."
msgid ""
+"The selected project \"%s\" does not specify its supported Godot version in "
+"its configuration file (\"project.godot\").\n"
+"\n"
+"Project path: %s\n"
+"\n"
+"If you proceed with opening it, it will be converted to Godot's current "
+"configuration file format.\n"
+"\n"
+"Warning: You won't be able to open the project with previous versions of the "
+"engine anymore."
+msgstr ""
+"KonfiguraÄní soubor projektu nespecifikuje verzi Godotu ve které byl "
+"vytvořen.\n"
+"\n"
+"Cesta projektu: %s\n"
+"\n"
+"Pokud se rozhodnete ho otevřít, tak bude převeden do aktuálního formátu "
+"konfiguraÄního souboru Godotu.\n"
+"Varování: Nebude možné otevřít projekt v dřívějších verzích enginu."
+
+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 ""
+"Následující konfiguraÄní soubor projektu byl vytvoÅ™en starší verzí enginu a "
+"potřebuje být konvertován pro aktuální verzi:\n"
+"\n"
+"Cesta k projektu: %s\n"
+"\n"
+"Přejete si ho konvertovat?\n"
+"Varování: Nebude možné otevřít projekt v dřívějších verzích enginu."
+
+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 ""
+"Nelze otevřít projekt „%s“ na následující cestě:\n"
+"\n"
+"%s\n"
+"\n"
+"Nastavení projektu byla vytvořena novější verzí enginu, jejíž nastavení není "
+"kompatibilní s touto verzí."
+
+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."
@@ -6625,9 +6728,6 @@ msgstr "Přidat vstupní akci"
msgid "Change Action deadzone"
msgstr "Změnit mrtvou zónu akce"
-msgid "Add Input Action Event"
-msgstr "Přidat událost vstupní akce"
-
msgid "Erase Input Action"
msgstr "Vymazat vstupní akce"
@@ -6643,6 +6743,9 @@ msgstr "Mapování vstupů"
msgid "Localization"
msgstr "Lokalizace"
+msgid "Autoload"
+msgstr "Automatické naÄítání"
+
msgid "Plugins"
msgstr "Pluginy"
@@ -6655,9 +6758,6 @@ msgstr "Vybrat vlastnost"
msgid "Select Virtual Method"
msgstr "Vybrat virtuální metodu"
-msgid "Select Method"
-msgstr "Vybrat metodu"
-
msgid "Batch Rename"
msgstr "Dávkové přejmenování"
@@ -6945,6 +7045,21 @@ msgstr "(Připojování z)"
msgid "Node configuration warning:"
msgstr "Varování konfigurace uzlu:"
+msgid "Node has one connection."
+msgid_plural "Node has {num} connections."
+msgstr[0] "Uzel má jedno připojení."
+msgstr[1] "Uzel má {num} připojení"
+msgstr[2] "Uzel má připojení"
+
+msgid "Node is in this group:"
+msgid_plural "Node is in the following groups:"
+msgstr[0] "Uzel je v této skupině:"
+msgstr[1] "Uzly je v těchto skupinách:"
+msgstr[2] "Uzel je ve skupinách"
+
+msgid "Click to show signals dock."
+msgstr "Kliknutím zobrazíte panel signálů."
+
msgid "Open Script:"
msgstr "Otevřít skript:"
@@ -7219,6 +7334,9 @@ msgstr "Velikost"
msgid "Network Profiler"
msgstr "Síťový profiler"
+msgid "Delete Property?"
+msgstr "Smazat vlastnost?"
+
msgid "A NavigationMesh resource must be set or created for this node to work."
msgstr ""
"Aby tento uzel mohl fungovat, musí mít nastaven nebo vytvořen zdroj "
@@ -7345,21 +7463,19 @@ msgstr "Neplatný veÅ™ejný klÃ­Ä pro rozšíření APK."
msgid "Invalid package name:"
msgstr "Neplatné jméno balíÄku:"
-msgid "\"Use Custom Build\" must be enabled to use the plugins."
-msgstr ""
-"Chcete-li používat doplňky, musí být povoleno \"použít vlastní build\"."
-
-msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled."
-msgstr ""
-"\"Export AAB\" je validní pouze v případě, že je povolena možnost \"Použít "
-"vlastní sestavu\"."
-
msgid "Signing release %s..."
msgstr "Podepisování vydání %s..."
msgid "Could not find keystore, unable to export."
msgstr "NepodaÅ™ilo se najít úložiÅ¡tÄ› klíÄů, nelze exportovat."
+msgid ""
+"output: \n"
+"%s"
+msgstr ""
+"Výstup:\n"
+"%s"
+
msgid "Verifying %s..."
msgstr "Ověřuji %s..."
@@ -7379,13 +7495,6 @@ msgid "Unsupported export format!"
msgstr "Nepodporovaný formát exportu!"
msgid ""
-"Trying to build from a custom built template, but no version info for it "
-"exists. Please reinstall from the 'Project' menu."
-msgstr ""
-"Pokus o sestavení z vlastní šablony, ale neexistují pro ni žádné informace o "
-"verzi. Přeinstalujte jej z nabídky \"Projekt\"."
-
-msgid ""
"Android build version mismatch: Template installed: %s, Godot version: %s. "
"Please reinstall Android build template from 'Project' menu."
msgstr ""
@@ -7422,7 +7531,7 @@ msgid "Creating APK..."
msgstr "Vytvářím APK..."
msgid "Could not find template APK to export: \"%s\"."
-msgstr "Nepodařilo se najít šablonu APK pro export: \"%s\""
+msgstr "Nepodařilo se najít šablonu APK pro export: \"%s\"."
msgid "Adding files..."
msgstr "Přidávám soubory..."
@@ -7604,6 +7713,17 @@ msgstr ""
"Této kosti chybí správná klidová póza. Přejděte na uzel Skeleton2D a "
"nastavte jej."
+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, "
+"CharacterBody3D, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon3D slouží pouze k poskytnutí tvaru kolize pro uzel odvozený "
+"od CollisionObject3D.\n"
+"Používejte jej pouze jako potomka Area3D, StaticBody3D, RigidBody3D, "
+"CharacterBody3D atd., abyste jim dali tvar."
+
msgid "Nothing is visible because no mesh has been assigned."
msgstr "Nic není zobrazeno, protože nebyla přiřazena žádná mřížka."
@@ -7612,6 +7732,9 @@ msgid ""
msgstr ""
"Nic není viditelné, protože mřížky nebyly přiřazeny do vykreslovací fronty."
+msgid "Generating Probe Volumes"
+msgstr "Generování objemů sondy"
+
msgid "This body will be ignored until you set a mesh."
msgstr "Toto těleso bude ignorováno, dokud nenastavíte model."
@@ -7655,6 +7778,13 @@ msgstr "Cesta k AnimationPlayer nevede k uzlu AnimationPlayer."
msgid "The AnimationPlayer root node is not a valid node."
msgstr "Kořenový uzel AnimationPlayer není platný uzel."
+msgid ""
+"Color: #%s\n"
+"LMB: Apply color"
+msgstr ""
+"Barva: #%s\n"
+"LMB: Nastavit barvu"
+
msgid "Pick a color from the editor window."
msgstr "Vyberte barvu z okna editoru."
@@ -7740,3 +7870,9 @@ msgstr "Přiřazeno uniformu."
msgid "Constants cannot be modified."
msgstr "Konstanty není možné upravovat."
+
+msgid "Invalid argument name."
+msgstr "Neplatný název argumentu."
+
+msgid "Invalid macro argument count."
+msgstr "Neplatný poÄet argumentů makra."
diff --git a/editor/translations/editor/de.po b/editor/translations/editor/de.po
index 98ce8d8250..8eb4586c54 100644
--- a/editor/translations/editor/de.po
+++ b/editor/translations/editor/de.po
@@ -54,7 +54,7 @@
# Jacqueline Ulken <Jacqueline.Ulken@protonmail.com>, 2020.
# Günther Bohn <ciscouser@gmx.de>, 2020, 2021.
# Tom Wor <mail@tomwor.com>, 2020.
-# Bjarne Hiller <bjarne.hiller@gmail.com>, 2020.
+# Bjarne Hiller <bjarne.hiller@gmail.com>, 2020, 2023.
# Dirk Federmann <weblategodot@dirkfedermann.de>, 2020.
# Helmut Hirtes <helmut.h@gmx.de>, 2020.
# Michal695 <michalek.jedrzejak@gmail.com>, 2020.
@@ -88,13 +88,16 @@
# Felix Bitsch <felix.a.bitsch@gmail.com>, 2022.
# miguel <miguel-gonzalez@gmx.de>, 2022.
# Least Significant Bite <leastsignificantbite@proton.me>, 2023.
+# HolonProduction <holonproduction@gmail.com>, 2023.
+# co1inco <colin.meihoefer@gmx.de>, 2023.
+# Jakob <js2k2@gmx.de>, 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-01-09 20:42+0000\n"
-"Last-Translator: So Wieso <sowieso@dukun.de>\n"
+"PO-Revision-Date: 2023-02-10 14:12+0000\n"
+"Last-Translator: Jakob <js2k2@gmx.de>\n"
"Language-Team: German <https://hosted.weblate.org/projects/godot-engine/"
"godot/de/>\n"
"Language: de\n"
@@ -102,20 +105,173 @@ 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.15.1-dev\n"
+"X-Generator: Weblate 4.16-dev\n"
+
+msgid "Unset"
+msgstr "Deaktiviert"
msgid "Physical"
msgstr "Physisch"
+msgid "Left Mouse Button"
+msgstr "Linke Maustaste"
+
+msgid "Right Mouse Button"
+msgstr "Rechte Maustaste"
+
+msgid "Middle Mouse Button"
+msgstr "Mittlere Maustaste"
+
+msgid "Mouse Wheel Up"
+msgstr "Mausrad hoch"
+
+msgid "Mouse Wheel Down"
+msgstr "Mausrad runter"
+
+msgid "Mouse Wheel Left"
+msgstr "Mausrad links"
+
+msgid "Mouse Wheel Right"
+msgstr "Mausrad rechts"
+
+msgid "Mouse Thumb Button 1"
+msgstr "Daumentaste 1"
+
+msgid "Mouse Thumb Button 2"
+msgstr "Daumentaste 2"
+
msgid "Button"
msgstr "Button"
+msgid "Double Click"
+msgstr "Doppelklick"
+
+msgid "Mouse motion at position (%s) with velocity (%s)"
+msgstr "Mausbewegung an Position (%s) mit Geschwindigkeit (%s)"
+
+msgid "Left Stick X-Axis, Joystick 0 X-Axis"
+msgstr "Linker Stick X-Achse, Joystick 0 X-Achse"
+
+msgid "Left Stick Y-Axis, Joystick 0 Y-Axis"
+msgstr "Linker Stick Y-Achse, Joystick 0 Y-Achse"
+
+msgid "Right Stick X-Axis, Joystick 1 X-Axis"
+msgstr "Rechter Stick X-Achse, Joystick 1 X-Achse"
+
+msgid "Right Stick Y-Axis, Joystick 1 Y-Axis"
+msgstr "Rechter Stick Y-Achse, Joystick 1 Y-Achse"
+
+msgid "Joystick 2 X-Axis, Left Trigger, Sony L2, Xbox LT"
+msgstr "Joystick 2 X-Achse, Linker Trigger, Sony L2, Xbox LT"
+
+msgid "Joystick 2 Y-Axis, Right Trigger, Sony R2, Xbox RT"
+msgstr "Joystick 2 Y-Achse, Rechter Trigger, Sony R2, Xbox RT"
+
+msgid "Joystick 3 X-Axis"
+msgstr "Joystick 3 X-Achse"
+
+msgid "Joystick 3 Y-Axis"
+msgstr "Joystick 3 Y-Achse"
+
+msgid "Joystick 4 X-Axis"
+msgstr "Joystick 4 X-Achse"
+
+msgid "Joystick 4 Y-Axis"
+msgstr "Joystick 4 Y-Achse"
+
+msgid "Unknown Joypad Axis"
+msgstr "Unbekannte Joypad Achse"
+
+msgid "Joypad Motion on Axis %d (%s) with Value %.2f"
+msgstr "Joypad Bewegung auf der Achse %d (%s) mit dem Wert %.2f"
+
+msgid "Bottom Action, Sony Cross, Xbox A, Nintendo B"
+msgstr "Untere Aktion, Sony Kreuz, Xbox A, Nintendo B"
+
+msgid "Right Action, Sony Circle, Xbox B, Nintendo A"
+msgstr "Rechte Aktion, Sony Kreis, Xbox B, Nintendo A"
+
+msgid "Left Action, Sony Square, Xbox X, Nintendo Y"
+msgstr "Linke Aktion, Sony Rechteck, Xbox X, Nintendo Y"
+
+msgid "Top Action, Sony Triangle, Xbox Y, Nintendo X"
+msgstr "Obere Aktion, Sony Dreieck, Xbox Y, Nintendo X"
+
+msgid "Back, Sony Select, Xbox Back, Nintendo -"
+msgstr "Zurück, Sony Select, Xbox Back, Nintendo -"
+
+msgid "Start, Nintendo +"
+msgstr "Start, Nintendo +"
+
+msgid "Left Stick, Sony L3, Xbox L/LS"
+msgstr "Linker Steuerknüppel, Sony L3, Xbox L/LS"
+
+msgid "Right Stick, Sony R3, Xbox R/RS"
+msgstr "Rechter Steuerknüppel, Sony R3, Xbox R/RS"
+
+msgid "Left Shoulder, Sony L1, Xbox LB"
+msgstr "Linke Schultertaste, Sony L1, Xbox LB"
+
+msgid "Right Shoulder, Sony R1, Xbox RB"
+msgstr "Rechte Schultertaste, Sony R1, Xbox RB"
+
+msgid "D-pad Up"
+msgstr "Steuerkreuz Oben"
+
+msgid "D-pad Down"
+msgstr "Steuerkreuz Unten"
+
+msgid "D-pad Left"
+msgstr "Steuerkreuz Links"
+
+msgid "D-pad Right"
+msgstr "Steuerkreuz Rechts"
+
+msgid "Xbox Share, PS5 Microphone, Nintendo Capture"
+msgstr "Xbox Teilen, PS5 Mikrofon, Nintendo Aufnehmen"
+
+msgid "PS4/5 Touchpad"
+msgstr "PS4/5 Touchpad"
+
+msgid "released"
+msgstr "veröffentlicht"
+
+msgid "Screen %s at (%s) with %s touch points"
+msgstr "Bildschirm %s bei (%s) mit %s Touch-Punkten"
+
+msgid ""
+"Screen dragged with %s touch points at position (%s) with velocity of (%s)"
+msgstr ""
+"Auf Bildschirm gezogen mit %s Touch-Punkten bei der Position (%s) mit einer "
+"Geschwindigkeit von (%s)"
+
+msgid "Magnify Gesture at (%s) with factor %s"
+msgstr "Vergrößerungsgeste bei (%s) mit Faktor %s"
+
+msgid "Pan Gesture at (%s) with delta (%s)"
+msgstr "Pan Geste bei (%s) mit delta (%s)"
+
+msgid "MIDI Input on Channel=%s Message=%s"
+msgstr "MIDI Eingabe auf Kannal=%s Nachricht=%s"
+
+msgid "Input Event with Shortcut=%s"
+msgstr "Eingabe Event mit Tastenkürzel=%s"
+
+msgid "Accept"
+msgstr "Annehmen"
+
msgid "Select"
msgstr "Auswählen"
msgid "Cancel"
msgstr "Abbrechen"
+msgid "Focus Next"
+msgstr "Nächster Fokus"
+
+msgid "Focus Prev"
+msgstr "Vorheriger Fokus"
+
msgid "Left"
msgstr "Links"
@@ -128,6 +284,12 @@ msgstr "Hoch"
msgid "Down"
msgstr "Runter"
+msgid "Page Up"
+msgstr "Bild Auf"
+
+msgid "Page Down"
+msgstr "Bild Ab"
+
msgid "End"
msgstr "Ende"
@@ -146,15 +308,30 @@ msgstr "Rückgängig machen"
msgid "Redo"
msgstr "Wiederherstellen"
+msgid "New Line"
+msgstr "Neue Zeile"
+
+msgid "New Blank Line"
+msgstr "Neue leere Zeile"
+
+msgid "New Line Above"
+msgstr "Neue Zeile oberhalb"
+
msgid "Indent"
msgstr "Einrücken"
+msgid "Dedent"
+msgstr "Ausrücken"
+
msgid "Delete"
msgstr "Löschen"
msgid "Select All"
msgstr "Alles auswählen"
+msgid "Select Word Under Caret"
+msgstr "Markiere Wort unter Cursor"
+
msgid "Duplicate Nodes"
msgstr "Nodes duplizieren"
@@ -207,6 +384,11 @@ msgstr "PiB"
msgid "EiB"
msgstr "EiB"
+msgid "%d item"
+msgid_plural "%d items"
+msgstr[0] "%d Element"
+msgstr[1] "%d Elemente"
+
msgid ""
"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'"
@@ -397,6 +579,14 @@ msgstr "Animationsinterpolationsmodus ändern"
msgid "Change Animation Loop Mode"
msgstr "Animationswiederholungsmodus ändern"
+msgid ""
+"Compressed tracks can't be edited or removed. Re-import the animation with "
+"compression disabled in order to edit."
+msgstr ""
+"Komprimierte Spuren können nicht bearbeitet oder entfernt werden. "
+"Importieren Sie die Animation erneut mit deaktivierter Kompression um das "
+"Bearbeiten zu ermöglichen."
+
msgid "Remove Anim Track"
msgstr "Spur entfernen"
@@ -667,6 +857,9 @@ msgstr "Durch Signal:"
msgid "Scene does not contain any script."
msgstr "Szene enthält kein einziges Skript."
+msgid "Select Method"
+msgstr "Methode auswählen"
+
msgid "Remove"
msgstr "Entfernen"
@@ -727,9 +920,6 @@ msgstr "Trennen"
msgid "Connect a Signal to a Method"
msgstr "Ein Signal mit einer Methode verbinden"
-msgid "Edit Connection:"
-msgstr "Verbindung bearbeiten:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr "Sollen wirklich alle Verbindungen des Signals „%s“ entfernt werden?"
@@ -875,23 +1065,8 @@ msgstr "Warnung:"
msgid "Error:"
msgstr "Fehler:"
-msgid "C++ Error"
-msgstr "C++-Fehler"
-
-msgid "C++ Error:"
-msgstr "C++-Fehler:"
-
-msgid "Source"
-msgstr "Quelle"
-
-msgid "C++ Source"
-msgstr "C++-Quellcode"
-
-msgid "Source:"
-msgstr "Quelle:"
-
-msgid "C++ Source:"
-msgstr "C++-Quellcode:"
+msgid "%s Error"
+msgstr "%s Fehler"
msgid "Stack Trace"
msgstr "Stacktrace"
@@ -902,6 +1077,9 @@ msgstr "Fehlermeldung kopieren"
msgid "Open C++ Source on GitHub"
msgstr "C++-Quelldatei auf GitHub aufrufen"
+msgid "C++ Source"
+msgstr "C++-Quellcode"
+
msgid "Video RAM"
msgstr "Video RAM"
@@ -1385,6 +1563,9 @@ msgstr "Navigation"
msgid "OpenGL"
msgstr "OpenGL"
+msgid "Vulkan"
+msgstr "Vulkan"
+
msgid "Nodes and Classes:"
msgstr "Nodes und Klassen:"
@@ -1395,7 +1576,7 @@ msgid "Error saving profile to path: '%s'."
msgstr "Fehler beim Speichern des Profils im Pfad: ‚%s‘."
msgid "New"
-msgstr "Erstelle"
+msgstr "Neu"
msgid "Save"
msgstr "Speichern"
@@ -1742,6 +1923,9 @@ msgstr "Ãœberschreibt %s:"
msgid "default:"
msgstr "Standard:"
+msgid "Operators"
+msgstr "Operatoren"
+
msgid "Theme Properties"
msgstr "Theme-Eigenschaften"
@@ -1882,12 +2066,12 @@ msgstr "Alle Sprachen anzeigen"
msgid "Show Selected Locales Only"
msgstr "Nur ausgewählte Sprachen anzeigen"
+msgid "Edit Filters"
+msgstr "Filter bearbeiten"
+
msgid "Language:"
msgstr "Sprache:"
-msgid "Script"
-msgstr "Skript"
-
msgid "Variant"
msgstr "Variante"
@@ -2455,23 +2639,6 @@ msgid "Install from file"
msgstr "Aus Datei installieren"
msgid ""
-"This will set up your project for custom Android builds by installing the "
-"source template to \"res://android/build\".\n"
-"You can then apply modifications and build your own custom APK on export "
-"(adding modules, changing the AndroidManifest.xml, etc.).\n"
-"Note that in order to make custom builds instead of using pre-built APKs, "
-"the \"Use Custom Build\" option should be enabled in the Android export "
-"preset."
-msgstr ""
-"Hiermit wird der Projektordner für beliebige Android-Builds eingerichtet in "
-"dem das Quell-Template nach „res://android/build“ installiert wird.\n"
-"Danach können eigene Modifikationen vorgenommen und ein eigens APK "
-"exportiert werden (Module hinzufügen, AndroidManifest.xml ändern, usw.).\n"
-"Achtung: Um eigene Builds, statt den vorgefertigten zu generieren, muss die "
-"„Use Custom Build“-Option in den Android-Export-Voreinstellungen aktiviert "
-"sein."
-
-msgid ""
"The Android build template is already installed in this project and it won't "
"be overwritten.\n"
"Remove the \"res://android/build\" directory manually before attempting this "
@@ -2698,9 +2865,6 @@ msgstr "Tastenkürzel"
msgid "Binding"
msgstr "Zuordnung"
-msgid "%s Error"
-msgstr "%s Fehler"
-
msgid "All Devices"
msgstr "Alle Geräte"
@@ -3103,6 +3267,22 @@ msgstr "Verwalte Exportvorlagen"
msgid "Export With Debug"
msgstr "Exportiere mit Debuginformationen"
+msgid "Path to FBX2glTF executable is empty."
+msgstr "Dateipfad zur ausführbaren Datei von FBX2glTF ist leer."
+
+msgid "Error executing this file (wrong version or architecture)."
+msgstr "Fehler beim Ausführen dieser Datei (falsche Version oder Architektur)."
+
+msgid ""
+"FBX2glTF is required for importing FBX files.\n"
+"Please download it and provide a valid path to the binary:"
+msgstr ""
+"FBX2glTF wird benötigt um FBX Dateien zu importieren.\n"
+"Bitte laden Sie es herunter und geben Sie den Pfad zur ausführbaren Datei an:"
+
+msgid "Click this link to download FBX2glTF"
+msgstr "Klicken Sie diesen Link an um FBX2glTF herunterzuladen"
+
msgid "Browse"
msgstr "Durchsuchen"
@@ -3331,6 +3511,13 @@ msgstr "Neuimport"
msgid "Offset:"
msgstr "Versatz:"
+msgid ""
+"Warning: Multiple configurations have identical settings. Duplicates will be "
+"ignored."
+msgstr ""
+"Warnung: Mehrere Konfigurationen haben identische Einstellungen. Duplikate "
+"werden ignoriert."
+
msgid "Importing Scene..."
msgstr "Szene wird importiert..."
@@ -3641,6 +3828,9 @@ msgstr "Punkte auswählen und verschieben, erstellen mit RMT."
msgid "Enable snap and show grid."
msgstr "Schnapp- und Anzeigeraster aktivieren."
+msgid "Blend:"
+msgstr "Blende:"
+
msgid "Point"
msgstr "Punkt"
@@ -3683,15 +3873,9 @@ msgstr "Punkte und Dreiecke löschen."
msgid "Generate blend triangles automatically (instead of manually)"
msgstr "Vermischungsdreiecke automatisch erstellen (statt manuell)"
-msgid "Blend:"
-msgstr "Blende:"
-
msgid "Parameter Changed:"
msgstr "Parameter geändert:"
-msgid "Edit Filters"
-msgstr "Filter bearbeiten"
-
msgid "Output node can't be added to the blend tree."
msgstr "Ausgabe-Node kann nicht zum Mischungsbaum hinzugefügt werden."
@@ -3814,9 +3998,6 @@ msgstr "Spiele ausgewählte Animation rückwärts von aktueller Position. (A)"
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "Spiele ausgewählte Animation rückwärts vom Ende. (Umschalt+A)"
-msgid "Stop animation playback. (S)"
-msgstr "Stoppe Animations-Wiedergabe. (S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "Spiele ausgewählte Animation vom Start. (Umschalt+D)"
@@ -4494,6 +4675,21 @@ msgstr "Standardtyp ändern"
msgid "Set Handle"
msgstr "Wähle Griff"
+msgid "This node is a child of a container."
+msgstr "Dieses Node ist Kind eines Containers."
+
+msgid "Use container properties for positioning."
+msgstr "Benutze Containereigenschaften zur Positionierung."
+
+msgid "Use anchors and the rectangle for positioning."
+msgstr "Benutze Anker und das Rechteck zur Positionierung."
+
+msgid "Collapse positioning hint."
+msgstr "Hinweis für Positionierung einklappen."
+
+msgid "Expand positioning hint."
+msgstr "Hinweis für Positionierung ausklappen."
+
msgid "Fill"
msgstr "Füllung"
@@ -4716,6 +4912,15 @@ msgstr ""
"Sollte dies beim Abspielen auf externen Geräten genutzt werden, ist es am "
"effizientesten, das Netzwerk-Dateisystem zu aktivieren."
+msgid "Run Multiple Instances"
+msgstr "Mehrere Instanzen ausführen"
+
+msgid " - Variation"
+msgstr " - Variation"
+
+msgid "Unable to preview font"
+msgstr "Vorschau für Schriftart nicht verfügbar"
+
msgid "Convert to CPUParticles2D"
msgstr "Zu CPUParticles2D konvertieren"
@@ -4761,9 +4966,15 @@ msgstr "Emissionsquelle:"
msgid "Generate Visibility AABB"
msgstr "Erzeuge Sichtbarkeits-AABB"
+msgid "Select path for SDF Texture"
+msgstr "Wähle Pfad für SDF Textur"
+
msgid "Gradient Edited"
msgstr "Gradient bearbeitet"
+msgid "Reverse/mirror gradient."
+msgstr "Gradient spiegeln/umkehren."
+
msgid "Swap GradientTexture2D Fill Points"
msgstr "GrandientTexture2D Füllpunkte vertauschen"
@@ -5058,12 +5269,6 @@ msgstr "Benachrichtigendes AABB ändern"
msgid "Change Particles AABB"
msgstr "Ändere Partikel AABB"
-msgid "Change Box Shape Extents"
-msgstr "Kastenformausmaße ändern"
-
-msgid "Change Probe Extents"
-msgstr "Sondenausmaße ändern"
-
msgid "Change Capsule Shape Radius"
msgstr "Kapselfromradius ändern"
@@ -5142,6 +5347,12 @@ msgstr "Schlüsselbildeinfügen ist deaktiviert (kein Schlüsselbild eingefügt)
msgid "Animation Key Inserted."
msgstr "Animationsschlüsselbild eingefügt."
+msgid "Size: %s (%.1fMP)\n"
+msgstr "Größe: %s (%.1fMP)\n"
+
+msgid "Objects: %d\n"
+msgstr "Objekte: %d\n"
+
msgid "Top View."
msgstr "Sicht von oben."
@@ -5250,6 +5461,15 @@ msgstr "Freisicht Geschwindigkeitsregler"
msgid "Freelook Slow Modifier"
msgstr "Freisicht Trägheitsregler"
+msgid "Lock Transformation to X axis"
+msgstr "Sperre Transformation auf X-Achse"
+
+msgid "Lock Transformation to Y axis"
+msgstr "Sperre Transformation auf Y-Achse"
+
+msgid "Lock Transformation to Z axis"
+msgstr "Sperre Transformation auf Z-Achse"
+
msgid "Toggle Camera Preview"
msgstr "Kameravorschau umschalten"
@@ -5890,6 +6110,9 @@ msgstr "Standard"
msgid "Connections to method:"
msgstr "Verbindungen mit Methode:"
+msgid "Source"
+msgstr "Quelle"
+
msgid "Target"
msgstr "Ziel"
@@ -6138,12 +6361,6 @@ msgstr "(leer)"
msgid "Animations:"
msgstr "Animationen:"
-msgid "Speed:"
-msgstr "Geschwindigkeit:"
-
-msgid "Loop"
-msgstr "Wiederholung"
-
msgid "Animation Frames:"
msgstr "Animationsbilder:"
@@ -7580,9 +7797,6 @@ msgstr "Füge Eingabeaktion hinzu"
msgid "Change Action deadzone"
msgstr "Nullschwelle der Aktion ändern"
-msgid "Add Input Action Event"
-msgstr "Eingabeaktionsereignis hinzufügen"
-
msgid "Erase Input Action"
msgstr "Eingabeaktion löschen"
@@ -7610,9 +7824,6 @@ msgstr "Eigenschaft auswählen"
msgid "Select Virtual Method"
msgstr "Virtuelle Methode auswählen"
-msgid "Select Method"
-msgstr "Methode auswählen"
-
msgid "Batch Rename"
msgstr "Stapelweise Umbenennung"
@@ -8414,23 +8625,10 @@ msgstr "Ungültiger öffentlicher Schlüssel für APK-Erweiterung."
msgid "Invalid package name:"
msgstr "Ungültiger Paketname:"
-msgid "\"Use Custom Build\" must be enabled to use the plugins."
-msgstr ""
-"„Use Custom Build“ muss aktiviert werden um die Plugins nutzen zu können."
-
msgid "\"Passthrough\" is only valid when \"XR Mode\" is \"OpenXR\"."
msgstr ""
"„Passthrough“ ist nur gültig wenn „XR Mode“ als „OpenXR“ gesetzt wurde."
-msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled."
-msgstr "„Export AAB“ ist nur gültig wenn „Use Custom Build“ aktiviert ist."
-
-msgid ""
-"\"Min SDK\" can only be overridden when \"Use Custom Build\" is enabled."
-msgstr ""
-"Das „Min SDK“ zu überschreiben ist nur möglich wenn „Use Custom Build“ "
-"aktiviert ist."
-
msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid."
msgstr ""
"„Min SDK“ sollte eine gültige Ganzzahl sein, war aber „%s“, was ungültig ist."
@@ -8443,12 +8641,6 @@ msgstr ""
"Bibliothek benötigt."
msgid ""
-"\"Target SDK\" can only be overridden when \"Use Custom Build\" is enabled."
-msgstr ""
-"„Target SDK“ kann nur überschrieben werden wenn „Use Custom Build“ aktiviert "
-"ist."
-
-msgid ""
"\"Target SDK\" should be a valid integer, but got \"%s\" which is invalid."
msgstr ""
"„Taret SDK“ sollte eine gültige Ganzzahl sein, war aber „%s“, was ungültig "
@@ -8516,14 +8708,6 @@ msgid "Unsupported export format!"
msgstr "Nicht unterstütztes Exportformat!"
msgid ""
-"Trying to build from a custom built template, but no version info for it "
-"exists. Please reinstall from the 'Project' menu."
-msgstr ""
-"Es wurde versucht aus einer eigener Build-Vorlage zu bauen aber es "
-"existieren keine Versionsinformation für sie. Neuinstallation im ‚Projekt‘-"
-"Menü benötigt."
-
-msgid ""
"Android build version mismatch: Template installed: %s, Godot version: %s. "
"Please reinstall Android build template from 'Project' menu."
msgstr ""
@@ -9226,6 +9410,13 @@ msgstr ""
"als „Ignore“ festgelegt wurde. Zum Beheben muss der Mausfilter als „Stop“ "
"oder „Pass“ festgelegt werden."
+msgid ""
+"Changing the Z index of a control only affects the drawing order, not the "
+"input event handling order."
+msgstr ""
+"Änderungen des Z-Index beeinflussen nur die Reihenfolge der Darstellung, "
+"nicht die Reihenfolge der Eingabeverarbeitung."
+
msgid "Theme Overrides"
msgstr "Themen-Ãœberschreibungen"
@@ -9235,12 +9426,31 @@ msgstr "Warnung!"
msgid "Please Confirm..."
msgstr "Bitte bestätigen..."
+msgid "You don't have permission to access contents of this folder."
+msgstr "Keine Berechtigung um auf den Inhalt des Ordners zuzugreifen."
+
msgid "Must use a valid extension."
msgstr "Eine gültige Datei-Endung muss verwendet werden."
msgid "Enable grid minimap."
msgstr "Gitterübersichtskarte aktivieren."
+msgid ""
+"The current font does not support rendering one or more characters used in "
+"this Label's text."
+msgstr ""
+"Die aktuelle Schriftart unterstützt mindestens ein Zeichen nicht, welches im "
+"Text des Labels verwendet wird."
+
+msgid "Right-to-Left"
+msgstr "Rechts-nach-Links"
+
+msgid "Left-to-Right Mark (LRM)"
+msgstr "Links-nach-Rechts Markierung (LRM)"
+
+msgid "Right-to-Left Mark (RLM)"
+msgstr "Rechts-nach-Links Markierung (RLM)"
+
msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0."
msgstr "Wenn „Exp Edit“ aktiviert ist muss „Min Value“ größer als null sein."
@@ -9308,6 +9518,45 @@ msgstr "Wiederholen"
msgid "Invalid comparison function for that type."
msgstr "Ungültige Vergleichsfunktion für diesen Typ."
+msgid ""
+"Argument %d of function '%s' can only take a local variable, array, or "
+"member."
+msgstr ""
+"Argument %d der Funktion '%s' kann nur eine lokale Variable, Array oder "
+"member annehmen."
+
+msgid "Built-in function \"%s(%s)\" is only supported on high-end platforms."
+msgstr ""
+"Integrierte Funktion \"%s(%s)\" wird nur auf High-End Plattformen "
+"unterstützt."
+
+msgid "Recursion is not allowed."
+msgstr "Rekursion ist nicht erlaubt."
+
+msgid "Function '%s' can't be called from source code."
+msgstr "Funktion '%s' kann nicht aus dem Quelltext aufgerufen werden."
+
+msgid ""
+"Invalid argument for \"%s(%s)\" function: argument %d should be %s but is %s."
+msgstr ""
+"Ungültiges Argument für Funktion \"%s(%s)\": Argument %d sollte %s sein aber "
+"ist %s."
+
+msgid ""
+"Too few arguments for \"%s(%s)\" call. Expected at least %d but received %d."
+msgstr ""
+"Zu wenige Argumente für den Aufruf von \"%s(%s)\". Erwarte mindestens %d, "
+"nur %d übergeben."
+
+msgid ""
+"Too many arguments for \"%s(%s)\" call. Expected at most %d but received %d."
+msgstr ""
+"Zu viele Argumente für Aufruf von \"%s(%s)\". Erwarte maximal %d aber es "
+"wurden %d übergeben."
+
+msgid "Expected ',' or ')' after argument."
+msgstr "Erwarte ',' oder ')' nach Argument."
+
msgid "Varying may not be assigned in the '%s' function."
msgstr "Varyings dürfen nicht in Funktion ‚%s‘ zugewiesen werden."
@@ -9319,3 +9568,60 @@ msgstr "Zuweisung an Uniform."
msgid "Constants cannot be modified."
msgstr "Konstanten können nicht verändert werden."
+
+msgid "An object of type '%s' can't be indexed."
+msgstr "Ein Objekt des Typs '%s' kann nicht Indexiert werden."
+
+msgid ""
+"Global non-constant variables are not supported. Expected '%s' keyword "
+"before constant definition."
+msgstr ""
+"Globale nicht-konstante Variablen werden nicht unterstützt. Erwarte '%s' "
+"Schlüsselwort vor der Definition einer Konstanten."
+
+msgid "Expected at least one '%s' statement in a non-void function."
+msgstr "Erwartete mindestens eine '%s' Anweisung in einer nicht-void Funktion."
+
+msgid "Unmatched endif."
+msgstr "Unvollständiges endif."
+
+msgid ""
+"Shader include load failed. Does the shader include exist? Is there a cyclic "
+"dependency?"
+msgstr ""
+"Laden des Shader include fehlgeschlagen. Existiert der include des Shaders? "
+"Gibt es eine zyklische Abhängigkeit?"
+
+msgid "Cyclic include found."
+msgstr "Zyklisches include erkannt."
+
+msgid ""
+"Direct floating-point comparison (this may not evaluate to `true` as you "
+"expect). Instead, use `abs(a - b) < 0.0001` for an approximate but "
+"predictable comparison."
+msgstr ""
+"Direkter Vergleich von Gleitkommazahlen (dies muss entgegen der Vermutung "
+"nicht `true` ergeben). Nutzen Sie stattdessen `abs(a - b) < 0.0001` für "
+"einen ungefähren, aber vorhersehbaren Vergleich."
+
+msgid "The const '%s' is declared but never used."
+msgstr "Die Konstante '%s' wurde deklariert, aber nie verwendet."
+
+msgid "The function '%s' is declared but never used."
+msgstr "Die Funktion '%s' wurde deklariert, aber nie verwendet."
+
+msgid "The uniform '%s' is declared but never used."
+msgstr "Das Uniform '%s' wurde deklariert, aber nie verwendet."
+
+msgid "The varying '%s' is declared but never used."
+msgstr "Das Varying '%s' wurde deklariert, aber nie verwendet."
+
+msgid "The local variable '%s' is declared but never used."
+msgstr "Die lokale Variable '%s' wurde deklariert, aber nie verwendet."
+
+msgid ""
+"The total size of the %s for this shader on this device has been exceeded "
+"(%d/%d). The shader may not work correctly."
+msgstr ""
+"Die Gesamtgröße der %s für diesen Shader auf diesem Gerät wurde "
+"überschritten (%d/%d). Der Shader funktioniert eventuell nicht korrekt."
diff --git a/editor/translations/editor/el.po b/editor/translations/editor/el.po
index 5fcf5140d9..54c7561f36 100644
--- a/editor/translations/editor/el.po
+++ b/editor/translations/editor/el.po
@@ -19,13 +19,14 @@
# Anthony V. <batmanplayer123@gmail.com>, 2022.
# Anthony V. <anthonyv156@outlook.com>, 2022.
# Ilias Vasilakis <vaselas99@gmail.com>, 2023.
+# "Overloaded @ Orama Interactive" <manoschool@yahoo.gr>, 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-01-15 13:34+0000\n"
-"Last-Translator: Ilias Vasilakis <vaselas99@gmail.com>\n"
+"PO-Revision-Date: 2023-02-08 18:01+0000\n"
+"Last-Translator: \"Overloaded @ Orama Interactive\" <manoschool@yahoo.gr>\n"
"Language-Team: Greek <https://hosted.weblate.org/projects/godot-engine/godot/"
"el/>\n"
"Language: el\n"
@@ -33,11 +34,96 @@ 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.15.1-dev\n"
+"X-Generator: Weblate 4.16-dev\n"
+
+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 "Mouse Wheel Left"
+msgstr "Ροδέλα Ï€Î¿Î½Ï„Î¹ÎºÎ¹Î¿Ï Î±ÏιστεÏά"
+
+msgid "Mouse Wheel Right"
+msgstr "Ροδέλα Ï€Î¿Î½Ï„Î¹ÎºÎ¹Î¿Ï Î´ÎµÎ¾Î¹Î¬"
+
+msgid "Mouse Thumb Button 1"
+msgstr "Κουμπί Ï€Î¿Î½Ï„Î¹ÎºÎ¹Î¿Ï Î±Î½Ï„Î¯Ï‡ÎµÎ¹Ïα 1"
+
+msgid "Mouse Thumb Button 2"
+msgstr "Κουμπί Ï€Î¿Î½Ï„Î¹ÎºÎ¹Î¿Ï Î±Î½Ï„Î¯Ï‡ÎµÎ¹Ïα 2"
msgid "Button"
msgstr "Κουμπί"
+msgid "Mouse motion at position (%s) with velocity (%s)"
+msgstr "Κίνηση Ï€Î¿Î½Ï„Î¹ÎºÎ¹Î¿Ï ÏƒÏ„Î· θέση (%s) με ταχÏτητα (%s)"
+
+msgid "Unknown Joypad Axis"
+msgstr "Άγνωστος άξονας χειÏιστηÏίου"
+
+msgid "Joypad Motion on Axis %d (%s) with Value %.2f"
+msgstr "Κίνηση χειÏιστηÏίου στον άξονα %d (%s) με τιμή %.2f"
+
+msgid "Bottom Action, Sony Cross, Xbox A, Nintendo B"
+msgstr "Κάτω πλήκτÏο, Sony σταυÏός, Xbox A, Nintendo B"
+
+msgid "Right Action, Sony Circle, Xbox B, Nintendo A"
+msgstr "Δεξί πλήκτÏο, Sony κÏκλος, Xbox B, Nintendo A"
+
+msgid "Left Action, Sony Square, Xbox X, Nintendo Y"
+msgstr "ΑÏιστεÏÏŒ πλήκτÏο, Sony τετÏάγωνο, Xbox X, Nintendo Y"
+
+msgid "Top Action, Sony Triangle, Xbox Y, Nintendo X"
+msgstr "Πάνω πλήκτÏο, Sony Ï„Ïίγωνο, Xbox Y, Nintendo X"
+
+msgid "Back, Sony Select, Xbox Back, Nintendo -"
+msgstr "Πίσω, Sony Select, Xbox Back, Nintendo -"
+
+msgid "D-pad Up"
+msgstr "D-pad πάνω"
+
+msgid "D-pad Down"
+msgstr "D-pad κάτω"
+
+msgid "D-pad Left"
+msgstr "D-pad αÏιστεÏά"
+
+msgid "D-pad Right"
+msgstr "D-pad δεξιά"
+
+msgid "Xbox Share, PS5 Microphone, Nintendo Capture"
+msgstr "Xbox Share, PS5 μικÏόφωνο, Nintendo Capture"
+
+msgid "PS4/5 Touchpad"
+msgstr "PS4/5 επιφάνεια αφής"
+
+msgid "touched"
+msgstr "ακουμπήθηκε"
+
+msgid "released"
+msgstr "αφέθηκε"
+
+msgid "Screen %s at (%s) with %s touch points"
+msgstr "Η οθόνη %s στη θέση (%s) με %s σημεία αφής"
+
+msgid ""
+"Screen dragged with %s touch points at position (%s) with velocity of (%s)"
+msgstr "Η οθόνη σÏÏθηκε με %s σημεία αφής στη θέση (%s) με ταχÏτητα (%s)"
+
msgid "Select"
msgstr "Επιλογή"
@@ -523,6 +609,9 @@ msgstr "Από Σήμα:"
msgid "Scene does not contain any script."
msgstr "Η σκηνή δεν πεÏιέχει δέσμη ενεÏγειών."
+msgid "Select Method"
+msgstr "Επιλογή μεθόδου"
+
msgid "Remove"
msgstr "ΑφαίÏεση"
@@ -580,9 +669,6 @@ msgstr "ΑποσÏνδεση"
msgid "Connect a Signal to a Method"
msgstr "ΣÏνδεση Σήματος σε Μέθοδο"
-msgid "Edit Connection:"
-msgstr "ΕπεξεÏγασία ΣÏνδεσης:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
"Είστε βέβαιοι πως θέλετε να καταÏγήσετε όλες τις συνδέσεις από το σήμα «%s»;"
@@ -704,30 +790,15 @@ msgstr "ΠÏοειδοποίηση:"
msgid "Error:"
msgstr "Σφάλμα:"
-msgid "C++ Error"
-msgstr "Σφάλμα C++"
-
-msgid "C++ Error:"
-msgstr "Σφάλμα C++:"
-
-msgid "Source"
-msgstr "Πηγή"
-
-msgid "C++ Source"
-msgstr "Πηγή C++"
-
-msgid "Source:"
-msgstr "Πηγή:"
-
-msgid "C++ Source:"
-msgstr "Πηγή C++:"
-
msgid "Stack Trace"
msgstr "Ίχνος ΣωÏός"
msgid "Copy Error"
msgstr "ΑντιγÏαφή σφάλματος"
+msgid "C++ Source"
+msgstr "Πηγή C++"
+
msgid "Video RAM"
msgstr "Βίντεο RAM"
@@ -1535,12 +1606,12 @@ msgstr "Εμφάνιση Όλων των Τοπικών Ρυθμίσεων"
msgid "Show Selected Locales Only"
msgstr "Εμφάνιση Μόνο Επιλεγμένων Τοπικών Ρυθμίσεων"
+msgid "Edit Filters"
+msgstr "ΕπεξεÏγασία φίλτÏων"
+
msgid "Language:"
msgstr "Γλώσσα:"
-msgid "Script"
-msgstr "ΓÏαφή"
-
msgid "Clear Output"
msgstr "ΕκκαθάÏιση εξόδου"
@@ -2026,24 +2097,6 @@ msgid "Manage Templates"
msgstr "ΔιαχείÏιση ΠÏοτÏπων"
msgid ""
-"This will set up your project for custom Android builds by installing the "
-"source template to \"res://android/build\".\n"
-"You can then apply modifications and build your own custom APK on export "
-"(adding modules, changing the AndroidManifest.xml, etc.).\n"
-"Note that in order to make custom builds instead of using pre-built APKs, "
-"the \"Use Custom Build\" option should be enabled in the Android export "
-"preset."
-msgstr ""
-"Αυτό θα ετοιμάσει το έÏγο σας για Ï€ÏοσαÏμοσμένες δομήσεις Android "
-"εγκαθιστώντας το Ï€Ïότυπο πηγών στο «res://android/build».\n"
-"ΜποÏείτε μετά να κάνετε αλλαγές και να δομήσετε το δικό σας Ï€ÏοσαÏμοσμένο "
-"APK στην εξαγωγή (Ï€Ïοσθέτοντας λειτουÏγικές μονάδες - modules, αλλάζοντας το "
-"AndroidManifest.xml, κλπ.).\n"
-"Σημειώστε πως για να γίνουν Ï€ÏοσαÏμοσμένες δομήσεις αντί της χÏήσεις των "
-"έτοιμων APK, η επιλογή «Use Custom Build» Ï€Ïέπει να ενεÏγοποιηθεί στο "
-"Ï€Ïότυπο εξαγωγής για Android."
-
-msgid ""
"The Android build template is already installed in this project and it won't "
"be overwritten.\n"
"Remove the \"res://android/build\" directory manually before attempting this "
@@ -2885,6 +2938,9 @@ msgstr "Επιλογή και μετακίνηση σημείων, δημιουÏ
msgid "Enable snap and show grid."
msgstr "ΕνεÏγοποίηση κουμπώματος και εμφάνιση πλέγματος."
+msgid "Blend:"
+msgstr "Ανάμειξη:"
+
msgid "Point"
msgstr "Σημείο"
@@ -2927,12 +2983,6 @@ msgstr "ΔιαγÏαφή σημείων και Ï„Ïιγώνων."
msgid "Generate blend triangles automatically (instead of manually)"
msgstr "ΔημιουÏγία Ï„Ïιγώνων μίξης αυτόματα (αντι για χειÏοκινητα)"
-msgid "Blend:"
-msgstr "Ανάμειξη:"
-
-msgid "Edit Filters"
-msgstr "ΕπεξεÏγασία φίλτÏων"
-
msgid "Output node can't be added to the blend tree."
msgstr "Ο κόμβος εξόδου δεν μποÏεί να Ï€Ïοστεθεί στο δέντÏο μίξης."
@@ -3054,9 +3104,6 @@ msgstr "ΑναπαÏαγωγή της επιλεγμένης κίνησης αν
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "ΑναπαÏαγωγή της επιλεγμένης κίνησης ανάποδα από το τέλος. (Shift + A)"
-msgid "Stop animation playback. (S)"
-msgstr "Πάυση αναπαÏγωγής κίνησης. (S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "ΑναπαÏαγωγή της επιλεγμένης κίνησης από την αÏχή. (Shift + D)"
@@ -4083,12 +4130,6 @@ msgstr "Ειδοποιητής Αλλαγής AABB"
msgid "Change Particles AABB"
msgstr "Αλλαγή AABB σωματιδίων"
-msgid "Change Box Shape Extents"
-msgstr "Αλλαγή διαστάσεων ÎºÏ…Î²Î¹ÎºÎ¿Ï ÏƒÏ‡Î®Î¼Î±Ï„Î¿Ï‚"
-
-msgid "Change Probe Extents"
-msgstr "Αλλαγή διαστάσεων αισθητήÏα"
-
msgid "Change Capsule Shape Radius"
msgstr "Αλλαγή ακτίνας κάψουλας"
@@ -4806,6 +4847,9 @@ msgstr "Τυπική"
msgid "Connections to method:"
msgstr "ΣÏνδεση σε μέθοδο:"
+msgid "Source"
+msgstr "Πηγή"
+
msgid "Target"
msgstr "Στόχος"
@@ -5031,12 +5075,6 @@ msgstr "(άδειο)"
msgid "Animations:"
msgstr "Κινήσεις:"
-msgid "Speed:"
-msgstr "ΤαχÏτητα:"
-
-msgid "Loop"
-msgstr "Επανάληψη"
-
msgid "Animation Frames:"
msgstr "ΚαÏέ Κίνησης:"
@@ -6037,9 +6075,6 @@ msgstr "ΠÏοσθήκη ΕνέÏγειας Εισόδου"
msgid "Change Action deadzone"
msgstr "Αλλαγή ÎεκÏής Ζώνης ΕνέÏγειας"
-msgid "Add Input Action Event"
-msgstr "ΠÏοσθήκη συμβάντος εισόδου"
-
msgid "Erase Input Action"
msgstr "ΔιαγÏαφή ενέÏγειας εισόδου"
@@ -6064,9 +6099,6 @@ msgstr "Επιλογή ιδιότητας"
msgid "Select Virtual Method"
msgstr "Επιλογή εικονικής μεθόδου"
-msgid "Select Method"
-msgstr "Επιλογή μεθόδου"
-
msgid "Batch Rename"
msgstr "Ομαδική Μετονομασία"
@@ -6709,10 +6741,6 @@ msgstr "Μη έγκυÏο δημόσιο κλειδί (public key) για επέ
msgid "Invalid package name:"
msgstr "ΆκυÏο όνομα πακέτου:"
-msgid "\"Use Custom Build\" must be enabled to use the plugins."
-msgstr ""
-"Η επιλογή «Use Custom Build» Ï€Ïέπει να ενεÏγοποιηθεί για χÏήση Ï€Ïοσθέτων."
-
msgid "Signing release %s..."
msgstr "ΥπογÏαφή έκδοσης %s..."
@@ -6723,13 +6751,6 @@ msgstr ""
msgid "Unsupported export format!"
msgstr "Μη αποδεκτή μοÏφή εξαγωγής!"
-msgid ""
-"Trying to build from a custom built template, but no version info for it "
-"exists. Please reinstall from the 'Project' menu."
-msgstr ""
-"Δοκιμή δόμησης από Ï€ÏοσαÏμοσμένο Ï€Ïότυπο δόμησης, αλλά δεν υπάÏχουν "
-"πληÏοφοÏίες έκδοσης. ΠαÏακαλοÏμε κάντε επανεγκατάσταση από το Î¼ÎµÎ½Î¿Ï Â«ÎˆÏγο»."
-
msgid "Building Android Project (gradle)"
msgstr "Δόμηση ΈÏγου Android (gradle)"
diff --git a/editor/translations/editor/eo.po b/editor/translations/editor/eo.po
index fc32c8b9dc..bfdce7d034 100644
--- a/editor/translations/editor/eo.po
+++ b/editor/translations/editor/eo.po
@@ -15,19 +15,20 @@
# Manuel González <mgoopazo@gmail.com>, 2021.
# Wang Tseryui <2251439097@qq.com>, 2021.
# Kedr <lava20121991@gmail.com>, 2022.
+# Isaac Iverson <isaaciverson1024@gmail.com>, 2023.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor interface\n"
"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n"
-"PO-Revision-Date: 2022-08-21 06:01+0000\n"
-"Last-Translator: Kedr <lava20121991@gmail.com>\n"
+"PO-Revision-Date: 2023-02-10 00:54+0000\n"
+"Last-Translator: Isaac Iverson <isaaciverson1024@gmail.com>\n"
"Language-Team: Esperanto <https://hosted.weblate.org/projects/godot-engine/"
"godot/eo/>\n"
"Language: eo\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8-bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.14-dev\n"
+"X-Generator: Weblate 4.16-dev\n"
msgid "Button"
msgstr "Butono"
@@ -531,6 +532,9 @@ msgstr "De Signalo:"
msgid "Scene does not contain any script."
msgstr "La sceno ne enhavas ajnan skriptojn."
+msgid "Select Method"
+msgstr "Elekti metodon"
+
msgid "Remove"
msgstr "Forigi"
@@ -588,9 +592,6 @@ msgstr "Malkonekti"
msgid "Connect a Signal to a Method"
msgstr "Konektu la signalo al metodo"
-msgid "Edit Connection:"
-msgstr "Redakti Konekton:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr "Ĉu vi certe volas forigi ĉiajn konektojn el la \"%s\" signalo?"
@@ -705,30 +706,15 @@ msgstr "Averto:"
msgid "Error:"
msgstr "Eraro:"
-msgid "C++ Error"
-msgstr "C++ Eraro"
-
-msgid "C++ Error:"
-msgstr "C++ Eraro:"
-
-msgid "Source"
-msgstr "Fonto"
-
-msgid "C++ Source"
-msgstr "C++ Fonto"
-
-msgid "Source:"
-msgstr "Fonto:"
-
-msgid "C++ Source:"
-msgstr "C++ Fonto:"
-
msgid "Stack Trace"
msgstr "Stakspuro"
msgid "Copy Error"
msgstr "Kopii eraro"
+msgid "C++ Source"
+msgstr "C++ Fonto"
+
msgid "Video RAM"
msgstr "Videomemoro"
@@ -1347,7 +1333,7 @@ msgid "Make Current"
msgstr "Farigi aktuale"
msgid "Import"
-msgstr "Enporti"
+msgstr "Importi"
msgid "Export"
msgstr "Eksporti"
@@ -1625,12 +1611,12 @@ msgstr "Vidigi ĉiajn lokaĵarojn"
msgid "Show Selected Locales Only"
msgstr "Vidigi nur elektitajn lokaĵarojn"
+msgid "Edit Filters"
+msgstr "Redakti filtrojn"
+
msgid "Language:"
msgstr "Lingvo:"
-msgid "Script"
-msgstr "Skripto"
-
msgid "Clear Output"
msgstr "Vakigi eligon"
@@ -2822,6 +2808,9 @@ msgstr "Elekti kaj movi punktojn, krei punktojn per dekstra musbutono."
msgid "Enable snap and show grid."
msgstr "Åœalti kradokapton kaj vidi kradon."
+msgid "Blend:"
+msgstr "Mikso:"
+
msgid "Point"
msgstr "Punkto"
@@ -2864,12 +2853,6 @@ msgstr "Forigi punktojn kaj triangulojn."
msgid "Generate blend triangles automatically (instead of manually)"
msgstr "Generi miksajn triangulojn aÅ­tomate (anstataÅ­ permane)"
-msgid "Blend:"
-msgstr "Mikso:"
-
-msgid "Edit Filters"
-msgstr "Redakti filtrojn"
-
msgid "Output node can't be added to the blend tree."
msgstr "Ne eblas aldoni eligan nodon al la miksan arbon."
@@ -2971,9 +2954,6 @@ msgstr "Ludi elektitan animacion retre el aktuala pozicio. (A)"
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "Ludi elektitan animacion retre el fino. (Majuskliga klavo+A)"
-msgid "Stop animation playback. (S)"
-msgstr "Halti reproduktadon de animacio. (S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "Ludi elektitan animacion el komenco. (Majuskliga klavo+D)"
@@ -3911,6 +3891,9 @@ msgstr "Norma"
msgid "Connections to method:"
msgstr "Konektoj al metodo:"
+msgid "Source"
+msgstr "Fonto"
+
msgid "Target"
msgstr "Celo"
@@ -4125,9 +4108,6 @@ msgstr "Aldoni enigan faron"
msgid "Change Action deadzone"
msgstr "ÅœanÄi mortzonon de faro"
-msgid "Add Input Action Event"
-msgstr "Aldoni eventon de eniga faro"
-
msgid "Erase Input Action"
msgstr "Forigi enigan faron"
@@ -4155,9 +4135,6 @@ msgstr "Elekti atributon"
msgid "Select Virtual Method"
msgstr "Elekti virtualan metodon"
-msgid "Select Method"
-msgstr "Elekti metodon"
-
msgid "Batch Rename"
msgstr "Renomi staple"
diff --git a/editor/translations/editor/es.po b/editor/translations/editor/es.po
index b09862420d..276c662c25 100644
--- a/editor/translations/editor/es.po
+++ b/editor/translations/editor/es.po
@@ -92,13 +92,16 @@
# Luis Miguel Soto Sánchez <luismiguelsoto@jerez.es>, 2022.
# Victor Stancioiu <victorstancioiu@gmail.com>, 2022, 2023.
# Daniel Miranda <danmiranda@gmail.com>, 2023.
+# Alan Arrecis <alan.arrecis@gmail.com>, 2023.
+# Fernando Sacó <saco.fernando@gmail.com>, 2023.
+# Damien Monasterios <monasterio13septiembre@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-01-20 10:19+0000\n"
-"Last-Translator: Daniel Miranda <danmiranda@gmail.com>\n"
+"PO-Revision-Date: 2023-02-10 14:12+0000\n"
+"Last-Translator: Damien Monasterios <monasterio13septiembre@gmail.com>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/"
"godot/es/>\n"
"Language: es\n"
@@ -106,14 +109,80 @@ 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.15.1\n"
+"X-Generator: Weblate 4.16-dev\n"
+
+msgid "Unset"
+msgstr "Desactivar"
msgid "Physical"
msgstr "Física"
+msgid "Left Mouse Button"
+msgstr "Botón Izquierdo del Mouse"
+
+msgid "Right Mouse Button"
+msgstr "Botón Derecho del Mouse"
+
+msgid "Middle Mouse Button"
+msgstr "Botón Central del Mouse"
+
+msgid "Mouse Wheel Up"
+msgstr "Rueda del Mouse Hacia Arriba"
+
+msgid "Mouse Wheel Down"
+msgstr "Rueda del Mouse Hacia Abajo"
+
+msgid "Mouse Wheel Left"
+msgstr "Rueda del Mouse Hacia Izquierda"
+
+msgid "Mouse Wheel Right"
+msgstr "Rueda del Mouse Hacia Derecha"
+
+msgid "Mouse Thumb Button 1"
+msgstr "Botón 1 de Pulgar del Mouse"
+
+msgid "Mouse Thumb Button 2"
+msgstr "Botón 2 de Pulgar del Mouse"
+
msgid "Button"
msgstr "Botón"
+msgid "Double Click"
+msgstr "Doble Clic"
+
+msgid "Mouse motion at position (%s) with velocity (%s)"
+msgstr "Movimiento del ratón en la posición (%s) con velocidad (%s)"
+
+msgid "Left Stick X-Axis, Joystick 0 X-Axis"
+msgstr "Eje X del Stick Izquierdo, Eje X del Joystick 0"
+
+msgid "Left Stick Y-Axis, Joystick 0 Y-Axis"
+msgstr "Eje Y del Stick Izquierdo, Eje Y del Joystick 0"
+
+msgid "Right Stick X-Axis, Joystick 1 X-Axis"
+msgstr "Eje X del Stick Derecho, Eje X del Joystick 1"
+
+msgid "Right Stick Y-Axis, Joystick 1 Y-Axis"
+msgstr "Eje Y del Stick Derecho, Eje Y del Joystick 1"
+
+msgid "Joystick 2 X-Axis, Left Trigger, Sony L2, Xbox LT"
+msgstr "Eje X del Joystick 2, Gatillo Izquierdo, Sony L2, Xbox LT"
+
+msgid "Joystick 2 Y-Axis, Right Trigger, Sony R2, Xbox RT"
+msgstr "Eje Y del Joystick 2, Gatillo Derecho, Sony R2, Xbox RT"
+
+msgid "Joystick 3 X-Axis"
+msgstr "Eje X del Joystick 3"
+
+msgid "Joystick 3 Y-Axis"
+msgstr "Eje Y del Joystick 3"
+
+msgid "Joystick 4 X-Axis"
+msgstr "Eje X del Joystick"
+
+msgid "Unknown Joypad Axis"
+msgstr "Eje de Joypad Desconocido"
+
msgid "Select"
msgstr "Seleccionar"
@@ -189,6 +258,12 @@ msgstr "Argumentos inválidos para construir '%s'"
msgid "On call to '%s':"
msgstr "En llamada a '%s':"
+msgid "Built-in script"
+msgstr "Script Integrado"
+
+msgid "Built-in"
+msgstr "Integrado"
+
msgid "B"
msgstr "B"
@@ -223,6 +298,9 @@ msgstr "Ya existe una acción con el nombre '%s'."
msgid "Add Event"
msgstr "Añadir Evento"
+msgid "Cannot Remove Action"
+msgstr "No se Puede Eliminar la Acción"
+
msgid "Add"
msgstr "Añadir"
@@ -256,6 +334,9 @@ msgstr "Mover Puntos Bezier"
msgid "Focus"
msgstr "Foco"
+msgid "Animation Change %s"
+msgstr "Cambio de Animación %s"
+
msgid "Change Animation Length"
msgstr "Cambiar Duración de la Animación"
@@ -338,10 +419,10 @@ msgid "In-Handle:"
msgstr "In-Handle:"
msgid "Out-Handle:"
-msgstr "Out-Handle:"
+msgstr "Mango de Salida:"
msgid "Stream:"
-msgstr "Stream:"
+msgstr "Flujo:"
msgid "Start (s):"
msgstr "Inicio (s):"
@@ -478,7 +559,7 @@ msgid "Methods"
msgstr "Métodos"
msgid "Bezier"
-msgstr "Bezier"
+msgstr "Bézier"
msgid "Audio"
msgstr "Audio"
@@ -508,7 +589,7 @@ msgid "Group tracks by node or display them as plain list."
msgstr "Agrupar las pistas por nodo o mostrarlas como una lista plana."
msgid "Snap:"
-msgstr "Snap:"
+msgstr "Ajuste o Conector:"
msgid "Animation step value."
msgstr "Valor de step de animación."
@@ -609,6 +690,16 @@ msgstr "Número de Línea:"
msgid "%d replaced."
msgstr "%d reemplazado."
+msgid "%d match"
+msgid_plural "%d matches"
+msgstr[0] "%d coincidencia"
+msgstr[1] "%d coincidencias"
+
+msgid "%d of %d match"
+msgid_plural "%d of %d matches"
+msgstr[0] "%d de %d coincidencia"
+msgstr[1] "%d de %d coincidencias"
+
msgid "Match Case"
msgstr "Coincidir Mayúsculas/Minúsculas"
@@ -670,6 +761,9 @@ msgstr "Desde la Señal:"
msgid "Scene does not contain any script."
msgstr "La escena no contiene ningún script."
+msgid "Select Method"
+msgstr "Seleccionar Método"
+
msgid "Remove"
msgstr "Eliminar"
@@ -679,6 +773,9 @@ msgstr "Añadir Argumento Extra de Llamada:"
msgid "Extra Call Arguments:"
msgstr "Argumentos extras de llamada:"
+msgid "Unbind Signal Arguments:"
+msgstr "Desvincular Argumentos de Señal:"
+
msgid "Receiver Method:"
msgstr "Método Receptor:"
@@ -712,6 +809,9 @@ msgstr "Conectar"
msgid "Signal:"
msgstr "Señal:"
+msgid "No description."
+msgstr "Sin descripción."
+
msgid "Connect '%s' to '%s'"
msgstr "Conectar «%s» a «%s»"
@@ -730,9 +830,6 @@ msgstr "Desconectar"
msgid "Connect a Signal to a Method"
msgstr "Conectar una Señal a un Método"
-msgid "Edit Connection:"
-msgstr "Editar Conexión:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
"¿Estás seguro/a que quieres eliminar todas las conexiones de la señal \"%s\"?"
@@ -879,26 +976,23 @@ msgstr "Advertencia:"
msgid "Error:"
msgstr "Error:"
-msgid "C++ Error"
-msgstr "Error de C++"
-
-msgid "C++ Error:"
-msgstr "Error de C++:"
+msgid "%s Error"
+msgstr "Error %s"
-msgid "Source"
-msgstr "Fuente"
+msgid "Stack Trace"
+msgstr "Rastreo de Pila"
-msgid "C++ Source"
-msgstr "Fuente C++"
+msgid "Stack Trace:"
+msgstr "Rastreo de Pila:"
-msgid "Source:"
-msgstr "Fuente:"
+msgid "Debug session started."
+msgstr "Sesión de depuración iniciada."
-msgid "C++ Source:"
-msgstr "Fuente C++:"
+msgid "Debug session closed."
+msgstr "Sesión de depuración cerrada."
-msgid "Stack Trace"
-msgstr "Rastreo de Pila"
+msgid "Delete All Breakpoints in:"
+msgstr "Eliminar Todos los Puntos de Interrupción en:"
msgid "Copy Error"
msgstr "Copiar Error"
@@ -906,6 +1000,9 @@ msgstr "Copiar Error"
msgid "Open C++ Source on GitHub"
msgstr "Código Abierto C++ en GitHub"
+msgid "C++ Source"
+msgstr "Fuente C++"
+
msgid "Video RAM"
msgstr "Memoria de Vídeo"
@@ -1385,6 +1482,12 @@ msgstr "Navegación"
msgid "OpenGL"
msgstr "OpenGL"
+msgid "Navigation, both 2D and 3D."
+msgstr "Navigation, tanto en 2D como en 3D."
+
+msgid "File saving failed."
+msgstr "Error al guardar el archivo."
+
msgid "Nodes and Classes:"
msgstr "Clases y Nodos:"
@@ -1401,12 +1504,21 @@ msgstr "Nuevo"
msgid "Save"
msgstr "Guardar"
+msgid "Profile:"
+msgstr "Perfil:"
+
msgid "Reset to Defaults"
msgstr "Restablecer Valores Predeterminados"
+msgid "Please Confirm:"
+msgstr "Confirma, por favor:"
+
msgid "Export Profile"
msgstr "Exportar Perfil"
+msgid "Edit Build Configuration Profile"
+msgstr "Editar Perfil de Configuración de Compilación"
+
msgid "Paste Params"
msgstr "Pegar Parámetros"
@@ -1713,6 +1825,15 @@ msgstr ""
msgid "(Re)Importing Assets"
msgstr "(Re)Importación de Assets"
+msgid "Import resources of type: %s"
+msgstr "Importar recursos del tipo: %s"
+
+msgid "No return value."
+msgstr "No retorna ningún valor."
+
+msgid "Error codes returned:"
+msgstr "Códigos de error devueltos:"
+
msgid "Top"
msgstr "Superior"
@@ -1740,8 +1861,14 @@ msgstr "anula %s:"
msgid "default:"
msgstr "predeterminado:"
+msgid "Constructors"
+msgstr "Constructores"
+
+msgid "Operators"
+msgstr "Operadores"
+
msgid "Theme Properties"
-msgstr "Propiedades del Theme"
+msgstr "Propiedades del Tema"
msgid "Colors"
msgstr "Colores"
@@ -1774,9 +1901,15 @@ msgstr ""
"Actualmente no existe descripción para esta propiedad. Por favor ¡ayúdanos "
"[color=$color][url=$url]contribuyendo una[/url][/color]!"
+msgid "Constructor Descriptions"
+msgstr "Descripciones de Constructor"
+
msgid "Method Descriptions"
msgstr "Descripciones de Métodos"
+msgid "Operator Descriptions"
+msgstr "Descripciones de Operador"
+
msgid "%d match."
msgstr "%d coincidencia."
@@ -1850,24 +1983,51 @@ msgstr "Subir"
msgid "Move Down"
msgstr "Bajar"
+msgid "Clear Array"
+msgstr "Limpiar Array"
+
+msgid "Resize Array..."
+msgstr "Redimensionar Array..."
+
+msgid "Add Element"
+msgstr "Añadir Elemento"
+
msgid "Resize Array"
msgstr "Redimensionar Array"
+msgid "New Size:"
+msgstr "Nuevo Tamaño:"
+
+msgid "Element %s"
+msgstr "Elemento %s"
+
+msgid "Add Metadata"
+msgstr "Añadir Metadatos"
+
msgid "Set %s"
msgstr "Establecer %s"
msgid "Set Multiple:"
msgstr "Asignar Múltiples:"
+msgid "Remove metadata %s"
+msgstr "Eliminar Metadatos %s"
+
msgid "Pinned %s"
msgstr "Fijado %s"
msgid "Unpinned %s"
msgstr "Desfijado %s"
+msgid "Add metadata %s"
+msgstr "Añadir Metadatos %s"
+
msgid "Copy Property Path"
msgstr "Copiar Ruta de Propiedad"
+msgid "Select existing layout:"
+msgstr "Selecciona un diseño existente:"
+
msgid "Changed Locale Filter Mode"
msgstr "Cambiar Modo de Filtro Local"
@@ -1877,11 +2037,17 @@ msgstr "Mostrar Todos los Idiomas"
msgid "Show Selected Locales Only"
msgstr "Mostrar Sólo las Localizaciones Seleccionadas"
+msgid "Edit Filters"
+msgstr "Editar Filtros"
+
msgid "Language:"
msgstr "Lenguaje:"
-msgid "Script"
-msgstr "Script"
+msgid "Country:"
+msgstr "País:"
+
+msgid "Language"
+msgstr "Idioma"
msgid "Variant"
msgstr "Variante"
@@ -2020,12 +2186,18 @@ msgstr "No hay escena definida para ejecutar."
msgid "Save scene before running..."
msgstr "Guarda escena antes de ejecutar..."
+msgid "Reload the played scene."
+msgstr "Recargar escena reproducida."
+
msgid "Play the project."
msgstr "Reproducir el proyecto."
msgid "Play the edited scene."
msgstr "Reproducir la escena editada."
+msgid "Play a custom scene."
+msgstr "Reproducir escena personalizada."
+
msgid "Open Base Scene"
msgstr "Abrir Escena Base"
@@ -2080,12 +2252,18 @@ msgstr "No se puede deshacer mientras se pulsan los botones del mouse."
msgid "Nothing to undo."
msgstr "No hay nada que deshacer."
+msgid "Remote Undo: %s"
+msgstr "Deshacer Remoto: %s"
+
msgid "Can't redo while mouse buttons are pressed."
msgstr "No se puede rehacer mientras los botones del mouse están presionados."
msgid "Nothing to redo."
msgstr "No hay nada que rehacer."
+msgid "Remote Redo: %s"
+msgstr "Rehacer Remoto: %s"
+
msgid "Can't reload a scene that was never saved."
msgstr "No se puede volver a cargar una escena que nunca se guardó."
@@ -2319,6 +2497,9 @@ msgstr "Proyecto"
msgid "Project Settings..."
msgstr "Configuración del Proyecto..."
+msgid "Project Settings"
+msgstr "Configuración del Proyecto"
+
msgid "Version Control"
msgstr "Control de Versiones"
@@ -2349,6 +2530,9 @@ msgstr "Editor"
msgid "Editor Settings..."
msgstr "Configuración del Editor..."
+msgid "Command Palette..."
+msgstr "Paleta de Comandos..."
+
msgid "Editor Layout"
msgstr "Layout del Editor"
@@ -2378,6 +2562,9 @@ msgstr "Administrar Características del Editor..."
msgid "Manage Export Templates..."
msgstr "Administrar Plantillas de Exportación..."
+msgid "Configure FBX Importer..."
+msgstr "Configurar Importador FBX..."
+
msgid "Help"
msgstr "Ayuda"
@@ -2405,9 +2592,48 @@ msgstr "Sobre Godot"
msgid "Support Godot Development"
msgstr "Apoyar el desarrollo de Godot"
+msgid "Run the project's default scene."
+msgstr "Ejecutar la escena predeterminada del proyecto."
+
msgid "Run Project"
msgstr "Reproducir Proyecto"
+msgid "Pause the running project's execution for debugging."
+msgstr "Pausar la ejecución del proyecto en ejecución para depuración."
+
+msgid "Pause Running Project"
+msgstr "Pausar Proyecto en Ejecución"
+
+msgid "Stop the currently running project."
+msgstr "Detener el proyecto actualmente en ejecución."
+
+msgid "Stop Running Project"
+msgstr "Detener Proyecto en Ejecución"
+
+msgid "Run the currently edited scene."
+msgstr "Ejecutar la escena actualmente editada."
+
+msgid "Run Current Scene"
+msgstr "Ejecutar Escena Actual"
+
+msgid "Run a specific scene."
+msgstr "Ejecutar una escena específica."
+
+msgid "Run Specific Scene"
+msgstr "Ejecutar Escena Específica"
+
+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 ""
+"Habilitar modo de Fabricante de Películas.\n"
+"El proyecto se ejecutará a FPS estables y la salida visual y de audio se "
+"grabará en un archivo de video."
+
+msgid "Choose a renderer."
+msgstr "Elegir un renderizador."
+
msgid "Compatibility"
msgstr "Compatibilidad"
@@ -2447,24 +2673,6 @@ msgid "Install from file"
msgstr "Instalar desde archivo"
msgid ""
-"This will set up your project for custom Android builds by installing the "
-"source template to \"res://android/build\".\n"
-"You can then apply modifications and build your own custom APK on export "
-"(adding modules, changing the AndroidManifest.xml, etc.).\n"
-"Note that in order to make custom builds instead of using pre-built APKs, "
-"the \"Use Custom Build\" option should be enabled in the Android export "
-"preset."
-msgstr ""
-"Esto configurará tu proyecto para las compilaciones personalizadas de "
-"Android instalando la plantilla base en \"res://android/build\".\n"
-"Luego podrás aplicar las modificaciones y compilar tu propio APK "
-"personalizado al exportarlo (agregando módulos, cambiando el AndroidManifest."
-"xml, etc.).\n"
-"Ten en cuenta que para realizar compilaciones personalizadas en lugar de "
-"usar APKs predefinidos, la opción \"Usar Compilación Personalizada\" debería "
-"estar habilitada en la configuración de exportación de Android."
-
-msgid ""
"The Android build template is already installed in this project and it won't "
"be overwritten.\n"
"Remove the \"res://android/build\" directory manually before attempting this "
@@ -2674,6 +2882,9 @@ msgstr "Escribe tu lógica en el método _run()."
msgid "There is an edited scene already."
msgstr "Ya hay una escena editada."
+msgid "Edit Built-in Action"
+msgstr "Editar Acción Integrada"
+
msgid "Common"
msgstr "Más información"
@@ -2692,8 +2903,21 @@ msgstr "Atajos"
msgid "Binding"
msgstr "Vinculación"
-msgid "%s Error"
-msgstr "Error %s"
+msgid ""
+"Hold %s to round to integers.\n"
+"Hold Shift for more precise changes."
+msgstr ""
+"Mantén pulsado %s para redondear a enteros.\n"
+"Mantén pulsado Shift para cambios más precisos."
+
+msgid "No notifications."
+msgstr "No hay notificaciones."
+
+msgid "Show notifications."
+msgstr "Mostrar notificaciones."
+
+msgid "Silence the notifications."
+msgstr "Silenciar notificaciones."
msgid "All Devices"
msgstr "Todos los Dispositivos"
@@ -2741,6 +2965,9 @@ msgstr "Fallo en la exportación de los archivos del proyecto."
msgid "Can't open file to read from path \"%s\"."
msgstr "No se puede abrir el archivo a leer de la ruta \"%s\"."
+msgid "Can't open encrypted file to write."
+msgstr "No se puede abrir el archivo encriptado para escribir."
+
msgid "Save ZIP"
msgstr "Guardar como ZIP"
@@ -3102,6 +3329,9 @@ msgstr "Administrar Plantillas de Exportación"
msgid "Export With Debug"
msgstr "Exportar Con Depuración"
+msgid "Path to FBX2glTF executable is invalid."
+msgstr "La ruta al ejecutable FBX2glTF es inválida."
+
msgid "Browse"
msgstr "Examinar"
@@ -3131,6 +3361,12 @@ msgstr "Error al mover:"
msgid "Error duplicating:"
msgstr "Error al duplicar:"
+msgid "Failed to save resource at %s: %s"
+msgstr "Error al guardar recurso en %s: %s"
+
+msgid "Failed to load resource at %s: %s"
+msgstr "Error al cargar el recurso en %s: %s"
+
msgid "Unable to update dependencies:"
msgstr "No se han podido actualizar las dependencias:"
@@ -3289,6 +3525,15 @@ msgstr "Reemplazar en Archivos"
msgid "Searching..."
msgstr "Buscando..."
+msgid "%d match in %d file"
+msgstr "%d coincidencia en el archivo %d"
+
+msgid "%d matches in %d file"
+msgstr "%d coincidencias en el archivo %d"
+
+msgid "%d matches in %d files"
+msgstr "%d coincidencias en los archivos %d"
+
msgid "Add to Group"
msgstr "Añadir al Grupo"
@@ -3328,9 +3573,27 @@ msgstr "Administrar Grupos"
msgid "Reimport"
msgstr "Reimportar"
+msgid "Enable looping."
+msgstr "Activar bucle."
+
msgid "Offset:"
msgstr "Offset:"
+msgid "Loop:"
+msgstr "Bucle:"
+
+msgid "Beat Count:"
+msgstr "Recuento de Tiempos:"
+
+msgid "Music Playback:"
+msgstr "Reproducción de Música:"
+
+msgid "Pre-render Configurations"
+msgstr "Configuraciones de Prerenderizado"
+
+msgid "Configuration:"
+msgstr "Configuración:"
+
msgid "Importing Scene..."
msgstr "Importando Escena..."
@@ -3361,18 +3624,46 @@ msgstr ""
"compresión de la textura rojo-verde para reducir el uso de memoria (el canal "
"azul se descarta)."
+msgid "2D/3D (Auto-Detect)"
+msgstr "2D/3D (Detección Automática)"
+
msgid "2D"
msgstr "2D"
msgid "3D"
msgstr "3D"
+msgid "Error opening scene"
+msgstr "Error al abrir la escena"
+
+msgid "Select folder to extract material resources"
+msgstr "Selecciona una carpeta para extraer los recursos de material"
+
+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 ""
+"El material no tiene nombre ni ninguna otra forma de identificarse en la "
+"reimportación.\n"
+"Por favor, dale un nombre o asegúrese de exportarlo con un ID único."
+
+msgid "Set paths to save animations as resource files on Reimport"
+msgstr ""
+"Establecer rutas para guardar animaciones como archivos de recursos al "
+"Reimportar"
+
+msgid "Actions..."
+msgstr "Acciones..."
+
msgid "Meshes"
-msgstr "Meshes"
+msgstr "Mallas"
msgid "Materials"
msgstr "Materiales"
+msgid "Save Extension:"
+msgstr "Guardar Extensión:"
+
msgid "Select Importer"
msgstr "Seleccionar Importador"
@@ -3407,7 +3698,10 @@ msgid "Import As:"
msgstr "Importar como:"
msgid "Preset"
-msgstr "Preajuste"
+msgstr "Preconfigurado"
+
+msgid "Advanced..."
+msgstr "Avanzado..."
msgid "Save Scenes, Re-Import, and Restart"
msgstr "Guardar Escenas, Reimportar y Reiniciar"
@@ -3428,6 +3722,9 @@ msgstr ""
"Selecciona un archivo de recursos en el sistema de archivos o en el "
"inspector para ajustar la configuración de importación."
+msgid "Joypad Axes"
+msgstr "Ejes del Joypad"
+
msgid "Device:"
msgstr "Dispositivo:"
@@ -3530,9 +3827,15 @@ msgstr "Remapeos por idioma:"
msgid "Locale"
msgstr "Idioma"
+msgid "Set %s on %d nodes"
+msgstr "Establecer %s en %d nodos"
+
msgid "Select a single node to edit its signals and groups."
msgstr "Selecciona un único nodo para editar sus señales y grupos."
+msgid "Subfolder name is not a valid folder name."
+msgstr "El nombre de la subcarpeta no es un nombre de carpeta válido."
+
msgid "Edit a Plugin"
msgstr "Editar Plugin"
@@ -3638,6 +3941,12 @@ msgstr "Seleccionar y mover puntos, crear puntos con clic derecho."
msgid "Enable snap and show grid."
msgstr "Activar snap y mostrar cuadrícula."
+msgid "Sync:"
+msgstr "Sincronizar:"
+
+msgid "Blend:"
+msgstr "Mezcla:"
+
msgid "Point"
msgstr "Punto"
@@ -3681,15 +3990,9 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
"Generar triángulos combinados automáticamente (en lugar de manualmente)"
-msgid "Blend:"
-msgstr "Mezcla:"
-
msgid "Parameter Changed:"
msgstr "Parámetro Modificado:"
-msgid "Edit Filters"
-msgstr "Editar Filtros"
-
msgid "Output node can't be added to the blend tree."
msgstr "El nodo de salida no puede ser agregado al blend tree."
@@ -3763,9 +4066,21 @@ msgstr "Agregar Nodo..."
msgid "Enable Filtering"
msgstr "Habilitar Filtrado"
+msgid "Library Name:"
+msgstr "Nombre de la Librería:"
+
+msgid "Animation name can't be empty."
+msgstr "El nombre de la animación no puede estar vacío."
+
msgid "Load Animation"
msgstr "Cargar Animación"
+msgid "Invalid AnimationLibrary file."
+msgstr "Archivo AnimationLibrary inválido."
+
+msgid "Invalid Animation file."
+msgstr "Archivo Animation inválido."
+
msgid "Animation Name:"
msgstr "Nombre de Animación:"
@@ -3775,6 +4090,21 @@ msgstr "Animación Pegada"
msgid "Open in Inspector"
msgstr "Abrir en el Inspector"
+msgid "Paste Animation to Library from clipboard"
+msgstr "Pegar Animación a la Biblioteca desde el portapapeles"
+
+msgid "Save animation library to resource on disk"
+msgstr "Guardar biblioteca de animaciones como recurso en el disco"
+
+msgid "Copy animation to clipboard"
+msgstr "Copiar animación al portapapeles"
+
+msgid "Save animation to resource on disk"
+msgstr "Guardar animación como recurso en disco"
+
+msgid "Edit Animation Libraries"
+msgstr "Editar Librerías de Animación"
+
msgid "Storage"
msgstr "Almacenamiento"
@@ -3808,6 +4138,9 @@ msgstr "Mezclar el Siguiente Cambio"
msgid "Change Blend Time"
msgstr "Cambiar Tiempo de Mezcla"
+msgid "Duplicated Animation Name:"
+msgstr "Nombre de Animación Duplicado:"
+
msgid "Play selected animation backwards from current pos. (A)"
msgstr ""
"Reproducir hacia atrás la animación seleccionada desde la posición actual (A)"
@@ -3816,9 +4149,6 @@ msgid "Play selected animation backwards from end. (Shift+A)"
msgstr ""
"Reproducir hacia atrás la animación seleccionada desde el final. (Shift + A)"
-msgid "Stop animation playback. (S)"
-msgstr "Detener la reproducción de la animación. (S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "Reproducir animación seleccionada desde el principio. (Shift + D)"
@@ -3958,7 +4288,7 @@ msgid "Root"
msgstr "Raíz"
msgid "AnimationTree"
-msgstr "AnimationTree"
+msgstr "Ãrbol de Animación"
msgid "Contents:"
msgstr "Contenido:"
@@ -4029,6 +4359,9 @@ msgstr "Fallo en la comprobación del hash SHA-256"
msgid "Asset Download Error:"
msgstr "Error de Descarga de Assets:"
+msgid "Ready to install!"
+msgstr "¡Listo para instalar!"
+
msgid "Downloading (%s / %s)..."
msgstr "Descargando (%s / %s)..."
@@ -4126,6 +4459,9 @@ msgstr "Archivo ZIP de assets"
msgid "Audio Preview Play/Pause"
msgstr "Previsualización de Audio Reproducir/Pausar"
+msgid "Bone Picker:"
+msgstr "Selector de Hueso:"
+
msgid "Preview"
msgstr "Vista Previa"
@@ -4213,8 +4549,14 @@ msgstr "Agrupado"
msgid "Add Node Here"
msgstr "Añadir Nodo Aquí"
+msgid "Moving:"
+msgstr "Moviendo:"
+
+msgid "Rotating:"
+msgstr "Rotando:"
+
msgid "Scaling:"
-msgstr "Escala:"
+msgstr "Escalando:"
msgid ""
"Project Camera Override\n"
@@ -4718,6 +5060,9 @@ msgstr ""
"Cuando se utiliza de forma remota en un dispositivo, esto es más eficiente "
"cuando la opción de sistema de archivos en red está activada."
+msgid " - Variation"
+msgstr " - Variación"
+
msgid "Convert to CPUParticles2D"
msgstr "Convertir a CPUParticles2D"
@@ -4855,8 +5200,20 @@ msgstr "No hay mallas para depurar."
msgid "Mesh has no UV in layer %d."
msgstr "La malla no tiene UV en la capa %d."
+msgid "MeshInstance3D lacks a Mesh."
+msgstr "MeshInstance3D carece de Malla."
+
+msgid "Mesh has no surface to create outlines from."
+msgstr "La malla no tiene superficie para crear contornos."
+
+msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES."
+msgstr "El tipo de primitiva de malla no es PRIMITIVE_TRIANGLES."
+
+msgid "Could not create outline."
+msgstr "No se pudo crear el contorno."
+
msgid "Create Outline"
-msgstr "Crear Outline"
+msgstr "Crear Contorno"
msgid "Mesh"
msgstr "Malla"
@@ -5064,12 +5421,6 @@ msgstr "Cambiar Notificador AABB"
msgid "Change Particles AABB"
msgstr "Cambiar partículas AABB"
-msgid "Change Box Shape Extents"
-msgstr "Cambiar Extensión de la Forma de la Caja"
-
-msgid "Change Probe Extents"
-msgstr "Cambiar Alcance de la Sonda"
-
msgid "Change Capsule Shape Radius"
msgstr "Cambiar Radio de la Forma de la Cápsula"
@@ -5148,6 +5499,36 @@ msgstr "Insertar claves está desactivado (no se insertaron claves)."
msgid "Animation Key Inserted."
msgstr "Clave de animación insertada."
+msgid "X: %s\n"
+msgstr "X: %s\n"
+
+msgid "Y: %s\n"
+msgstr "Y: %s\n"
+
+msgid "Z: %s\n"
+msgstr "Z: %s\n"
+
+msgid "Size: %s (%.1fMP)\n"
+msgstr "Tamaño: %s (%.1fMP)\n"
+
+msgid "Objects: %d\n"
+msgstr "Objetos: %d\n"
+
+msgid "Primitive Indices: %d\n"
+msgstr "Ãndices Primitivos: %d\n"
+
+msgid "Draw Calls: %d"
+msgstr "Llamadas de Dibujado: %d"
+
+msgid "CPU Time: %s ms"
+msgstr "Tiempo de CPU: %s ms"
+
+msgid "GPU Time: %s ms"
+msgstr "Tiempo de GPU: %s ms"
+
+msgid "FPS: %d"
+msgstr "FPS: %d"
+
msgid "Top View."
msgstr "Vista Superior."
@@ -5893,6 +6274,9 @@ msgstr "Estándar"
msgid "Connections to method:"
msgstr "Conexiones al método:"
+msgid "Source"
+msgstr "Fuente"
+
msgid "Target"
msgstr "Objetivo"
@@ -6056,6 +6440,9 @@ msgstr "Crear LightOccluder2D"
msgid "LightOccluder2D Preview"
msgstr "Vista Previa de LightOccluder2D"
+msgid "Can't convert a Sprite2D from a foreign scene."
+msgstr "No se puede convertir un Sprite2D de una escena externa."
+
msgid "Can't convert a sprite using animation frames to mesh."
msgstr ""
"No se puede convertir en malla un sprite usando fotogramas de animación."
@@ -6138,15 +6525,15 @@ msgstr "(vacío)"
msgid "Animations:"
msgstr "Animaciones:"
-msgid "Speed:"
-msgstr "Velocidad:"
-
-msgid "Loop"
-msgstr "Bucle"
+msgid "Delete Animation"
+msgstr "Eliminar Animación"
msgid "Animation Frames:"
msgstr "Fotogramas de Animación:"
+msgid "Frame Duration:"
+msgstr "Duración del Fotograma:"
+
msgid "Zoom Reset"
msgstr "Resetear Zoom"
@@ -6195,21 +6582,46 @@ msgstr "Paso:"
msgid "Styleboxes"
msgstr "Cajas de estilo"
+msgid "1 color"
+msgid_plural "{num} colors"
+msgstr[0] "1 color"
+msgstr[1] "{num} colores"
+
msgid "No colors found."
msgstr "No se encontraron colores."
+msgid "1 constant"
+msgid_plural "{num} constants"
+msgstr[0] "1 constante"
+msgstr[1] "{num} constantes"
+
msgid "No constants found."
msgstr "No se encontraron constants."
msgid "No fonts found."
msgstr "No se han encontrado fonts."
+msgid "1 font size"
+msgid_plural "{num} font sizes"
+msgstr[0] "1 tamaño de fuente"
+msgstr[1] "{num} tamaño de fuentes"
+
msgid "No icons found."
msgstr "No se han encontrado icons."
+msgid "1 stylebox"
+msgid_plural "{num} styleboxes"
+msgstr[0] "1 caja de estilo"
+msgstr[1] "{num} cajas de estilo"
+
msgid "No styleboxes found."
msgstr "No se encontraron styleboxes."
+msgid "{num} currently selected"
+msgid_plural "{num} currently selected"
+msgstr[0] "{num} seleccionado actualmente"
+msgstr[1] "{num} seleccionados actualmente"
+
msgid "Nothing was selected for the import."
msgstr "No se ha seleccionado nada para la importación."
@@ -6492,6 +6904,9 @@ msgstr "Establecer tipo de base de variación"
msgid "Set Base Type"
msgstr "Establer tipo de base"
+msgid "Add a type from a list of available types or create a new one."
+msgstr "Añade un tipo de una lista de tipos disponibles o crea uno nuevo."
+
msgid "Show Default"
msgstr "Mostrar por Defecto"
@@ -6634,15 +7049,36 @@ msgstr "Voltear Horizontalmente"
msgid "Flip Vertically"
msgstr "Voltear Verticalmente"
+msgid "Painting:"
+msgstr "Pintando:"
+
+msgid "Place Random Tile"
+msgstr "Colocar Tile Aleatorio"
+
+msgid "Scattering:"
+msgstr "Dispersión:"
+
msgid "Tiles"
msgstr "Tiles"
+msgid "Global actions:"
+msgstr "Acciones Globales:"
+
msgid "Atlas"
msgstr "Atlas"
+msgid "Paint Properties:"
+msgstr "Propiedades de Pintura:"
+
msgid "Yes"
msgstr "Sí"
+msgid "Scenes collection properties:"
+msgstr "Propiedades de la Colección de Escenas:"
+
+msgid "Tile properties:"
+msgstr "Propiedades del Tile:"
+
msgid "TileSet"
msgstr "TileSet"
@@ -6679,9 +7115,15 @@ msgstr "¿Quieres eliminar la rama %s?"
msgid "Do you want to remove the %s remote?"
msgstr "¿Quieres eliminar el %s remoto?"
+msgid "Create VCS metadata files for:"
+msgstr "Crear archivos de metadatos VCS para:"
+
msgid "Apply"
msgstr "Aplicar"
+msgid "Connect to VCS"
+msgstr "Conectar a VCS"
+
msgid "Remote Login"
msgstr "Inicio de Sesión Remoto"
@@ -6829,6 +7271,9 @@ msgstr "Booleano"
msgid "Sampler"
msgstr "Sampler"
+msgid "[default]"
+msgstr "[default]"
+
msgid "Add Input Port"
msgstr "Añadir Puerto de Entrada"
@@ -6841,6 +7286,9 @@ msgstr "Eliminar Puerto de Entrada"
msgid "Remove Output Port"
msgstr "Eliminar Puerto de Salida"
+msgid "Set Parameter Name"
+msgstr "Establecer Nombre de Parámetro"
+
msgid "Set Input Default Port"
msgstr "Establecer Puerto Predeterminado de Entrada"
@@ -6853,6 +7301,12 @@ msgstr "Nodo(s) Movido(s)"
msgid "Visual Shader Input Type Changed"
msgstr "Cambiar Tipo de Entrada del Visual Shader"
+msgid "ParameterRef Name Changed"
+msgstr "Nombre de ParameterRef Cambiado"
+
+msgid "Varying Name Changed"
+msgstr "Cambio de Nombre"
+
msgid "Vertex"
msgstr "Vértice"
@@ -7444,6 +7898,9 @@ msgstr "Ruta de Instalación del Proyecto:"
msgid "Renderer:"
msgstr "Renderizador:"
+msgid "Version Control Metadata:"
+msgstr "Metadatos de Control de Versión:"
+
msgid "Missing Project"
msgstr "Proyecto Faltante"
@@ -7463,6 +7920,65 @@ msgid "Can't open project at '%s'."
msgstr "No se puede abrir el proyecto en '%s'."
msgid ""
+"The selected project \"%s\" does not specify its supported Godot version in "
+"its configuration file (\"project.godot\").\n"
+"\n"
+"Project path: %s\n"
+"\n"
+"If you proceed with opening it, it will be converted to Godot's current "
+"configuration file format.\n"
+"\n"
+"Warning: You won't be able to open the project with previous versions of the "
+"engine anymore."
+msgstr ""
+"El proyecto seleccionado \"%s\" no especifica la versión de Godot soportada "
+"en su archivo de configuración (\"project.godot\").\n"
+"\n"
+"Ruta del proyecto: %s\n"
+"\n"
+"Si procedes a abrirlo, se convertirá al formato de fichero de configuración "
+"actual de Godot.\n"
+"\n"
+"Advertencia: Ya no podrás abrir el proyecto con versiones anteriores del "
+"motor."
+
+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 ""
+"El proyecto seleccionado \"%s\" fue generado en una versión anterior del "
+"motor, y necesita ser convertido a esta versión.\n"
+"\n"
+"Ruta del proyecto: %s\n"
+"\n"
+"¿Quieres convertirlo?\n"
+"\n"
+"Advertencia: Ya no podrás abrir el proyecto con versiones anteriores del "
+"motor."
+
+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 ""
+"No se puede abrir el proyecto \"%s\" en la siguiente ruta:\n"
+"\n"
+"%s\n"
+"\n"
+"La configuración del proyecto fue creada por una versión más reciente del "
+"motor, cuya configuración no es compatible con esta versión."
+
+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."
@@ -7582,9 +8098,6 @@ msgstr "Añadir acción de entrada"
msgid "Change Action deadzone"
msgstr "Cambiar zona muerta de la acción"
-msgid "Add Input Action Event"
-msgstr "Añadir Evento de Acción de Entrada"
-
msgid "Erase Input Action"
msgstr "Eliminar Acción de Entrada"
@@ -7594,6 +8107,9 @@ msgstr "Renombrar evento de acción de entrada"
msgid "Project Settings (project.godot)"
msgstr "Configuración del Proyecto (project.godot)"
+msgid "Select a Setting or Type its Name"
+msgstr "Selecciona un Ajuste o Escribe su Nombre"
+
msgid "Input Map"
msgstr "Mapa de Entrada"
@@ -7612,9 +8128,6 @@ msgstr "Seleccionar Propiedad"
msgid "Select Virtual Method"
msgstr "Seleccionar Método Virtual"
-msgid "Select Method"
-msgstr "Seleccionar Método"
-
msgid "Batch Rename"
msgstr "Renombrar por lote"
@@ -7693,12 +8206,18 @@ msgstr "En el carácter %s"
msgid "Reparent Node"
msgstr "Reemparentar nodo"
+msgid "Select new parent:"
+msgstr "Seleccionar nuevo padre:"
+
msgid "Keep Global Transform"
msgstr "Mantener transformación global"
msgid "Reparent"
msgstr "Reemparentar"
+msgid "Root Type:"
+msgstr "Tipo de Raíz:"
+
msgid "2D Scene"
msgstr "Escena 2D"
@@ -7708,6 +8227,12 @@ msgstr "Escena 3D"
msgid "User Interface"
msgstr "Interfaz de usuario"
+msgid "Scene Name:"
+msgstr "Nombre de Escena:"
+
+msgid "Root Name:"
+msgstr "Nombre de Raíz:"
+
msgid "Error loading scene from %s"
msgstr "Error al cargar escena desde %s"
@@ -7960,6 +8485,19 @@ msgstr ""
"el prefijo '%s' en una ruta de nodo.\n"
"Haz clic para desactivar esto."
+msgid "Node has one connection."
+msgid_plural "Node has {num} connections."
+msgstr[0] "El nodo tiene una conexión."
+msgstr[1] "El nodo tiene {num} conexiones."
+
+msgid "Node is in this group:"
+msgid_plural "Node is in the following groups:"
+msgstr[0] "El nodo está en este grupo:"
+msgstr[1] "El nodo está en los siguientes grupos:"
+
+msgid "Click to show signals dock."
+msgstr "Haz clic para mostrar el dock de señales."
+
msgid "Open Script:"
msgstr "Abrir Script:"
@@ -8029,6 +8567,12 @@ msgstr "Abrir Script / Seleccionar Ubicación"
msgid "Open Script"
msgstr "Abrir Script"
+msgid "Inherit %s"
+msgstr "Heredar %s"
+
+msgid "Inherit"
+msgstr "Heredar"
+
msgid "File exists, it will be reused."
msgstr "El archivo ya existe, será reutilizado."
@@ -8091,6 +8635,12 @@ msgstr "Ruta base incorrecta."
msgid "Wrong extension chosen."
msgstr "Se ha elegido una extensión incorrecta."
+msgid "Mode:"
+msgstr "Modo:"
+
+msgid "Global shader parameter '%s' already exists'"
+msgstr "El parámetro de shader global '%s' ya existe"
+
msgid "Change Cylinder Radius"
msgstr "Cambiar Radio de Cylinder"
@@ -8258,6 +8808,9 @@ msgstr "Tamaño"
msgid "Network Profiler"
msgstr "Profiler de Red"
+msgid "Delete Property?"
+msgstr "¿Eliminar Propiedad?"
+
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 "
@@ -8308,6 +8861,9 @@ msgstr "Analizando geometría..."
msgid "Done!"
msgstr "¡Hecho!"
+msgid "Error loading %s: %s."
+msgstr "Error al cargar %s: %s."
+
msgid "Pose"
msgstr "Pose"
@@ -8421,24 +8977,9 @@ msgstr "Clave pública inválida para la expansión de APK."
msgid "Invalid package name:"
msgstr "Nombre de paquete inválido:"
-msgid "\"Use Custom Build\" must be enabled to use the plugins."
-msgstr ""
-"\"Usar Compilación Personalizada\" debe estar activado para usar los plugins."
-
msgid "\"Passthrough\" is only valid when \"XR Mode\" is \"OpenXR\"."
msgstr "\"Passthrough\" solo es válido cuando el \"Modo XR\" es \"OpenXR\"."
-msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled."
-msgstr ""
-"\"Exportar AAB\" solo es válido cuando \"Usar Compilación Personalizada\" "
-"está activado."
-
-msgid ""
-"\"Min SDK\" can only be overridden when \"Use Custom Build\" is enabled."
-msgstr ""
-"\"Min SDK\" solo puede sobrescribirse cuando está activada la opción \"Usar "
-"Compilación Personalizada\"."
-
msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid."
msgstr ""
"\"Min SDK\" debería ser un entero válido, pero obtuvo \"%s\" que es inválido."
@@ -8451,12 +8992,6 @@ msgstr ""
"librería de Godot."
msgid ""
-"\"Target SDK\" can only be overridden when \"Use Custom Build\" is enabled."
-msgstr ""
-"\"SDK de Destino\" solo se puede sobrescribir cuando \"Usar Compilación "
-"Personalizada\" está activado."
-
-msgid ""
"\"Target SDK\" should be a valid integer, but got \"%s\" which is invalid."
msgstr ""
"\"SDK de Destino\" debería ser un entero válido, pero obtuvo \"%s\" inválido."
@@ -8499,6 +9034,13 @@ msgstr "No se ha podido iniciar el ejecutable apksigner."
msgid "'apksigner' returned with error #%d"
msgstr "'apksigner' ha retornado con error #%d"
+msgid ""
+"output: \n"
+"%s"
+msgstr ""
+"salida: \n"
+"%s"
+
msgid "Verifying %s..."
msgstr "Verificando %s..."
@@ -8522,14 +9064,6 @@ msgid "Unsupported export format!"
msgstr "¡Formato de exportación no compatible!"
msgid ""
-"Trying to build from a custom built template, but no version info for it "
-"exists. Please reinstall from the 'Project' menu."
-msgstr ""
-"Se intentó construir a partir de una plantilla personalizada, pero no existe "
-"información de la versión para ello. Por favor, reinstala desde el menú "
-"'Proyecto'."
-
-msgid ""
"Android build version mismatch: Template installed: %s, Godot version: %s. "
"Please reinstall Android build template from 'Project' menu."
msgstr ""
@@ -8623,6 +9157,9 @@ msgstr "Falta el identificador."
msgid "The character '%s' is not allowed in Identifier."
msgstr "El carácter '% s' no está permitido en el Identificador."
+msgid "Debug Script Export"
+msgstr "Exportación de Script de Depuración"
+
msgid "Failed to open executable file \"%s\"."
msgstr "Fallo al abrir el archivo ejecutable \"%s\"."
@@ -8635,6 +9172,9 @@ msgstr "Los ejecutables de 32 bits no pueden tener datos embebidos >= 4 GiB."
msgid "Executable \"pck\" section not found."
msgstr "No se encuentra la sección ejecutable \"pck\"."
+msgid "Could not create temp directory:"
+msgstr "No se ha podido crear el directorio temporal:"
+
msgid "Can't get filesystem access."
msgstr "No se puede obtener acceso al sistema de archivos."
@@ -9132,6 +9672,13 @@ msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
"PathFollow2D solo funciona cuando está colocado como hijo de un nodo Path2D."
+msgid ""
+"A PhysicalBone2D only works with a Skeleton2D or another PhysicalBone2D as a "
+"parent node!"
+msgstr ""
+"¡Un PhysicalBone2D sólo funciona con un Skeleton2D u otro PhysicalBone2D "
+"como nodo padre!"
+
msgid "Path property must point to a valid Node2D node to work."
msgstr "La propiedad Path debe apuntar a un nodo Node2D válido para funcionar."
@@ -9148,6 +9695,17 @@ msgstr ""
"Este hueso no tiene una pose de DESCANSO adecuada. Ve al nodo Skeleton2D y "
"asígnale una."
+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, "
+"CharacterBody3D, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon3D solo sirve para proporcionar una forma de colisión a un "
+"nodo derivado de CollisionObject3D.\n"
+"Por favor, úsalo solo como hijo de Area3D, StaticBody3D, RigidBody3D, "
+"CharacterBody3D, etc. para darles una forma."
+
msgid "Nothing is visible because no mesh has been assigned."
msgstr "No hay nada visible porque no se ha asignado ninguna malla."
@@ -9157,6 +9715,9 @@ msgstr ""
"No hay nada visible porque no se han asignado mallas para los pases de "
"dibujo."
+msgid "Generating Probe Volumes"
+msgstr "Generando Volúmenes de Sonda"
+
msgid "This body will be ignored until you set a mesh."
msgstr "Este cuerpo será ignorado hasta que se establezca una malla."
@@ -9211,9 +9772,19 @@ msgstr ""
"Clic izq: Aplicar color\n"
"Clic der: Borrar configuración predeterminada"
+msgid ""
+"Color: #%s\n"
+"LMB: Apply color"
+msgstr ""
+"Color: #%s\n"
+"Clic izq: Aplicar color"
+
msgid "Pick a color from the editor window."
msgstr "Selecciona un color de la ventana del editor."
+msgid "Select a picker shape."
+msgstr "Selecciona una forma de selección."
+
msgid "Switch between hexadecimal and code values."
msgstr "Cambiar entre valores hexadecimales y de código."
@@ -9269,6 +9840,15 @@ msgid "(Other)"
msgstr "(Otros)"
msgid ""
+"Setting node name '%s' to be unique within scene for '%s', but it's already "
+"claimed by '%s'.\n"
+"'%s' is no longer set as having a unique name."
+msgstr ""
+"Se está estableciendo el nombre del nodo '%s' para que sea único dentro de "
+"la escena para '%s', pero ya está reclamado por '%s'.\n"
+"'%s' ya no está establecido como un nombre único."
+
+msgid ""
"Default Environment as specified in Project Settings (Rendering -> "
"Environment -> Default Environment) could not be loaded."
msgstr ""
@@ -9295,6 +9875,16 @@ msgstr ""
"El tamaño del Viewport debe ser mayor o igual a 2 píxeles en ambas "
"dimensiones para renderizar cualquier cosa."
+msgid "Unsupported BMFont texture format."
+msgstr "Formato de textura BMFont no compatible."
+
+msgid ""
+"Shader keywords cannot be used as parameter names.\n"
+"Choose another name."
+msgstr ""
+"Las palabras clave de shader no se pueden usar como nombres de parámetro.\n"
+"Elige otro nombre."
+
msgid ""
"The sampler port is connected but not used. Consider changing the source to "
"'SamplerPort'."
@@ -9331,3 +9921,24 @@ msgstr "Asignación a uniform."
msgid "Constants cannot be modified."
msgstr "Las constantes no pueden modificarse."
+
+msgid "Invalid variable type (samplers are not allowed)."
+msgstr "Tipo de variable inválido (los samplers no están permitidos)."
+
+msgid "Expected data type."
+msgstr "Tipo de datos esperado."
+
+msgid "Invalid constant type (samplers are not allowed)."
+msgstr "Tipo de constante inválido (los samplers no están permitidos)."
+
+msgid "Invalid function type (samplers are not allowed)."
+msgstr "Tipo de función inválido (los samplers no están permitidos)."
+
+msgid "Expected a '%s'."
+msgstr "Se esperaba un '%s'."
+
+msgid "Invalid argument name."
+msgstr "Nombre de argumento inválido."
+
+msgid "Invalid macro argument count."
+msgstr "Contador de argumentos de macro inválido."
diff --git a/editor/translations/editor/es_AR.po b/editor/translations/editor/es_AR.po
index a5e4079b72..964b6858b9 100644
--- a/editor/translations/editor/es_AR.po
+++ b/editor/translations/editor/es_AR.po
@@ -552,6 +552,9 @@ msgstr "Desde la Señal:"
msgid "Scene does not contain any script."
msgstr "La escena no contiene ningún script."
+msgid "Select Method"
+msgstr "Seleccionar Método"
+
msgid "Remove"
msgstr "Quitar"
@@ -609,9 +612,6 @@ msgstr "Desconectar"
msgid "Connect a Signal to a Method"
msgstr "Conectar una Señal a un Método"
-msgid "Edit Connection:"
-msgstr "Editar Conexión:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
"¿Estás seguro/a que querés quitar todas las conexiones de la señal \"%s\"?"
@@ -754,23 +754,8 @@ msgstr "Advertencia:"
msgid "Error:"
msgstr "Error:"
-msgid "C++ Error"
-msgstr "Error de C++"
-
-msgid "C++ Error:"
-msgstr "Error de C++:"
-
-msgid "Source"
-msgstr "Fuente"
-
-msgid "C++ Source"
-msgstr "Fuente C++"
-
-msgid "Source:"
-msgstr "Fuente:"
-
-msgid "C++ Source:"
-msgstr "Fuente C++:"
+msgid "%s Error"
+msgstr "Error de %s"
msgid "Stack Trace"
msgstr "Stack Trace"
@@ -781,6 +766,9 @@ msgstr "Copiar Error"
msgid "Open C++ Source on GitHub"
msgstr "Abrir Fuente C++ en GitHub"
+msgid "C++ Source"
+msgstr "Fuente C++"
+
msgid "Video RAM"
msgstr "Mem. de Video"
@@ -1737,12 +1725,12 @@ msgstr "Mostrar Todas las Localizaciones"
msgid "Show Selected Locales Only"
msgstr "Mostrar Sólo las Localizaciones Seleccionadas"
+msgid "Edit Filters"
+msgstr "Editar Filtros"
+
msgid "Language:"
msgstr "Lenguaje:"
-msgid "Script"
-msgstr "Script"
-
msgid "Clear Output"
msgstr "Limpiar Salida"
@@ -2285,24 +2273,6 @@ msgid "Install from file"
msgstr "Instalar desde archivo"
msgid ""
-"This will set up your project for custom Android builds by installing the "
-"source template to \"res://android/build\".\n"
-"You can then apply modifications and build your own custom APK on export "
-"(adding modules, changing the AndroidManifest.xml, etc.).\n"
-"Note that in order to make custom builds instead of using pre-built APKs, "
-"the \"Use Custom Build\" option should be enabled in the Android export "
-"preset."
-msgstr ""
-"Esto va a inicializar tu proyecto para builds de Android personalizados, "
-"instalando la plantilla de origen en \"res://android/build\".\n"
-"Una vez hecho ésto podés aplicar modificaciones y generar tu propio APK "
-"personalizado al exportar (agregar módulos, cambiar el AndroidManifest.xml, "
-"etc.).\n"
-"Tené en cuenta que para generar builds personalizados en vez de usar los "
-"APKs pregenerados, la opcion \"Usar Build Personalizado\" debería estar "
-"activada en el preset de exportación de Android."
-
-msgid ""
"The Android build template is already installed in this project and it won't "
"be overwritten.\n"
"Remove the \"res://android/build\" directory manually before attempting this "
@@ -2523,9 +2493,6 @@ msgstr "Atajos"
msgid "Binding"
msgstr "Binding"
-msgid "%s Error"
-msgstr "Error de %s"
-
msgid "All Devices"
msgstr "Todos los Dispositivos"
@@ -3367,6 +3334,9 @@ msgstr "Seleccionar y mover puntos, crear puntos con click derecho."
msgid "Enable snap and show grid."
msgstr "Activar ajuste y mostrar grilla."
+msgid "Blend:"
+msgstr "Blend:"
+
msgid "Point"
msgstr "Punto"
@@ -3409,15 +3379,9 @@ msgstr "Borrar puntos y triángulos."
msgid "Generate blend triangles automatically (instead of manually)"
msgstr "Generar triángulos de blending automáticamente (en vez de manualmente)"
-msgid "Blend:"
-msgstr "Blend:"
-
msgid "Parameter Changed:"
msgstr "Parámetro Modificado:"
-msgid "Edit Filters"
-msgstr "Editar Filtros"
-
msgid "Output node can't be added to the blend tree."
msgstr "El nodo de salida no puede ser agregado al blend tree."
@@ -3541,9 +3505,6 @@ msgid "Play selected animation backwards from end. (Shift+A)"
msgstr ""
"Reproducir hacia atrás la animación seleccionada desde el final. (Shift+A)"
-msgid "Stop animation playback. (S)"
-msgstr "Detener la reproducción de la animación. (S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "Reproducir animación seleccinada desde el principio. (Shift + D)"
@@ -4708,12 +4669,6 @@ msgstr "Cambiar Notificador AABB"
msgid "Change Particles AABB"
msgstr "Cambiar Particulas AABB"
-msgid "Change Box Shape Extents"
-msgstr "Cambiar Radio de Shape Caja"
-
-msgid "Change Probe Extents"
-msgstr "Cambiar Extensión de Sonda"
-
msgid "Change Capsule Shape Radius"
msgstr "Cambiar Radio de Shape Cápsula"
@@ -5519,6 +5474,9 @@ msgstr "Estándar"
msgid "Connections to method:"
msgstr "Conexiones al método:"
+msgid "Source"
+msgstr "Fuente"
+
msgid "Target"
msgstr "Objetivo"
@@ -5751,12 +5709,6 @@ msgstr "(vacío)"
msgid "Animations:"
msgstr "Animaciones:"
-msgid "Speed:"
-msgstr "Velocidad:"
-
-msgid "Loop"
-msgstr "Loop"
-
msgid "Animation Frames:"
msgstr "Fotogramas de animación:"
@@ -7138,9 +7090,6 @@ msgstr "Agregar Acción de Entrada"
msgid "Change Action deadzone"
msgstr "Cambiar zona muerta de la Acción"
-msgid "Add Input Action Event"
-msgstr "Agregar Evento de Acción de Entrada"
-
msgid "Erase Input Action"
msgstr "Borrar Acción de Entrada"
@@ -7168,9 +7117,6 @@ msgstr "Seleccionar Propiedad"
msgid "Select Virtual Method"
msgstr "Seleccionar Método Virtual"
-msgid "Select Method"
-msgstr "Seleccionar Método"
-
msgid "Batch Rename"
msgstr "Renombrar en Masa"
@@ -7937,13 +7883,6 @@ msgstr "Clave pública inválida para la expansión de APK."
msgid "Invalid package name:"
msgstr "Nombre de paquete inválido:"
-msgid "\"Use Custom Build\" must be enabled to use the plugins."
-msgstr "\"Use Custom Build\" debe estar activado para usar los plugins."
-
-msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled."
-msgstr ""
-"\"Export AAB\" sólo es válido cuando \"Use Custom Build\" está activado."
-
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."
@@ -7987,14 +7926,6 @@ msgid "Unsupported export format!"
msgstr "¡Formato de exportación no soportado!"
msgid ""
-"Trying to build from a custom built template, but no version info for it "
-"exists. Please reinstall from the 'Project' menu."
-msgstr ""
-"Intentando construir a partir de una plantilla personalizada, pero no existe "
-"información de la versión para ello. Por favor, reinstalá desde el menú "
-"'Proyecto'."
-
-msgid ""
"Android build version mismatch: Template installed: %s, Godot version: %s. "
"Please reinstall Android build template from 'Project' menu."
msgstr ""
diff --git a/editor/translations/editor/fi.po b/editor/translations/editor/fi.po
index 96f066c8bd..559817673a 100644
--- a/editor/translations/editor/fi.po
+++ b/editor/translations/editor/fi.po
@@ -533,6 +533,9 @@ msgstr "Signaalista:"
msgid "Scene does not contain any script."
msgstr "Kohtaus ei sisällä skriptiä."
+msgid "Select Method"
+msgstr "Valitse metodi"
+
msgid "Remove"
msgstr "Poista"
@@ -589,9 +592,6 @@ msgstr "Katkaise yhteys"
msgid "Connect a Signal to a Method"
msgstr "Yhdistä signaali metodiin"
-msgid "Edit Connection:"
-msgstr "Muokkaa yhteyttä:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr "Oletko varma, että haluat poistaa kaikki kytkennät signaalilta \"%s\"?"
@@ -734,23 +734,8 @@ msgstr "Varoitus:"
msgid "Error:"
msgstr "Virhe:"
-msgid "C++ Error"
-msgstr "C++ virhe"
-
-msgid "C++ Error:"
-msgstr "C++ virhe:"
-
-msgid "Source"
-msgstr "Lähde"
-
-msgid "C++ Source"
-msgstr "C++ lähdekoodi"
-
-msgid "Source:"
-msgstr "Lähdekoodi:"
-
-msgid "C++ Source:"
-msgstr "C++ lähdekoodi:"
+msgid "%s Error"
+msgstr "%s virhe"
msgid "Stack Trace"
msgstr "Pinojäljitys"
@@ -761,6 +746,9 @@ msgstr "Kopioi virhe"
msgid "Open C++ Source on GitHub"
msgstr "Avaa C++ lähdekoodi GitHubissa"
+msgid "C++ Source"
+msgstr "C++ lähdekoodi"
+
msgid "Video RAM"
msgstr "Näyttömuisti"
@@ -1714,12 +1702,12 @@ msgstr "Näytä kaikki kielialueet"
msgid "Show Selected Locales Only"
msgstr "Näytä vain valitut kielialueet"
+msgid "Edit Filters"
+msgstr "Muokkaa suodattimia"
+
msgid "Language:"
msgstr "Kieli:"
-msgid "Script"
-msgstr "Skripti"
-
msgid "Clear Output"
msgstr "Tyhjennä tuloste"
@@ -2252,23 +2240,6 @@ msgid "Install from file"
msgstr "Asenna tiedostosta"
msgid ""
-"This will set up your project for custom Android builds by installing the "
-"source template to \"res://android/build\".\n"
-"You can then apply modifications and build your own custom APK on export "
-"(adding modules, changing the AndroidManifest.xml, etc.).\n"
-"Note that in order to make custom builds instead of using pre-built APKs, "
-"the \"Use Custom Build\" option should be enabled in the Android export "
-"preset."
-msgstr ""
-"Tämä valmistelee projektisi mukautettuja Android-käännöksiä varten "
-"asentamalla lähdemallin hakemistoon \"res://android/build\".\n"
-"Voit sen jälkeen soveltaa muunnoksia ja kääntää oman räätälöidyn APK:n "
-"vientiin (lisäten moduuleja, muuttaen AndroidManifest.xml tiedostoa, jne.)\n"
-"Huomaa, että tehdäksesi mukautettuja käännöksiä esikäännetyn APK:n "
-"käyttämisen sijaan, \"Use Custom Build\" valinnan tulee olla päällä Android-"
-"viennin esiasetuksissa."
-
-msgid ""
"The Android build template is already installed in this project and it won't "
"be overwritten.\n"
"Remove the \"res://android/build\" directory manually before attempting this "
@@ -2488,9 +2459,6 @@ msgstr "Pikanäppäimet"
msgid "Binding"
msgstr "Sidonta"
-msgid "%s Error"
-msgstr "%s virhe"
-
msgid "All Devices"
msgstr "Kaikki laitteet"
@@ -3352,6 +3320,9 @@ msgstr "Valitse ja siirrä pisteitä, luo pisteitä hiiren oikealla napilla."
msgid "Enable snap and show grid."
msgstr "Aseta tarttuminen ja näytä ruudukko."
+msgid "Blend:"
+msgstr "Sulautus:"
+
msgid "Point"
msgstr "Piste"
@@ -3394,15 +3365,9 @@ msgstr "Poista pisteet ja kolmiot."
msgid "Generate blend triangles automatically (instead of manually)"
msgstr "Luo sulautuskolmiot automaattisesti (manuaalisen sijaan)"
-msgid "Blend:"
-msgstr "Sulautus:"
-
msgid "Parameter Changed:"
msgstr "Parametri muutettu:"
-msgid "Edit Filters"
-msgstr "Muokkaa suodattimia"
-
msgid "Output node can't be added to the blend tree."
msgstr "Lähtösolmua ei voida lisätä sulautuspuuhun."
@@ -3521,9 +3486,6 @@ msgstr "Toista valittu animaatio takaperin nykyisestä kohdasta. (A)"
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "Toista valittu animaatio takaperin lopusta. (Shift+A)"
-msgid "Stop animation playback. (S)"
-msgstr "Lopeta animaation toisto. (S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "Toista valittu animaatio alusta. (Shift+D)"
@@ -4695,12 +4657,6 @@ msgstr "Muuta ilmoittajan AABB"
msgid "Change Particles AABB"
msgstr "Muuta partikkelien AABB"
-msgid "Change Box Shape Extents"
-msgstr "Muuta laatikkomuodon ulottuvuuksia"
-
-msgid "Change Probe Extents"
-msgstr "Muuta Proben ulottuvuuksia"
-
msgid "Change Capsule Shape Radius"
msgstr "Muuta kapselimuodon sädettä"
@@ -5505,6 +5461,9 @@ msgstr "Standardi"
msgid "Connections to method:"
msgstr "Yhteydet metodiin:"
+msgid "Source"
+msgstr "Lähde"
+
msgid "Target"
msgstr "Kohde"
@@ -5745,12 +5704,6 @@ msgstr "(tyhjä)"
msgid "Animations:"
msgstr "Animaatiot:"
-msgid "Speed:"
-msgstr "Nopeus:"
-
-msgid "Loop"
-msgstr "Toista"
-
msgid "Animation Frames:"
msgstr "Animaatioruudut:"
@@ -7143,9 +7096,6 @@ msgstr "Lisää syötetapahtuma"
msgid "Change Action deadzone"
msgstr "Vaihda toiminnon katvealue"
-msgid "Add Input Action Event"
-msgstr "Lisää syötetoiminnon tapahtuma"
-
msgid "Erase Input Action"
msgstr "Tyhjennä syötetoiminto"
@@ -7173,9 +7123,6 @@ msgstr "Valitse ominaisuus"
msgid "Select Virtual Method"
msgstr "Valitse virtuaalinen metodi"
-msgid "Select Method"
-msgstr "Valitse metodi"
-
msgid "Batch Rename"
msgstr "Niputettu uudelleennimeäminen"
@@ -7931,16 +7878,6 @@ msgstr "Virheellinen julkinen avain APK-laajennosta varten."
msgid "Invalid package name:"
msgstr "Virheellinen paketin nimi:"
-msgid "\"Use Custom Build\" must be enabled to use the plugins."
-msgstr ""
-"\"Use Custom Build\" asetuksen täytyy olla päällä, jotta liittännäisiä voi "
-"käyttää."
-
-msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled."
-msgstr ""
-"\"Export AAB\" on käyttökelpoinen vain, kun \"Use Custom Build\" asetus on "
-"päällä."
-
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."
@@ -7989,13 +7926,6 @@ msgid "Unsupported export format!"
msgstr "Vientiformaatti ei ole tuettu!"
msgid ""
-"Trying to build from a custom built template, but no version info for it "
-"exists. Please reinstall from the 'Project' menu."
-msgstr ""
-"Yritetään kääntää mukautetulla käännösmallilla, mutta sillä ei ole "
-"versiotietoa. Ole hyvä ja uudelleenasenna se 'Projekti'-valikosta."
-
-msgid ""
"Android build version mismatch: Template installed: %s, Godot version: %s. "
"Please reinstall Android build template from 'Project' menu."
msgstr ""
diff --git a/editor/translations/editor/fr.po b/editor/translations/editor/fr.po
index bd3d516a44..acb33aecf6 100644
--- a/editor/translations/editor/fr.po
+++ b/editor/translations/editor/fr.po
@@ -101,7 +101,7 @@
# Arnaud Lier <arnaud@ric-rac.org>, 2022.
# Jérémie Guegain <mirejai@orange.fr>, 2022.
# cwulveryck <cwulveryck@online.fr>, 2022.
-# Helix Sir <vincentbarkmann@gmail.com>, 2022.
+# Helix Sir <vincentbarkmann@gmail.com>, 2022, 2023.
# SCHUTZ Lucas <lucas.schutz0954@gmail.com>, 2022.
# EGuillemot <Elouen.Guillemot@gmail.com>, 2022.
# Entiz <maxime.salido@gmail.com>, 2022.
@@ -109,13 +109,17 @@
# Hugo Berthet-Rambaud <hugoberthetrambaud@outlook.com>, 2023.
# Nathan Chambrette <n.chambrette@gmail.com>, 2023.
# slundi <slundi@gmail.com>, 2023.
+# Elouan MAILLY <leloupandco@gmail.com>, 2023.
+# nuclehon <benjamin.deslandes1@gmail.com>, 2023.
+# Siandfrance <Siandfrance@gmail.com>, 2023.
+# Thalya Gauvrit <skar0ps.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-01-14 00:01+0000\n"
-"Last-Translator: slundi <slundi@gmail.com>\n"
+"PO-Revision-Date: 2023-02-10 14:12+0000\n"
+"Last-Translator: Siandfrance <Siandfrance@gmail.com>\n"
"Language-Team: French <https://hosted.weblate.org/projects/godot-engine/"
"godot/fr/>\n"
"Language: fr\n"
@@ -123,20 +127,191 @@ 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.15.1-dev\n"
+"X-Generator: Weblate 4.16-dev\n"
+
+msgid "Unset"
+msgstr "Vider"
msgid "Physical"
msgstr "Physique"
+msgid "Left Mouse Button"
+msgstr "Bouton de souris gauche"
+
+msgid "Right Mouse Button"
+msgstr "Bouton de souris droit"
+
+msgid "Middle Mouse Button"
+msgstr "Clic molette de souris"
+
+msgid "Mouse Wheel Up"
+msgstr "Molette vers le haut"
+
+msgid "Mouse Wheel Down"
+msgstr "Molette vers le bas"
+
+msgid "Mouse Wheel Left"
+msgstr "Molette vers la gauche"
+
+msgid "Mouse Wheel Right"
+msgstr "Molette vers la droite"
+
+msgid "Mouse Thumb Button 1"
+msgstr "Bouton latéral de souris 1"
+
+msgid "Mouse Thumb Button 2"
+msgstr "Bouton latéral de souris 2"
+
msgid "Button"
msgstr "Bouton"
+msgid "Double Click"
+msgstr "Double clic"
+
+msgid "Mouse motion at position (%s) with velocity (%s)"
+msgstr "Mouvement de souris vers la position (%s) avec une vélocité de (%s)"
+
+msgid "Left Stick X-Axis, Joystick 0 X-Axis"
+msgstr "Axe X stick gauche , Axe X Joystick 0"
+
+msgid "Left Stick Y-Axis, Joystick 0 Y-Axis"
+msgstr "Axe Y stick gauche, Axe Y Joystick 0"
+
+msgid "Right Stick X-Axis, Joystick 1 X-Axis"
+msgstr "Axe X stick droit, Axe X Joystick 1"
+
+msgid "Right Stick Y-Axis, Joystick 1 Y-Axis"
+msgstr "Axe Y stick droit, Axe Y Joystick 1"
+
+msgid "Joystick 2 X-Axis, Left Trigger, Sony L2, Xbox LT"
+msgstr "Axe X Joystick 2, Gâchette gauche, L2 Sony, LT Xbox"
+
+msgid "Joystick 2 Y-Axis, Right Trigger, Sony R2, Xbox RT"
+msgstr "Axe Y Joystick 2, Gâchette droite, R2 Sony, RT Xbox"
+
+msgid "Joystick 3 X-Axis"
+msgstr "Axe X du Joystick 3"
+
+msgid "Joystick 3 Y-Axis"
+msgstr "Axe Y du Joystick 3"
+
+msgid "Joystick 4 X-Axis"
+msgstr "Axe X du Joystick 4"
+
+msgid "Joystick 4 Y-Axis"
+msgstr "Axe Y du Joystick 4"
+
+msgid "Unknown Joypad Axis"
+msgstr "Axe de contrôleur inconnu"
+
+msgid "Joypad Motion on Axis %d (%s) with Value %.2f"
+msgstr "Mouvement du contrôleur sur l'axe %d (%s) d'une valeur de %.2f"
+
+msgid "Bottom Action, Sony Cross, Xbox A, Nintendo B"
+msgstr "Action du bas, Croix Sony, A Xbox, B Nintendo"
+
+msgid "Right Action, Sony Circle, Xbox B, Nintendo A"
+msgstr "Action droite, Rond Sony, B Xbox, A Nintendo"
+
+msgid "Left Action, Sony Square, Xbox X, Nintendo Y"
+msgstr "Action gauche, Carré Sony, X Xbox, Y Nintendo"
+
+msgid "Top Action, Sony Triangle, Xbox Y, Nintendo X"
+msgstr "Action du haut, Triangle Sony, Y Xbox, X Nintendo"
+
+msgid "Back, Sony Select, Xbox Back, Nintendo -"
+msgstr "Retour, Select Sony, Back Xbox, - Nintendo"
+
+msgid "Guide, Sony PS, Xbox Home"
+msgstr "Guide, PS Sony, Home Xbox"
+
+msgid "Start, Nintendo +"
+msgstr "Start, + Nintendo"
+
+msgid "Left Stick, Sony L3, Xbox L/LS"
+msgstr "Stick gauche, L3 Sony, L/LS Xbox"
+
+msgid "Right Stick, Sony R3, Xbox R/RS"
+msgstr "Stick droit, R3 Sony, R/RS Xbox"
+
+msgid "Left Shoulder, Sony L1, Xbox LB"
+msgstr "Gâchette haute gauche, L1 Sony, LB Xbox"
+
+msgid "Right Shoulder, Sony R1, Xbox RB"
+msgstr "Gâchette haute droite, R1 Sony, RB Xbox"
+
+msgid "D-pad Up"
+msgstr "Flèche du haut"
+
+msgid "D-pad Down"
+msgstr "Flèche du bas"
+
+msgid "D-pad Left"
+msgstr "Flèche gauche"
+
+msgid "D-pad Right"
+msgstr "Flèche droite"
+
+msgid "Xbox Share, PS5 Microphone, Nintendo Capture"
+msgstr "Share Xbox, Microphone PS5, Capture Nintendo"
+
+msgid "Xbox Paddle 1"
+msgstr "Palette Xbox 1"
+
+msgid "Xbox Paddle 2"
+msgstr "Palette Xbox 2"
+
+msgid "Xbox Paddle 3"
+msgstr "Palette Xbox 3"
+
+msgid "Xbox Paddle 4"
+msgstr "Palette Xbox 4"
+
+msgid "PS4/5 Touchpad"
+msgstr "Pavé tactile PS4/5"
+
+msgid "touched"
+msgstr "Touché"
+
+msgid "released"
+msgstr "Relâché"
+
+msgid "Screen %s at (%s) with %s touch points"
+msgstr "Écran %s à (%s) avec %s points de contact"
+
+msgid ""
+"Screen dragged with %s touch points at position (%s) with velocity of (%s)"
+msgstr ""
+"Écran glissé avec %s points de contact vers la position (%s) avec une "
+"vélocité de (%s)"
+
+msgid "Magnify Gesture at (%s) with factor %s"
+msgstr "Geste d’agrandissement à (%s) avec un facteur de %s"
+
+msgid "Pan Gesture at (%s) with delta (%s)"
+msgstr "Geste de mouvement panoramique à (%s) avec un delta de (%s)"
+
+msgid "MIDI Input on Channel=%s Message=%s"
+msgstr "Entrée MIDI sur le canal=%s Message=%s"
+
+msgid "Input Event with Shortcut=%s"
+msgstr "Événement d’entrée avec raccourci=%s"
+
+msgid "Accept"
+msgstr "Accepter"
+
msgid "Select"
msgstr "Sélectionner"
msgid "Cancel"
msgstr "Annuler"
+msgid "Focus Next"
+msgstr "Cibler suivant"
+
+msgid "Focus Prev"
+msgstr "Cibler précédent"
+
msgid "Left"
msgstr "Gauche"
@@ -149,6 +324,15 @@ msgstr "Monter"
msgid "Down"
msgstr "Descendre"
+msgid "Page Up"
+msgstr "Page Haut"
+
+msgid "Page Down"
+msgstr "Page Bas"
+
+msgid "Home"
+msgstr "Accueil"
+
msgid "End"
msgstr "Fin"
@@ -167,24 +351,75 @@ msgstr "Annuler"
msgid "Redo"
msgstr "Refaire"
+msgid "Completion Query"
+msgstr "Requête de complétion"
+
+msgid "New Line"
+msgstr "Nouvelle ligne"
+
+msgid "New Blank Line"
+msgstr "Nouvelle ligne vide"
+
+msgid "New Line Above"
+msgstr "Nouvelle ligne au dessus"
+
msgid "Indent"
msgstr "Indentation"
+msgid "Dedent"
+msgstr "Désindenter"
+
+msgid "Backspace"
+msgstr "Effacer"
+
+msgid "Backspace Word"
+msgstr "Effacer mot"
+
+msgid "Backspace all to Left"
+msgstr "Effacer tout à gauche"
+
msgid "Delete"
msgstr "Supprimer"
+msgid "Delete Word"
+msgstr "Supprimer mot"
+
+msgid "Delete all to Right"
+msgstr "Tout supprimer à droite"
+
+msgid "Scroll Up"
+msgstr "Défilement vers le haut"
+
+msgid "Scroll Down"
+msgstr "Défilement vers le bas"
+
msgid "Select All"
msgstr "Tout sélectionner"
+msgid "Select Word Under Caret"
+msgstr "Sélectionner les mots sous le caret"
+
+msgid "Add Selection for Next Occurrence"
+msgstr "Ajouter la Sélection pour la Prochaine Occurence"
+
+msgid "Text Submitted"
+msgstr "Texte Proposé"
+
msgid "Duplicate Nodes"
msgstr "Dupliquer le(s) nœud(s)"
msgid "Delete Nodes"
-msgstr "Supprimer des nœuds"
+msgstr "Supprimer le(s) nœud(s)"
+
+msgid "Go Up One Level"
+msgstr "Monter d'un Niveau"
msgid "Refresh"
msgstr "Rafraîchir"
+msgid "Swap Input Direction"
+msgstr "Échanger les Directions d'Entrée"
+
msgid "Invalid input %d (not passed) in expression"
msgstr "Entrée non valide %d (non transmise) dans l’expression"
@@ -206,6 +441,12 @@ msgstr "Arguments invalides pour construire '%s'"
msgid "On call to '%s':"
msgstr "Lors de l’appel à '%s' :"
+msgid "Built-in script"
+msgstr "Script intégré"
+
+msgid "Built-in"
+msgstr "Intégré"
+
msgid "B"
msgstr "o"
@@ -227,27 +468,59 @@ msgstr "Pio"
msgid "EiB"
msgstr "Eio"
+msgid "Example: %s"
+msgstr "Exemple : %s"
+
+msgid "%d item"
+msgid_plural "%d items"
+msgstr[0] "%d élément"
+msgstr[1] "%d éléments"
+
msgid ""
"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'"
msgstr ""
-"Nom d'action invalide. Il ne peut être vide ni contenir « / », « : », « = », "
-"« \\ » ou « \" »"
+"Nom d'action invalide. Elle ne peut être vide ni contenir «/», «:», «=», "
+"«\\» ou «\"»"
msgid "An action with the name '%s' already exists."
msgstr "Une action avec le nom « %s » existe déjà."
msgid "Add Event"
-msgstr "Ajouter évènement"
+msgstr "Ajouter un évènement"
+
+msgid "Remove Action"
+msgstr "Supprimer l'action"
+
+msgid "Cannot Remove Action"
+msgstr "Impossible de Retirer l'Action"
+
+msgid "Edit Event"
+msgstr "Editer l'Évènement"
+
+msgid "Remove Event"
+msgstr "Supprimer l'Évènement"
+
+msgid "Filter by name..."
+msgstr "Filtrer par nom..."
+
+msgid "Clear All"
+msgstr "Tout Effacer"
+
+msgid "Add New Action"
+msgstr "Ajouter une Action"
msgid "Add"
msgstr "Ajouter"
+msgid "Show Built-in Actions"
+msgstr "Afficher les Actions Intégrées"
+
msgid "Action"
msgstr "Action"
msgid "Deadzone"
-msgstr "Zone morte"
+msgstr "Zone Morte"
msgid "Time:"
msgstr "Temps :"
@@ -255,6 +528,9 @@ msgstr "Temps :"
msgid "Value:"
msgstr "Valeur :"
+msgid "Update Selected Key Handles"
+msgstr "Dupliquer la(les) clé(s) sélectionnée(s)"
+
msgid "Insert Key Here"
msgstr "Insérer la clé ici"
@@ -691,6 +967,9 @@ msgstr "Depuis le signal :"
msgid "Scene does not contain any script."
msgstr "La scène ne comprend pas de script."
+msgid "Select Method"
+msgstr "Sélectionner une méthode"
+
msgid "Remove"
msgstr "Supprimer"
@@ -751,9 +1030,6 @@ msgstr "Déconnecter"
msgid "Connect a Signal to a Method"
msgstr "Connecter un signal à une méthode"
-msgid "Edit Connection:"
-msgstr "Modifier la connexion :"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr "Voulez-vous vraiment supprimer toutes les connexions de ce signal ?"
@@ -820,6 +1096,9 @@ msgstr "Instance :"
msgid "Toggle Visibility"
msgstr "Basculer la visibilité"
+msgid "ms"
+msgstr "ms"
+
msgid "Monitors"
msgstr "Moniteurs"
@@ -900,23 +1179,8 @@ msgstr "Avertissement :"
msgid "Error:"
msgstr "Erreur :"
-msgid "C++ Error"
-msgstr "Erreur C++"
-
-msgid "C++ Error:"
-msgstr "Erreur C++ :"
-
-msgid "Source"
-msgstr "Source"
-
-msgid "C++ Source"
-msgstr "Source C++"
-
-msgid "Source:"
-msgstr "Source :"
-
-msgid "C++ Source:"
-msgstr "Source C++ :"
+msgid "%s Error"
+msgstr "Erreur %s"
msgid "Stack Trace"
msgstr "Pile des appels"
@@ -927,6 +1191,9 @@ msgstr "Copier l'erreur"
msgid "Open C++ Source on GitHub"
msgstr "Ouvrir les sources C++ sur GitHub"
+msgid "C++ Source"
+msgstr "Source C++"
+
msgid "Video RAM"
msgstr "Mémoire vidéo"
@@ -1413,6 +1680,9 @@ msgstr "Navigation"
msgid "OpenGL"
msgstr "OpenGL"
+msgid "Vulkan"
+msgstr "Vulkan"
+
msgid "Nodes and Classes:"
msgstr "Nœuds et classes :"
@@ -1742,6 +2012,9 @@ msgstr ""
msgid "(Re)Importing Assets"
msgstr "Ré-importation des assets"
+msgid "Experimental"
+msgstr "Expérimental"
+
msgid "Top"
msgstr "Dessus"
@@ -1908,12 +2181,12 @@ msgstr "Afficher toutes les langues"
msgid "Show Selected Locales Only"
msgstr "Afficher uniquement les langues sélectionnées"
+msgid "Edit Filters"
+msgstr "Modifier les filtres"
+
msgid "Language:"
msgstr "Langage :"
-msgid "Script"
-msgstr "Script"
-
msgid "Variant"
msgstr "Variant"
@@ -2483,24 +2756,6 @@ msgid "Install from file"
msgstr "Installer depuis un fichier"
msgid ""
-"This will set up your project for custom Android builds by installing the "
-"source template to \"res://android/build\".\n"
-"You can then apply modifications and build your own custom APK on export "
-"(adding modules, changing the AndroidManifest.xml, etc.).\n"
-"Note that in order to make custom builds instead of using pre-built APKs, "
-"the \"Use Custom Build\" option should be enabled in the Android export "
-"preset."
-msgstr ""
-"Ceci configurera votre projet pour des compilations Android personnalisées "
-"en installant le modèle source dans \"res://android/build\".\n"
-"Vous pouvez ensuite appliquer des modifications et créer votre propre APK "
-"personnalisé à l'exportation (ajout de modules, modification du fichier "
-"AndroidManifest.xml, etc.).\n"
-"Notez que pour faire des compilations personnalisées au lieu d'utiliser des "
-"APKs préconstruits, l'option \"Use Custom Build\" doit être activée dans le "
-"Preset d'exportation Android."
-
-msgid ""
"The Android build template is already installed in this project and it won't "
"be overwritten.\n"
"Remove the \"res://android/build\" directory manually before attempting this "
@@ -2725,9 +2980,6 @@ msgstr "Raccourcis"
msgid "Binding"
msgstr "Liaison"
-msgid "%s Error"
-msgstr "Erreur %s"
-
msgid "All Devices"
msgstr "Tous les périphérique"
@@ -3676,6 +3928,9 @@ msgstr ""
msgid "Enable snap and show grid."
msgstr "Activer l'aimantation et afficher la grille."
+msgid "Blend:"
+msgstr "Mélange :"
+
msgid "Point"
msgstr "Point"
@@ -3719,15 +3974,9 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
"Générer des triangles de mélange automatiquement (au lieu de manuellement)"
-msgid "Blend:"
-msgstr "Mélange :"
-
msgid "Parameter Changed:"
msgstr "Paramètre modifié :"
-msgid "Edit Filters"
-msgstr "Modifier les filtres"
-
msgid "Output node can't be added to the blend tree."
msgstr "Un nœud de sortie ne peut être ajouté à l'arborescence du mélange."
@@ -3853,9 +4102,6 @@ msgstr ""
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "Lire l'animation sélectionnée à rebours depuis la fin. (Maj+A)"
-msgid "Stop animation playback. (S)"
-msgstr "Arrêter la lecture de l'animation. (S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "Lire l'animation sélectionnée depuis le début. (Maj+D)"
@@ -5107,12 +5353,6 @@ msgstr "Changer le notificateur AABB"
msgid "Change Particles AABB"
msgstr "Changer particules AABB"
-msgid "Change Box Shape Extents"
-msgstr "Changer l'étendue de la forme rectangulaire"
-
-msgid "Change Probe Extents"
-msgstr "Changer les ampleurs de la sonde"
-
msgid "Change Capsule Shape Radius"
msgstr "Changer le rayon de la forme capsule"
@@ -5935,6 +6175,9 @@ msgstr "Standard"
msgid "Connections to method:"
msgstr "Connexions à la méthode :"
+msgid "Source"
+msgstr "Source"
+
msgid "Target"
msgstr "Cible"
@@ -6182,12 +6425,6 @@ msgstr "(vide)"
msgid "Animations:"
msgstr "Animations :"
-msgid "Speed:"
-msgstr "Vitesse :"
-
-msgid "Loop"
-msgstr "Boucle"
-
msgid "Animation Frames:"
msgstr "Trames d'animation :"
@@ -7639,9 +7876,6 @@ msgstr "Ajouter une action d'entrée"
msgid "Change Action deadzone"
msgstr "Modifier la zone morte de l'action"
-msgid "Add Input Action Event"
-msgstr "Ajouter un événement d'action d'entrée"
-
msgid "Erase Input Action"
msgstr "Effacer l'action d'entrée"
@@ -7669,9 +7903,6 @@ msgstr "Sélectionnez une propriété"
msgid "Select Virtual Method"
msgstr "Sélectionner une méthode virtuelle"
-msgid "Select Method"
-msgstr "Sélectionner une méthode"
-
msgid "Batch Rename"
msgstr "Renommer par lot"
@@ -7936,6 +8167,9 @@ msgstr "Enfants modifiables"
msgid "Load As Placeholder"
msgstr "Charger en tant qu'instance temporaire"
+msgid "Auto Expand to Selected"
+msgstr "Étirement auto à la sélection"
+
msgid "Filters"
msgstr "Filtres"
@@ -8480,24 +8714,10 @@ msgstr "Clé publique invalide pour l'expansion APK."
msgid "Invalid package name:"
msgstr "Nom de paquet invalide :"
-msgid "\"Use Custom Build\" must be enabled to use the plugins."
-msgstr "« Use Custom Build » doit être activé pour utiliser les plugins."
-
msgid "\"Passthrough\" is only valid when \"XR Mode\" is \"OpenXR\"."
msgstr ""
"« Passthrough » est valide uniquement lorsque le « Mode XR » est « OpenXR »."
-msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled."
-msgstr ""
-"« Export AAB » est valide uniquement lorsque l'option « Use Custom Build » "
-"est activée."
-
-msgid ""
-"\"Min SDK\" can only be overridden when \"Use Custom Build\" is enabled."
-msgstr ""
-"Changer « Min SDK » est valide uniquement lorsque l'option « Use Custom "
-"Build » est activée."
-
msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid."
msgstr ""
"\"Min SDK\" devrait être un nombre entier valide, mais \"%s\" n'est pas "
@@ -8511,12 +8731,6 @@ msgstr ""
"de Godot."
msgid ""
-"\"Target SDK\" can only be overridden when \"Use Custom Build\" is enabled."
-msgstr ""
-"Changer « Target SDK » est valide uniquement lorsque l'option « Use Custom "
-"Build » est activée."
-
-msgid ""
"\"Target SDK\" should be a valid integer, but got \"%s\" which is invalid."
msgstr ""
"« SDK Cible » devrait être un nombre entier valide, mais « %s » n'en est pas "
@@ -8588,14 +8802,6 @@ msgid "Unsupported export format!"
msgstr "Format d'export non supporté !"
msgid ""
-"Trying to build from a custom built template, but no version info for it "
-"exists. Please reinstall from the 'Project' menu."
-msgstr ""
-"A essayé de construire à partir d'un modèle personnalisé, mais aucune "
-"information de version n'existe pour lui. Veuillez réinstaller à partir du "
-"menu 'Projet'."
-
-msgid ""
"Android build version mismatch: Template installed: %s, Godot version: %s. "
"Please reinstall Android build template from 'Project' menu."
msgstr ""
diff --git a/editor/translations/editor/gl.po b/editor/translations/editor/gl.po
index e6983b7ca9..1617bb9759 100644
--- a/editor/translations/editor/gl.po
+++ b/editor/translations/editor/gl.po
@@ -559,9 +559,6 @@ msgstr "Desconectar"
msgid "Connect a Signal to a Method"
msgstr "Conectar unha Sinal a un Método"
-msgid "Edit Connection:"
-msgstr "Editar Conexión:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr "Está seguro de que quere eliminar tódalas conexións da sinal '%s'?"
@@ -670,24 +667,9 @@ msgstr "Aviso:"
msgid "Error:"
msgstr "Erro:"
-msgid "C++ Error"
-msgstr "Erro de C++"
-
-msgid "C++ Error:"
-msgstr "Erro de C++:"
-
-msgid "Source"
-msgstr "Fonte"
-
msgid "C++ Source"
msgstr "Fonte C++"
-msgid "Source:"
-msgstr "Fonte:"
-
-msgid "C++ Source:"
-msgstr "Fonte C++:"
-
msgid "Continue"
msgstr "Continuar"
@@ -1395,12 +1377,12 @@ msgstr "Amosar Tódolos Linguaxes"
msgid "Show Selected Locales Only"
msgstr "Amosar só os Linguaxes Seleccionados"
+msgid "Edit Filters"
+msgstr "Editar Flitros"
+
msgid "Language:"
msgstr "Linguaxe:"
-msgid "Script"
-msgstr "Script"
-
msgid "Clear Output"
msgstr "Limpar Saída"
@@ -2440,6 +2422,9 @@ msgstr ""
msgid "Enable snap and show grid."
msgstr "Activar axuste de cuadrícula e amosar cuadrícula."
+msgid "Blend:"
+msgstr "Mezcla:"
+
msgid "Point"
msgstr "Punto"
@@ -2449,12 +2434,6 @@ msgstr "Abrir Editor"
msgid "Add Triangle"
msgstr "Engadir Triángulo"
-msgid "Blend:"
-msgstr "Mezcla:"
-
-msgid "Edit Filters"
-msgstr "Editar Flitros"
-
msgid "Node Moved"
msgstr "Nodo Movido"
@@ -3436,6 +3415,9 @@ msgstr "Resultados de Búsqueda"
msgid "Standard"
msgstr "Estándar"
+msgid "Source"
+msgstr "Fonte"
+
msgid "Target"
msgstr "Obxectivo"
@@ -3574,12 +3556,6 @@ msgstr "(baleiro)"
msgid "Animations:"
msgstr "Animacións:"
-msgid "Speed:"
-msgstr "Velocidade:"
-
-msgid "Loop"
-msgstr "Bucle"
-
msgid "Zoom Reset"
msgstr "Restablecer Zoom"
@@ -3918,9 +3894,6 @@ msgstr "Eliminar Elemento"
msgid "Add Input Action"
msgstr "Engadir Acción de Entrada"
-msgid "Add Input Action Event"
-msgstr "Engadir Evento de Entrada"
-
msgid "Erase Input Action"
msgstr "Eliminar Acción de Entrada"
@@ -4137,11 +4110,6 @@ msgstr ""
"O Keystore Release non está configurado correctamente nos axustes de "
"exportación."
-msgid "\"Use Custom Build\" must be enabled to use the plugins."
-msgstr ""
-"\"Use Custom Build\" debe estar activado para usar estas características "
-"adicionais (plugins)."
-
msgid "Building Android Project (gradle)"
msgstr "Construir Proxecto Android (gradle)"
diff --git a/editor/translations/editor/he.po b/editor/translations/editor/he.po
index 35c9a664f8..69c13a071d 100644
--- a/editor/translations/editor/he.po
+++ b/editor/translations/editor/he.po
@@ -19,7 +19,7 @@
# Guy Dadon <guydadon14@gmail.com>, 2020.
# bruvzg <bruvzg13@gmail.com>, 2020.
# Omer I.S. <omeritzicschwartz@gmail.com>, 2021.
-# Ram Tourgeman <ramtorgeman@gmail.com>, 2021.
+# Ram Tourgeman <ramtorgeman@gmail.com>, 2021, 2023.
# Shailee Eliyahu <dev.sle.il@gmail.com>, 2021.
# Mati Borlak <matiborlak@gmail.com>, 2022.
# Tamir Livneh <fkeyzuwu@gmail.com>, 2022.
@@ -32,8 +32,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-01-01 05:48+0000\n"
-"Last-Translator: Yoni m <yoni.meirov08@gmail.com>\n"
+"PO-Revision-Date: 2023-02-08 07:34+0000\n"
+"Last-Translator: Ram Tourgeman <ramtorgeman@gmail.com>\n"
"Language-Team: Hebrew <https://hosted.weblate.org/projects/godot-engine/"
"godot/he/>\n"
"Language: he\n"
@@ -42,11 +42,20 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && "
"n % 10 == 0) ? 2 : 3));\n"
-"X-Generator: Weblate 4.15.1-dev\n"
+"X-Generator: Weblate 4.16-dev\n"
+
+msgid "Unset"
+msgstr "ביטול הגדרה"
msgid "Physical"
msgstr "פיזי"
+msgid "Left Mouse Button"
+msgstr "לחצן עכבר שמ×לי"
+
+msgid "Right Mouse Button"
+msgstr "כפתור עכבר ימני"
+
msgid "Button"
msgstr "כפתור"
@@ -587,9 +596,6 @@ msgstr "ניתוק"
msgid "Connect a Signal to a Method"
msgstr "חבר ×ות לשיטה (מתודה)"
-msgid "Edit Connection:"
-msgstr "עריכת חיבור:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr "×”×× ×תה בטוח ש×תה רוצה להסיר ×ת כל ×”×—×™×‘×•×¨×™× ×ž×”×ות \"%s\"?"
@@ -704,27 +710,15 @@ msgstr "×זהרה:"
msgid "Error:"
msgstr "שגי××”:"
-msgid "C++ Error"
-msgstr "שגי×ת C++"
-
-msgid "C++ Error:"
-msgstr "שגי×ת C++ :"
-
-msgid "C++ Source"
-msgstr "מקור C++"
-
-msgid "Source:"
-msgstr "מקור:"
-
-msgid "C++ Source:"
-msgstr "מקור C++ :"
-
msgid "Stack Trace"
msgstr "מחסנית מעקב"
msgid "Copy Error"
msgstr "שגי×ת העתקה"
+msgid "C++ Source"
+msgstr "מקור C++"
+
msgid "Video RAM"
msgstr "זיכרון ויד×ו"
@@ -1617,8 +1611,8 @@ msgstr "הוצמד %s"
msgid "Unpinned %s"
msgstr "בוטלה ההצמדה של %s"
-msgid "Script"
-msgstr "סקריפט"
+msgid "Edit Filters"
+msgstr "עריכת מסנני×"
msgid "Clear Output"
msgstr "ניקוי פלט"
@@ -2069,22 +2063,6 @@ msgstr "חסרה תבנית בנייה ל×נדרו×יד, × × ×œ×”×ª×§×™×Ÿ ת×
msgid "Manage Templates"
msgstr "ניהול תבניות"
-msgid ""
-"This will set up your project for custom Android builds by installing the "
-"source template to \"res://android/build\".\n"
-"You can then apply modifications and build your own custom APK on export "
-"(adding modules, changing the AndroidManifest.xml, etc.).\n"
-"Note that in order to make custom builds instead of using pre-built APKs, "
-"the \"Use Custom Build\" option should be enabled in the Android export "
-"preset."
-msgstr ""
-"פעולה זו תגדיר ×ת ×”×ž×™×–× ×©×œ×š לבניית ×נדרו×יד מות×מת ×ישית על ידי התקנת תבנית "
-"המקור ל- \"res://android/build\".\n"
-"ל×חר מכן ×פשר להחיל ×©×™× ×•×™×™× ×•×œ×‘× ×•×ª APK מות×× ×ישית ×‘×™×™×¦×•× (הוספת מודולי×, "
-"שינוי AndroidManifest.xml, וכו').\n"
-"כדי לערוך בנייה מות×מת ×ישית ×‘×ž×§×•× ×©×™×ž×•×© בתבנית קיימת, יש ל×פשר ×ת \"השתמש "
-"בבניה מות×מת ×ישית\" בהגדרות ×”×™×™×¦×•× ×œ×נדרו×יד."
-
msgid "Import Templates From ZIP File"
msgstr "×™×™×‘×•× ×ª×‘× ×™×•×ª מקובץ ZIP"
@@ -2449,9 +2427,6 @@ msgstr "×œ× × ×™×ª×Ÿ להשתמש בסוג מפרק ×–×”. רק מפרקי שו×
msgid "Triangle already exists."
msgstr "המשולש כבר קיי×."
-msgid "Edit Filters"
-msgstr "עריכת מסנני×"
-
msgid "Set Animation"
msgstr "קביעת הנפשה"
@@ -2530,9 +2505,6 @@ msgstr "ניגון ל×חור של ההנפשה שנבחרה ×ž×”×ž×™×§×•× ×”× 
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "ניגון ל×חור של ההנפשה שנבחרה מהסוף. (Shift+A)"
-msgid "Stop animation playback. (S)"
-msgstr "עצירת ניגון ההנפשה. (S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "ניגון ההנפשה שנבחרה מההתחלה. (Shift+D)"
@@ -2881,12 +2853,6 @@ msgstr "שינוי מודיע AABB"
msgid "Change Particles AABB"
msgstr "שינוי ×—×œ×§×™×§×™× AABB"
-msgid "Change Box Shape Extents"
-msgstr "שינוי הרחבות של צורת תיבה"
-
-msgid "Change Probe Extents"
-msgstr "שינוי הרחבות בדיקה"
-
msgid "Change Capsule Shape Radius"
msgstr "שינוי רדיוס לצורת קפסולה"
@@ -3221,9 +3187,6 @@ msgstr "הסרת כל נקודות העצירה"
msgid "Delete Animation?"
msgstr "מחיקת ×נימציה?"
-msgid "Loop"
-msgstr "לול××”"
-
msgid "Zoom Reset"
msgstr "×יפוס התקריב"
@@ -3825,16 +3788,6 @@ msgstr "מפתח ציבורי ×œ× ×—×•×§×™ להרחבת APK."
msgid "Invalid package name:"
msgstr "×©× ×—×‘×™×œ×” ×œ× ×—×•×§×™:"
-msgid "\"Use Custom Build\" must be enabled to use the plugins."
-msgstr "חובה ל×פשר ״שימוש בבניה מות×מת ×ישית״ כדי להשתמש בתוספי×."
-
-msgid ""
-"Trying to build from a custom built template, but no version info for it "
-"exists. Please reinstall from the 'Project' menu."
-msgstr ""
-"מנסה לבנות מתבנית מות×מת ×ישית, ×ך ×œ× ×§×™×™× ×ž×™×“×¢ על גירסת הבניה. × × ×œ×”×ª×§×™×Ÿ "
-"מחדש מתפריט 'Project'."
-
msgid "Building Android Project (gradle)"
msgstr "בניית ×ž×™×–× ×נדרו×יד (gradle)"
diff --git a/editor/translations/editor/hu.po b/editor/translations/editor/hu.po
index d0fb2d0226..9736973adc 100644
--- a/editor/translations/editor/hu.po
+++ b/editor/translations/editor/hu.po
@@ -509,6 +509,9 @@ msgstr "Jelzésből:"
msgid "Scene does not contain any script."
msgstr "A jelenet nem tartalmaz szkriptet."
+msgid "Select Method"
+msgstr "Metódus kiválasztása"
+
msgid "Remove"
msgstr "Eltávolítás"
@@ -565,9 +568,6 @@ msgstr "Leválasztás"
msgid "Connect a Signal to a Method"
msgstr "Jelzés csatlakoztatása metódushoz"
-msgid "Edit Connection:"
-msgstr "Kapcsolat szerkesztése:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr "Biztosan eltávolítja az összes kapcsolatot a(z) \"%s\" jelzésről?"
@@ -664,27 +664,12 @@ msgstr "Hívások"
msgid "Error:"
msgstr "Hiba:"
-msgid "C++ Error"
-msgstr "C++ hiba"
-
-msgid "C++ Error:"
-msgstr "C++ hiba:"
-
-msgid "Source"
-msgstr "Forrás"
+msgid "Copy Error"
+msgstr "Hiba Másolása"
msgid "C++ Source"
msgstr "C++ forrás"
-msgid "Source:"
-msgstr "Forrás:"
-
-msgid "C++ Source:"
-msgstr "C++ forrás:"
-
-msgid "Copy Error"
-msgstr "Hiba Másolása"
-
msgid "Skip Breakpoints"
msgstr "Töréspontok kihagyása"
@@ -1474,12 +1459,12 @@ msgstr "Tömb átméretezése"
msgid "Set Multiple:"
msgstr "Többszörös beállítása:"
+msgid "Edit Filters"
+msgstr "Szűrők Szerkesztése"
+
msgid "Language:"
msgstr "Nyelv:"
-msgid "Script"
-msgstr "Szkript"
-
msgid "Clear Output"
msgstr "Kimenet törlése"
@@ -2536,6 +2521,9 @@ msgstr "Betöltés..."
msgid "Enable snap and show grid."
msgstr "Illesztés engedélyezése és rács megjelenítése."
+msgid "Blend:"
+msgstr "Keverés:"
+
msgid "Point"
msgstr "Pont"
@@ -2557,12 +2545,6 @@ msgstr "Automatikus háromszögek be- és kikapcsolása"
msgid "Erase points and triangles."
msgstr "Pontok és háromszögek törlése."
-msgid "Blend:"
-msgstr "Keverés:"
-
-msgid "Edit Filters"
-msgstr "Szűrők Szerkesztése"
-
msgid "Set Animation"
msgstr "Animáció beállítása"
@@ -2642,9 +2624,6 @@ msgstr ""
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "A kiválasztott animáció lejátszása visszafelé a végétől. (Shift + A)"
-msgid "Stop animation playback. (S)"
-msgstr "Animáció lejátszásának leállítása. (S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "A kiválasztott animáció lejátszása az elejétől. (Shift + D)"
@@ -3862,6 +3841,9 @@ msgstr "Alapértelmezett"
msgid "Connections to method:"
msgstr "Kapcsolatok a metódushoz:"
+msgid "Source"
+msgstr "Forrás"
+
msgid "Go to Function"
msgstr "Ugrás függvényre"
@@ -3973,9 +3955,6 @@ msgstr "Animáció Törlése?"
msgid "Animations:"
msgstr "Animációk:"
-msgid "Loop"
-msgstr "Ciklus"
-
msgid "Animation Frames:"
msgstr "Animációs Képkockák:"
@@ -4159,9 +4138,6 @@ msgstr "Bővítmények"
msgid "Select Virtual Method"
msgstr "Virtuális metódus kiválasztása"
-msgid "Select Method"
-msgstr "Metódus kiválasztása"
-
msgid "Batch Rename"
msgstr "Csoportos átnevezés"
diff --git a/editor/translations/editor/id.po b/editor/translations/editor/id.po
index 9bc669b7d2..bfed9e654b 100644
--- a/editor/translations/editor/id.po
+++ b/editor/translations/editor/id.po
@@ -24,7 +24,7 @@
# 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.
+# zephyroths <ridho.hikaru@gmail.com>, 2020, 2021, 2022, 2023.
# Richard Urban <redasuio1@gmail.com>, 2020.
# yusuf afandi <afandi.yusuf.04@gmail.com>, 2020, 2022.
# Habib Rohman <revolusi147id@gmail.com>, 2020.
@@ -42,13 +42,14 @@
# FellowMustard <rachmawanng33@gmail.com>, 2022.
# Muhammad Zainal Abidin <eviepk12@gmail.com>, 2022.
# adfriz <aditiyaafrizal2@gmail.com>, 2023.
+# Taufiq Rahman <pxpiksy@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-01-04 10:47+0000\n"
-"Last-Translator: adfriz <aditiyaafrizal2@gmail.com>\n"
+"PO-Revision-Date: 2023-02-09 09:37+0000\n"
+"Last-Translator: zephyroths <ridho.hikaru@gmail.com>\n"
"Language-Team: Indonesian <https://hosted.weblate.org/projects/godot-engine/"
"godot/id/>\n"
"Language: id\n"
@@ -56,14 +57,68 @@ 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.15.1-dev\n"
+"X-Generator: Weblate 4.16-dev\n"
+
+msgid "Unset"
+msgstr "Batal disetel"
msgid "Physical"
msgstr "(Secara fisik)"
+msgid "Left Mouse Button"
+msgstr "Tombol kiri Mouse"
+
+msgid "Right Mouse Button"
+msgstr "Tombol kanan Mouse"
+
msgid "Button"
msgstr "Tombol"
+msgid "Left Stick X-Axis, Joystick 0 X-Axis"
+msgstr "Stick Kiri Sumbu X, Joystick 0 Sumbu X"
+
+msgid "Joystick 3 X-Axis"
+msgstr "Joystick 3 Sumbu X"
+
+msgid "Joystick 3 Y-Axis"
+msgstr "Joystick 3 Sumbu Y"
+
+msgid "Joystick 4 X-Axis"
+msgstr "Joystick 4 Sumbu X"
+
+msgid "Joystick 4 Y-Axis"
+msgstr "Joystick 4 Sumbu Y"
+
+msgid "Unknown Joypad Axis"
+msgstr "Sumbu Joypad Tidak Dikenal"
+
+msgid "Joypad Motion on Axis %d (%s) with Value %.2f"
+msgstr "Gerakan Joypad pada Sumbu %d (%s) dengan Nilai %.2f"
+
+msgid "Bottom Action, Sony Cross, Xbox A, Nintendo B"
+msgstr "Aksi Bawah, Sony Cross, Xbox A, Nintendo B"
+
+msgid "Right Action, Sony Circle, Xbox B, Nintendo A"
+msgstr "Tindakan Benar, Sony Circle, Xbox B, Nintendo A"
+
+msgid "Left Action, Sony Square, Xbox X, Nintendo Y"
+msgstr "Aksi Kiri, Sony Square, Xbox X, Nintendo Y"
+
+msgid "Top Action, Sony Triangle, Xbox Y, Nintendo X"
+msgstr "Aksi Teratas, Segitiga Sony, Xbox Y, Nintendo X"
+
+msgid "Back, Sony Select, Xbox Back, Nintendo -"
+msgstr "Kembali, Sony Select, Xbox Kembali, Nintendo -"
+
+msgid "Guide, Sony PS, Xbox Home"
+msgstr "Panduan, Sony PS, Xbox Home"
+
+msgid "Start, Nintendo +"
+msgstr "Mulai, Nintendo +"
+
+msgid "Right Shoulder, Sony R1, Xbox RB"
+msgstr "Bahu Kanan, Sony R1, Xbox RB"
+
msgid "Select"
msgstr "Pilih"
@@ -577,6 +632,9 @@ msgstr "Dari Sinyal:"
msgid "Scene does not contain any script."
msgstr "Skena tidak berisi skrip apapun."
+msgid "Select Method"
+msgstr "Pilih Method/Fungsi"
+
msgid "Remove"
msgstr "Hapus"
@@ -633,9 +691,6 @@ msgstr "Putuskan"
msgid "Connect a Signal to a Method"
msgstr "Hubungkan Sinyal ke Method"
-msgid "Edit Connection:"
-msgstr "Sunting Koneksi:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr "Anda yakin ingin menghapus semua hubungan dari sinyal '%s'?"
@@ -777,23 +832,8 @@ msgstr "Peringatan:"
msgid "Error:"
msgstr "Error:"
-msgid "C++ Error"
-msgstr "Error C++"
-
-msgid "C++ Error:"
-msgstr "Error C++ :"
-
-msgid "Source"
-msgstr "Sumber"
-
-msgid "C++ Source"
-msgstr "Kode Sumber C++"
-
-msgid "Source:"
-msgstr "Sumber:"
-
-msgid "C++ Source:"
-msgstr "Sumber C++ :"
+msgid "%s Error"
+msgstr "%s Error"
msgid "Stack Trace"
msgstr "Jejak Tumpukan"
@@ -804,6 +844,9 @@ msgstr "Salin Error"
msgid "Open C++ Source on GitHub"
msgstr "Buka Sumber C++ di GitHub"
+msgid "C++ Source"
+msgstr "Kode Sumber C++"
+
msgid "Video RAM"
msgstr "RAM Video"
@@ -1608,6 +1651,9 @@ msgstr "Properti"
msgid "default:"
msgstr "baku:"
+msgid "Operators"
+msgstr "Operato."
+
msgid "Theme Properties"
msgstr "Properti Tema"
@@ -1630,9 +1676,15 @@ msgstr ""
"Untuk saat ini tidak ada deskripsi properti ini. Tolong bantu kita "
"dengan[color=$color][url=$url]kontribusi[/url][/color]!"
+msgid "Constructor Descriptions"
+msgstr "Deskripsi Konstruktor"
+
msgid "Method Descriptions"
msgstr "Deskripsi Method"
+msgid "Operator Descriptions"
+msgstr "Deskripsi Operator"
+
msgid "%d match."
msgstr "Ditemukan %d kecocokan."
@@ -1735,12 +1787,12 @@ msgstr "Tampilkan Semua Pelokalan"
msgid "Show Selected Locales Only"
msgstr "Tampilkan Hanya Pelokalan yang Dipilih"
+msgid "Edit Filters"
+msgstr "Sunting Filter"
+
msgid "Language:"
msgstr "Bahasa:"
-msgid "Script"
-msgstr "Skrip"
-
msgid "Variant"
msgstr "Varian"
@@ -2160,6 +2212,9 @@ msgstr "Proyek"
msgid "Project Settings..."
msgstr "Pengaturan Proyek…"
+msgid "Project Settings"
+msgstr "Pengaturan Proyek"
+
msgid "Version Control"
msgstr "Kontrol Versi"
@@ -2278,24 +2333,6 @@ msgid "Install from file"
msgstr "Install dari file"
msgid ""
-"This will set up your project for custom Android builds by installing the "
-"source template to \"res://android/build\".\n"
-"You can then apply modifications and build your own custom APK on export "
-"(adding modules, changing the AndroidManifest.xml, etc.).\n"
-"Note that in order to make custom builds instead of using pre-built APKs, "
-"the \"Use Custom Build\" option should be enabled in the Android export "
-"preset."
-msgstr ""
-"Ini akan mengatur proyek Anda untuk build Android khusus dengan memasang "
-"templat sumber ke \"res://android/build\".\n"
-"Anda kemudian dapat menerapkan modifikasi dan membangun APK khusus Anda "
-"sendiri pada saat ekspor (menambahkan modul, mengubah AndroidManifest.xml, "
-"dll.).\n"
-"Perhatikan bahwa untuk membuat build khusus alih-alih menggunakan APK yang "
-"sudah dibuat sebelumnya, opsi \"Use Custom 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"
"Remove the \"res://android/build\" directory manually before attempting this "
@@ -2514,9 +2551,6 @@ msgstr "Tombol Pintasan"
msgid "Binding"
msgstr "Mengikat"
-msgid "%s Error"
-msgstr "%s Error"
-
msgid "All Devices"
msgstr "Semua Perangkat"
@@ -3344,6 +3378,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 "Blend:"
+msgstr "Campur:"
+
msgid "Point"
msgstr "Titik"
@@ -3386,15 +3423,9 @@ msgstr "Hapus titik-titik dan segi tiga."
msgid "Generate blend triangles automatically (instead of manually)"
msgstr "Buat segi tiga pembauran secara otomatis (sebagai ganti cara manual)"
-msgid "Blend:"
-msgstr "Campur:"
-
msgid "Parameter Changed:"
msgstr "Parameter Berubah:"
-msgid "Edit Filters"
-msgstr "Sunting Filter"
-
msgid "Output node can't be added to the blend tree."
msgstr "Node keluaran tidak bisa ditambahkan ke pohon campur."
@@ -3513,9 +3544,6 @@ 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 "Stop animation playback. (S)"
-msgstr "Hentikan playback animasi. (S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "Mainkan animasi terpilih dari awal. (Shift+D)"
@@ -4664,12 +4692,6 @@ msgstr "Ubah AABB Notifier"
msgid "Change Particles AABB"
msgstr "Ubah Partikel AABB"
-msgid "Change Box Shape Extents"
-msgstr "Ubah Batas Box Shape"
-
-msgid "Change Probe Extents"
-msgstr "Ubah Batas Probe"
-
msgid "Change Capsule Shape Radius"
msgstr "Ubah Radius Shape Kapsul"
@@ -5470,6 +5492,9 @@ msgstr "Standar"
msgid "Connections to method:"
msgstr "Hubungan dengan fungsi:"
+msgid "Source"
+msgstr "Sumber"
+
msgid "Target"
msgstr "Sasaran"
@@ -5701,12 +5726,6 @@ msgstr "(kosong)"
msgid "Animations:"
msgstr "Animasi:"
-msgid "Speed:"
-msgstr "Kecepatan:"
-
-msgid "Loop"
-msgstr "Pengulangan"
-
msgid "Animation Frames:"
msgstr "Frame Animasi:"
@@ -6833,6 +6852,28 @@ msgstr "Hapus semua"
msgid "Also delete project contents (no undo!)"
msgstr "Hapus juga konten proyek (tidak dapat dibatalkan!)"
+msgid ""
+"This option will perform full project conversion, updating scenes, resources "
+"and scripts from Godot 3.x to work in Godot 4.0.\n"
+"\n"
+"Note that this is a best-effort conversion, i.e. it makes upgrading the "
+"project easier, but it will not open out-of-the-box and will still require "
+"manual adjustments.\n"
+"\n"
+"IMPORTANT: Make sure to backup your project before converting, as this "
+"operation makes it impossible to open it in older versions of Godot."
+msgstr ""
+"Opsi ini akan melakukan konversi proyek menyeluruh, pembaharuan scene, "
+"resource, dan script dari Godot 3.x agar dapat bekerja di Godot 4.0.\n"
+"\n"
+"Catat bahwa ini adalah usaha terbaik untuk mengonversi, seperti mempermudah "
+"upgrade proyek, tapi tidak berarti out-of-the-box dan masih memerlukan "
+"pengaturan manual.\n"
+"\n"
+"PENTING: Pastikan untuk membackup proyek anda sebelum konversi, karena "
+"tindakan ini akan membuat proyek tidak dapat dibuka pada versi Godot yang "
+"lebih lama."
+
msgid "Can't run project"
msgstr "Tidak dapat menjalankan proyek"
@@ -6843,18 +6884,21 @@ msgstr ""
"Saat ini Anda tidak memiliki proyek apa pun.\n"
"Apakah Anda ingin menjelajahi contoh proyek resmi di Perpustakaan Aset?"
+msgid "Add Project Setting"
+msgstr "Tambahkan Setelan Proyek"
+
msgid "Delete Item"
msgstr "Hapus Item"
+msgid "(All)"
+msgstr "(Semua)"
+
msgid "Add Input Action"
msgstr "Tampah Aksi Input"
msgid "Change Action deadzone"
msgstr "Ubah deadzone Aksi"
-msgid "Add Input Action Event"
-msgstr "Tambah Input Action Event"
-
msgid "Erase Input Action"
msgstr "Hapus Aksi Input"
@@ -6882,9 +6926,6 @@ msgstr "Pilih Properti"
msgid "Select Virtual Method"
msgstr "Pilih Method/Fungsi Virtual"
-msgid "Select Method"
-msgstr "Pilih Method/Fungsi"
-
msgid "Batch Rename"
msgstr "Ubah Nama Massal"
@@ -7625,13 +7666,6 @@ msgstr "Kunci Publik untuk ekspansi APK tidak valid."
msgid "Invalid package name:"
msgstr "Nama paket tidak valid:"
-msgid "\"Use Custom Build\" must be enabled to use the plugins."
-msgstr "\"Gunakan Build Custom\" harus diaktifkan untuk menggunakan plugin."
-
-msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled."
-msgstr ""
-"\"Expor AAB\" hanya bisa valid ketika \"Gunakan Build Custom\" diaktifkan."
-
msgid "Signing release %s..."
msgstr "Menandatangani rilis %s..."
@@ -7654,13 +7688,6 @@ msgid "Unsupported export format!"
msgstr "Format ekspor tidak didukung!"
msgid ""
-"Trying to build from a custom built template, but no version info for it "
-"exists. Please reinstall from the 'Project' menu."
-msgstr ""
-"Mencoba untuk membangun dari templat build khusus, tapi tidak ada informasi "
-"versinya. Silakan pasang ulang dari menu 'Proyek'."
-
-msgid ""
"Android build version mismatch: Template installed: %s, Godot version: %s. "
"Please reinstall Android build template from 'Project' menu."
msgstr ""
diff --git a/editor/translations/editor/it.po b/editor/translations/editor/it.po
index bae2ce1159..87c578b8d1 100644
--- a/editor/translations/editor/it.po
+++ b/editor/translations/editor/it.po
@@ -37,9 +37,9 @@
# Stefano Merazzi <asso99@hotmail.com>, 2019.
# Sinapse X <sinapsex13@gmail.com>, 2019.
# Micila Micillotto <micillotto@gmail.com>, 2019, 2020, 2021, 2022.
-# Mirko Soppelsa <miknsop@gmail.com>, 2019, 2020, 2021, 2022.
+# Mirko Soppelsa <miknsop@gmail.com>, 2019, 2020, 2021, 2022, 2023.
# No <kingofwizards.kw7@gmail.com>, 2019.
-# StarFang208 <polaritymanx@yahoo.it>, 2019.
+# StarFang208 <polaritymanx@yahoo.it>, 2019, 2023.
# Katia Piazza <gydey@ridiculousglitch.com>, 2019, 2021.
# nickfla1 <lanterniniflavio@gmail.com>, 2019.
# Fabio Iotti <fabiogiopla@gmail.com>, 2020.
@@ -77,13 +77,16 @@
# Silvia Scaglione <sissisoad@gmail.com>, 2022.
# Cosimo Davide Viggiano <cosimod089@gmail.com>, 2022.
# Francesco Cammarata <francescocammarata.fr@gmail.com>, 2022.
+# enzo cocca <enzo.ccc@gmail.com>, 2023.
+# Andrea Migliaccio <andrea.migliaccio@gmail.com>, 2023.
+# gianmarco malandra <giamminho12@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-01-15 13:34+0000\n"
-"Last-Translator: Damiano Guida <damiano.guida22@gmail.com>\n"
+"PO-Revision-Date: 2023-02-10 00:54+0000\n"
+"Last-Translator: gianmarco malandra <giamminho12@gmail.com>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/"
"godot/it/>\n"
"Language: it\n"
@@ -91,14 +94,59 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.15.1-dev\n"
+"X-Generator: Weblate 4.16-dev\n"
+
+msgid "Unset"
+msgstr "Non Impostato"
msgid "Physical"
msgstr "Fisico"
+msgid "Left Mouse Button"
+msgstr "Tasto sinistro Mouse"
+
+msgid "Right Mouse Button"
+msgstr "Tasto Destro Mouse"
+
+msgid "Middle Mouse Button"
+msgstr "Tasto centrale Mouse"
+
+msgid "Mouse Wheel Up"
+msgstr "Rotellina Mouse Su."
+
+msgid "Mouse Wheel Down"
+msgstr "Rotellina Mouse Giù."
+
+msgid "Mouse Wheel Left"
+msgstr "Pulsante Rotellina a Sinistra"
+
+msgid "Mouse Wheel Right"
+msgstr "Pulsante Rotellina a Destra"
+
+msgid "Mouse Thumb Button 1"
+msgstr "Pulsante Laterale del Mouse 1"
+
+msgid "Mouse Thumb Button 2"
+msgstr "Pulsante Laterale del Mouse 2"
+
msgid "Button"
msgstr "Pulsante"
+msgid "Mouse motion at position (%s) with velocity (%s)"
+msgstr "Movimento del mouse in posizione (%s) con velocità (%s)"
+
+msgid "Left Stick X-Axis, Joystick 0 X-Axis"
+msgstr "Levetta sinistra asse X, joystick 0 asse X"
+
+msgid "Left Stick Y-Axis, Joystick 0 Y-Axis"
+msgstr "Levetta sinistra asse Y, joystick 0 asse y"
+
+msgid "Right Stick X-Axis, Joystick 1 X-Axis"
+msgstr "Levetta destra asse X, joystick 1 asse x"
+
+msgid "Right Stick Y-Axis, Joystick 1 Y-Axis"
+msgstr "Levetta destra Asse-Y, Joystick 1 Asse-Y"
+
msgid "Select"
msgstr "Seleziona"
@@ -648,6 +696,9 @@ msgstr "Dal segnale:"
msgid "Scene does not contain any script."
msgstr "La scena non contiene alcuno script."
+msgid "Select Method"
+msgstr "Seleziona Metodo"
+
msgid "Remove"
msgstr "Rimuovi"
@@ -705,9 +756,6 @@ msgstr "Disconnetti"
msgid "Connect a Signal to a Method"
msgstr "Connetti un segnale a un metodo"
-msgid "Edit Connection:"
-msgstr "Modifica una connessione:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr "Sei sicuro di voler rimuovere tutte le connessioni dal segnale \"%s\"?"
@@ -852,23 +900,8 @@ msgstr "Attenzione:"
msgid "Error:"
msgstr "Errore:"
-msgid "C++ Error"
-msgstr "Errore C++"
-
-msgid "C++ Error:"
-msgstr "Errore C++:"
-
-msgid "Source"
-msgstr "Sorgente"
-
-msgid "C++ Source"
-msgstr "Sorgente C++"
-
-msgid "Source:"
-msgstr "Sorgente:"
-
-msgid "C++ Source:"
-msgstr "Sorgente C++:"
+msgid "%s Error"
+msgstr "Errore %s"
msgid "Stack Trace"
msgstr "Analisi dello stack"
@@ -879,6 +912,9 @@ msgstr "Copia Errore"
msgid "Open C++ Source on GitHub"
msgstr "Apri Sorgente C++ su Github"
+msgid "C++ Source"
+msgstr "Sorgente C++"
+
msgid "Video RAM"
msgstr "RAM Video"
@@ -1705,6 +1741,12 @@ msgstr "sovrascrive %s:"
msgid "default:"
msgstr "predefinito:"
+msgid "Constructors"
+msgstr "Costruttori"
+
+msgid "Operators"
+msgstr "Operatori"
+
msgid "Theme Properties"
msgstr "Proprietà del tema"
@@ -1739,9 +1781,15 @@ msgstr ""
"Al momento non esiste alcuna descrizione per questa proprietà. Aiutaci "
"[color=$color][url=$url]aggiungendone una[/url][/color]!"
+msgid "Constructor Descriptions"
+msgstr "Descrizione del costruttore"
+
msgid "Method Descriptions"
msgstr "Descrizioni del metodo"
+msgid "Operator Descriptions"
+msgstr "Descrizione degli operatori"
+
msgid "%d match."
msgstr "%d corrispondenze."
@@ -1844,12 +1892,12 @@ msgstr "Mostra tutte le lingue"
msgid "Show Selected Locales Only"
msgstr "Mostra solo le lingue selezionate"
+msgid "Edit Filters"
+msgstr "Modifica Filtri"
+
msgid "Language:"
msgstr "Lingua:"
-msgid "Script"
-msgstr "Script"
-
msgid "Variant"
msgstr "Variante"
@@ -2413,24 +2461,6 @@ msgid "Install from file"
msgstr "Installa da un file"
msgid ""
-"This will set up your project for custom Android builds by installing the "
-"source template to \"res://android/build\".\n"
-"You can then apply modifications and build your own custom APK on export "
-"(adding modules, changing the AndroidManifest.xml, etc.).\n"
-"Note that in order to make custom builds instead of using pre-built APKs, "
-"the \"Use Custom Build\" option should be enabled in the Android export "
-"preset."
-msgstr ""
-"Questo predisporrà il progetto alle costruzioni personalizzate per Android "
-"installando il modello di sorgente in \"res://android/build\".\n"
-"Sarà allora possibile applicare delle modifiche e costruire un APK "
-"personalizzato durante l'esportazione (aggiungere moduli, cambiare "
-"l'AndroidManifest.xml, eccetera).\n"
-"Va notato che per creare delle costruzioni personalizzate, invece di usare "
-"gli APK pre-costruiti, va attivata l'opzione \"Use Custom Build\" nella "
-"preimpostazione d'esportazione per Android."
-
-msgid ""
"The Android build template is already installed in this project and it won't "
"be overwritten.\n"
"Remove the \"res://android/build\" directory manually before attempting this "
@@ -2657,9 +2687,6 @@ msgstr "Scorciatoie"
msgid "Binding"
msgstr "Associazione"
-msgid "%s Error"
-msgstr "Errore %s"
-
msgid "All Devices"
msgstr "Tutti i Dispositivi"
@@ -3600,6 +3627,9 @@ msgstr ""
msgid "Enable snap and show grid."
msgstr "Abilita lo scatto e mostra la griglia."
+msgid "Blend:"
+msgstr "Blend:"
+
msgid "Point"
msgstr "Punto"
@@ -3642,15 +3672,9 @@ msgstr "Cancella punti e triangoli."
msgid "Generate blend triangles automatically (instead of manually)"
msgstr "Genera i triangoli di fusione automaticamente (anziché manualmente)"
-msgid "Blend:"
-msgstr "Blend:"
-
msgid "Parameter Changed:"
msgstr "Parametro modificato:"
-msgid "Edit Filters"
-msgstr "Modifica Filtri"
-
msgid "Output node can't be added to the blend tree."
msgstr "Il nodo in output non può essere aggiunto al BlendTree."
@@ -3776,9 +3800,6 @@ msgstr ""
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "Esegui la seguente animazione al contrario dalla fine. (Shift+A)"
-msgid "Stop animation playback. (S)"
-msgstr "Ferma il playback dell'animazione. (S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "Esegui la seguente l'animazione dall'inizio. (Shift+D)"
@@ -5011,12 +5032,6 @@ msgstr "Cambia notificatore AABB"
msgid "Change Particles AABB"
msgstr "Cambia AABB Particelle"
-msgid "Change Box Shape Extents"
-msgstr "Cambia Ampiezza Box Shape"
-
-msgid "Change Probe Extents"
-msgstr "Cambia Estensione Probe"
-
msgid "Change Capsule Shape Radius"
msgstr "Cambia Raggio Capsule Shape"
@@ -5828,6 +5843,9 @@ msgstr "Standard"
msgid "Connections to method:"
msgstr "Connessioni al metodo:"
+msgid "Source"
+msgstr "Sorgente"
+
msgid "Target"
msgstr "Target"
@@ -6075,12 +6093,6 @@ msgstr "(vuoto)"
msgid "Animations:"
msgstr "Animazioni:"
-msgid "Speed:"
-msgstr "Velocità:"
-
-msgid "Loop"
-msgstr "Loop"
-
msgid "Animation Frames:"
msgstr "Frame Animazione:"
@@ -6795,6 +6807,9 @@ msgstr "Luce"
msgid "Process"
msgstr "Processa"
+msgid "Sky"
+msgstr "Cielo"
+
msgid "Fog"
msgstr "Nebbia"
@@ -7503,9 +7518,6 @@ msgstr "Aggiungi Azione di Input"
msgid "Change Action deadzone"
msgstr "Cambia la zona morta d'azione"
-msgid "Add Input Action Event"
-msgstr "Aggiungi Evento di Azione Input"
-
msgid "Erase Input Action"
msgstr "Cancella Azione di Input"
@@ -7533,9 +7545,6 @@ msgstr "Seleziona Proprietà"
msgid "Select Virtual Method"
msgstr "Seleziona Metodo Virtuale"
-msgid "Select Method"
-msgstr "Seleziona Metodo"
-
msgid "Batch Rename"
msgstr "Rinomina in blocco"
@@ -8324,24 +8333,11 @@ msgstr "Chiave pubblica non valida per l'espansione dell'APK."
msgid "Invalid package name:"
msgstr "Nome del pacchetto non valido:"
-msgid "\"Use Custom Build\" must be enabled to use the plugins."
-msgstr "Per utilizzare i plugin \"Use Custom Build\" deve essere abilitato."
-
msgid "\"Passthrough\" is only valid when \"XR Mode\" is \"OpenXR\"."
msgstr ""
"\"Oltrepassaggio\" è valido solo quando \"Modalità XR\" è impostato su "
"\"OpenXR\"."
-msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled."
-msgstr ""
-"\"Export AAB\" è valido soltanto quanto \"Use Custom Build\" è abilitato."
-
-msgid ""
-"\"Min SDK\" can only be overridden when \"Use Custom Build\" is enabled."
-msgstr ""
-"\"Min SDK\" può essere sovrascritto solo se \"Utilizza Build "
-"Personalizzata\" è abilitato."
-
msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid."
msgstr ""
"\"Min SDK\" dovrebbe essere un intero valido, ma si è ottenuto \"%s\" che è "
@@ -8355,12 +8351,6 @@ msgstr ""
"dalla libreria Godot."
msgid ""
-"\"Target SDK\" can only be overridden when \"Use Custom Build\" is enabled."
-msgstr ""
-"\"Target SDK\" può essere sovrascritto solo se \"Utilizza Build "
-"Personalizzata\" è abilitato."
-
-msgid ""
"\"Target SDK\" should be a valid integer, but got \"%s\" which is invalid."
msgstr ""
"\"Target SDK\" dovrebbe essere un intero valido, ma si è ottenuto \"%s\" che "
@@ -8426,14 +8416,6 @@ msgid "Unsupported export format!"
msgstr "Formato d'esportazione non supportato!"
msgid ""
-"Trying to build from a custom built template, but no version info for it "
-"exists. Please reinstall from the 'Project' menu."
-msgstr ""
-"Tentato di costruire da un template build personalizzato, ma nessuna "
-"informazione sulla sua versione esiste. Per favore, reinstallalo dal menu "
-"\"Progetto\"."
-
-msgid ""
"Android build version mismatch: Template installed: %s, Godot version: %s. "
"Please reinstall Android build template from 'Project' menu."
msgstr ""
diff --git a/editor/translations/editor/ja.po b/editor/translations/editor/ja.po
index b580b05f44..f24c55d10f 100644
--- a/editor/translations/editor/ja.po
+++ b/editor/translations/editor/ja.po
@@ -4,7 +4,7 @@
# This file is distributed under the same license as the Godot source code.
# akirakido <achts.y@gmail.com>, 2016-2017, 2018, 2019.
# D_first <dntk.daisei@gmail.com>, 2017, 2018.
-# Daisuke Saito <d.saito@coriginate.com>, 2017, 2018.
+# Daisuke Saito <d.saito@coriginate.com>, 2017, 2018, 2023.
# h416 <shinichiro.hirama@gmail.com>, 2017.
# hopping tappy (ãŸã£ã´ã•ã‚“) <hopping.tappy@gmail.com>, 2016-2017, 2018.
# Jun Shiozawa <haresecret@gmail.com>, 2017, 2018, 2020.
@@ -47,13 +47,15 @@
# Narazaki Shuji <shujinarazaki@protonmail.com>, 2022.
# ta ko <neji.cion@gmail.com>, 2022.
# T K <kidaaam@gmail.com>, 2022, 2023.
+# MizunagiKB <mizukb@live.jp>, 2023.
+# Saitos <purifyzombie@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-01-20 10:19+0000\n"
-"Last-Translator: T K <kidaaam@gmail.com>\n"
+"PO-Revision-Date: 2023-02-10 00:54+0000\n"
+"Last-Translator: Saitos <purifyzombie@gmail.com>\n"
"Language-Team: Japanese <https://hosted.weblate.org/projects/godot-engine/"
"godot/ja/>\n"
"Language: ja\n"
@@ -61,20 +63,189 @@ 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.15.1\n"
+"X-Generator: Weblate 4.16-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 "Mouse Wheel Left"
+msgstr "マウス左ホイール"
+
+msgid "Mouse Wheel Right"
+msgstr "マウスå³ãƒ›ã‚¤ãƒ¼ãƒ«"
+
+msgid "Mouse Thumb Button 1"
+msgstr "マウスボタン1"
+
+msgid "Mouse Thumb Button 2"
+msgstr "マウスボタン2"
+
msgid "Button"
msgstr "Button"
+msgid "Double Click"
+msgstr "ダブルクリック"
+
+msgid "Mouse motion at position (%s) with velocity (%s)"
+msgstr "速度 (%s) ã§ã®ä½ç½® (%s) ã§ã®ãƒžã‚¦ã‚¹ã®å‹•ã"
+
+msgid "Left Stick X-Axis, Joystick 0 X-Axis"
+msgstr "左スティック X軸ã€ã‚¸ãƒ§ã‚¤ã‚¹ãƒ†ã‚£ãƒƒã‚¯0 X軸"
+
+msgid "Left Stick Y-Axis, Joystick 0 Y-Axis"
+msgstr "左スティック Y軸ã€ã‚¸ãƒ§ã‚¤ã‚¹ãƒ†ã‚£ãƒƒã‚¯0 Y軸"
+
+msgid "Right Stick X-Axis, Joystick 1 X-Axis"
+msgstr "å³ã‚¹ãƒ†ã‚£ãƒƒã‚¯ X軸ã€ã‚¸ãƒ§ã‚¤ã‚¹ãƒ†ã‚£ãƒƒã‚¯1 X軸"
+
+msgid "Right Stick Y-Axis, Joystick 1 Y-Axis"
+msgstr "å³ã‚¹ãƒ†ã‚£ãƒƒã‚¯ Y軸ã€ã‚¸ãƒ§ã‚¤ã‚¹ãƒ†ã‚£ãƒƒã‚¯1 Y軸"
+
+msgid "Joystick 2 X-Axis, Left Trigger, Sony L2, Xbox LT"
+msgstr "ジョイスティック2 X軸ã€å·¦ãƒˆãƒªã‚¬ãƒ¼ã€Sony L2ã€Xbox LT"
+
+msgid "Joystick 2 Y-Axis, Right Trigger, Sony R2, Xbox RT"
+msgstr "ジョイスティック2 Y軸ã€å³ãƒˆãƒªã‚¬ãƒ¼ã€Sony R2ã€Xbox RT"
+
+msgid "Joystick 3 X-Axis"
+msgstr "ジョイスティック3 X軸"
+
+msgid "Joystick 3 Y-Axis"
+msgstr "ジョイスティック3 Y軸"
+
+msgid "Joystick 4 X-Axis"
+msgstr "ジョイスティック4 X軸"
+
+msgid "Joystick 4 Y-Axis"
+msgstr "ジョイスティック4 Y軸"
+
+msgid "Unknown Joypad Axis"
+msgstr "ä¸æ˜Žãªã‚¸ãƒ§ã‚¤ãƒ‘ッド軸"
+
+msgid "Joypad Motion on Axis %d (%s) with Value %.2f"
+msgstr "値 %.2f ã®è»¸ %d (%s) ã®ã‚¸ãƒ§ã‚¤ãƒ‘ッド モーション"
+
+msgid "Bottom Action, Sony Cross, Xbox A, Nintendo B"
+msgstr "下アクションã€ã‚½ãƒ‹ãƒ¼âœ•ã€Xbox Aã€Nintendo B"
+
+msgid "Right Action, Sony Circle, Xbox B, Nintendo A"
+msgstr "å³ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã€ã‚½ãƒ‹ãƒ¼â—‹ã€Xbox B,Nintendo A"
+
+msgid "Left Action, Sony Square, Xbox X, Nintendo Y"
+msgstr "左アクションã€ã‚½ãƒ‹ãƒ¼â–¡ã€Xbox Xã€Nintendo Y"
+
+msgid "Top Action, Sony Triangle, Xbox Y, Nintendo X"
+msgstr "上アクション, ソニー△, Xbox Y, Nintendo X"
+
+msgid "Back, Sony Select, Xbox Back, Nintendo -"
+msgstr "Back, ソニー Select, Xbox Back, Nintendo -"
+
+msgid "Guide, Sony PS, Xbox Home"
+msgstr "ガイド, Sony PS, Xbox Home"
+
+msgid "Start, Nintendo +"
+msgstr "スタート, Nintendo +"
+
+msgid "Left Stick, Sony L3, Xbox L/LS"
+msgstr "左スティック, ソニー L3, Xbox L/LS"
+
+msgid "Right Stick, Sony R3, Xbox R/RS"
+msgstr "å³ã‚¹ãƒ†ã‚£ãƒƒã‚¯, ソニー R3, Xbox R/RS"
+
+msgid "Left Shoulder, Sony L1, Xbox LB"
+msgstr "左ショルダー, ソニー L1, Xbox LB"
+
+msgid "Right Shoulder, Sony R1, Xbox RB"
+msgstr "å³ã‚·ãƒ§ãƒ«ãƒ€ãƒ¼, ソニー R1, Xbox RB"
+
+msgid "D-pad Up"
+msgstr "D-pad 上"
+
+msgid "D-pad Down"
+msgstr "D-pad 下"
+
+msgid "D-pad Left"
+msgstr "D-pad å·¦"
+
+msgid "D-pad Right"
+msgstr "D-pad å³"
+
+msgid "Xbox Share, PS5 Microphone, Nintendo Capture"
+msgstr "Xbox シェア, PS5 マイク, Nintendo キャプãƒãƒ£"
+
+msgid "Xbox Paddle 1"
+msgstr "Xbox パドル 1"
+
+msgid "Xbox Paddle 2"
+msgstr "Xbox パドル 2"
+
+msgid "Xbox Paddle 3"
+msgstr "Xbox パドル 3"
+
+msgid "Xbox Paddle 4"
+msgstr "Xbox パドル 4"
+
+msgid "PS4/5 Touchpad"
+msgstr "PS4/5 タッãƒãƒ‘ッド"
+
+msgid "touched"
+msgstr "タッãƒ"
+
+msgid "released"
+msgstr "リリース"
+
+msgid "Screen %s at (%s) with %s touch points"
+msgstr "ç”»é¢ %s (%s) 㧠%s 個ã®ã‚¿ãƒƒãƒãƒã‚¤ãƒ³ãƒˆ"
+
+msgid ""
+"Screen dragged with %s touch points at position (%s) with velocity of (%s)"
+msgstr "ä½ç½® (%s) ã§é€Ÿåº¦ (%s) ã® %s 個ã®ã‚¿ãƒƒãƒãƒã‚¤ãƒ³ãƒˆã§ç”»é¢ã‚’ドラッグã—ã¾ã—ãŸ"
+
+msgid "Magnify Gesture at (%s) with factor %s"
+msgstr "拡大ジェスãƒãƒ£ãƒ¼(%s)ã§å€çŽ‡ %sã«ã—ã¾ã™"
+
+msgid "Pan Gesture at (%s) with delta (%s)"
+msgstr "パンジェスãƒãƒ£ãƒ¼ (%s) 㧠デルタを (%s)ã«ã—ã¾ã™"
+
+msgid "MIDI Input on Channel=%s Message=%s"
+msgstr "MIDI入力 ãƒãƒ£ãƒ³ãƒãƒ«=%s メッセージ=%s"
+
+msgid "Input Event with Shortcut=%s"
+msgstr "入力イベント ショートカット=%s"
+
+msgid "Accept"
+msgstr "決定"
+
msgid "Select"
msgstr "é¸æŠž"
msgid "Cancel"
msgstr "キャンセル"
+msgid "Focus Next"
+msgstr "次ã«ãƒ•ã‚©ãƒ¼ã‚«ã‚¹"
+
+msgid "Focus Prev"
+msgstr "å‰ã¸ãƒ•ã‚©ãƒ¼ã‚«ã‚¹"
+
msgid "Left"
msgstr "å·¦"
@@ -87,6 +258,15 @@ msgstr "上り"
msgid "Down"
msgstr "下り"
+msgid "Page Up"
+msgstr "Page Up"
+
+msgid "Page Down"
+msgstr "Page Down"
+
+msgid "Home"
+msgstr "Home"
+
msgid "End"
msgstr "終り"
@@ -105,24 +285,126 @@ msgstr "å…ƒã«æˆ»ã™"
msgid "Redo"
msgstr "ã‚„ã‚Šç›´ã™"
+msgid "Completion Query"
+msgstr "自動補完"
+
+msgid "New Line"
+msgstr "改行"
+
+msgid "New Blank Line"
+msgstr "æ–°ã—ã„空白行"
+
+msgid "New Line Above"
+msgstr "上ã«æ”¹è¡Œ"
+
msgid "Indent"
msgstr "インデント"
+msgid "Dedent"
+msgstr "デデント"
+
+msgid "Backspace"
+msgstr "ãƒãƒƒã‚¯ã‚¹ãƒšãƒ¼ã‚¹"
+
+msgid "Backspace Word"
+msgstr "ãƒãƒƒã‚¯ã‚¹ãƒšãƒ¼ã‚¹æ–‡å­—"
+
+msgid "Backspace all to Left"
+msgstr "ãƒãƒƒã‚¯ã‚¹ãƒšãƒ¼ã‚¹ã‚’ã™ã¹ã¦å·¦ã«"
+
msgid "Delete"
msgstr "削除"
+msgid "Delete Word"
+msgstr "文字を削除"
+
+msgid "Delete all to Right"
+msgstr "å³å´ã‚’ã™ã¹ã¦å‰Šé™¤"
+
+msgid "Caret Left"
+msgstr "キャレット・レフト"
+
+msgid "Caret Word Left"
+msgstr "キャレットワードレフト"
+
+msgid "Caret Right"
+msgstr "キャレットライト"
+
+msgid "Caret Word Right"
+msgstr "キャレットワードライト"
+
+msgid "Caret Up"
+msgstr "キャレットアップ"
+
+msgid "Caret Down"
+msgstr "キャレットダウン"
+
+msgid "Caret Line Start"
+msgstr "キャレット行ã®é–‹å§‹"
+
+msgid "Caret Line End"
+msgstr "キャレット行末"
+
+msgid "Caret Page Up"
+msgstr "キャレット Page Up"
+
+msgid "Caret Page Down"
+msgstr "キャレット Page Down"
+
+msgid "Caret Document Start"
+msgstr "キャレット ドキュメントã®é–‹å§‹"
+
+msgid "Caret Document End"
+msgstr "キャレット ドキュメント終了"
+
+msgid "Caret Add Below"
+msgstr "キャレットを下ã«è¿½åŠ "
+
+msgid "Caret Add Above"
+msgstr "キャレットã®ä¸Šã«è¿½åŠ "
+
+msgid "Scroll Up"
+msgstr "上スクロール"
+
+msgid "Scroll Down"
+msgstr "下スクロール"
+
msgid "Select All"
msgstr "ã™ã¹ã¦é¸æŠž"
+msgid "Select Word Under Caret"
+msgstr "キャレットã®ä¸‹ã«ã‚る文字をé¸æŠž"
+
+msgid "Add Selection for Next Occurrence"
+msgstr "次ã®ã‚ªã‚«ãƒ¬ãƒ³ã‚¹ã®é¸æŠžé …目を追加"
+
+msgid "Clear Carets and Selection"
+msgstr "キャレットã¨é¸æŠžã‚’クリア"
+
+msgid "Toggle Insert Mode"
+msgstr "インサートモードを切り替ãˆã‚‹"
+
+msgid "Text Submitted"
+msgstr "é€ä¿¡ã•ã‚ŒãŸãƒ†ã‚­ã‚¹ãƒˆ"
+
msgid "Duplicate Nodes"
msgstr "ノードを複製"
msgid "Delete Nodes"
msgstr "ノードを削除"
+msgid "Go Up One Level"
+msgstr "レベルを1ã¤ä¸Šã’ã‚‹"
+
msgid "Refresh"
msgstr "å†èª­ã¿è¾¼ã¿"
+msgid "Show Hidden"
+msgstr "éžè¡¨ç¤ºã‚’表示"
+
+msgid "Swap Input Direction"
+msgstr "入力方å‘ã®å…¥ã‚Œæ›¿ãˆ"
+
msgid "Invalid input %d (not passed) in expression"
msgstr "å¼ã«ç„¡åŠ¹å…¥åŠ› %d (渡ã•ã‚Œã¦ã„ã¾ã›ã‚“)"
@@ -144,6 +426,12 @@ msgstr "'%s' を構築ã™ã‚‹ãŸã‚ã®å¼•æ•°ãŒç„¡åŠ¹ã§ã™"
msgid "On call to '%s':"
msgstr "'%s' ã®å‘¼ã³å‡ºã—時:"
+msgid "Built-in script"
+msgstr "組ã¿è¾¼ã¿ã‚¹ã‚¯ãƒªãƒ—ト"
+
+msgid "Built-in"
+msgstr "ビルトイン"
+
msgid "B"
msgstr "B"
@@ -165,6 +453,13 @@ msgstr "PiB"
msgid "EiB"
msgstr "EiB"
+msgid "Example: %s"
+msgstr "例: %s"
+
+msgid "%d item"
+msgid_plural "%d items"
+msgstr[0] "%d é …ç›®"
+
msgid ""
"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'"
@@ -178,9 +473,33 @@ msgstr "'%s' ã¨ã„ã†åå‰ã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ãŒã™ã§ã«å­˜åœ¨ã—ã¾ã™ã€‚"
msgid "Add Event"
msgstr "イベントを追加"
+msgid "Remove Action"
+msgstr "アクションã®é™¤åŽ»"
+
+msgid "Cannot Remove Action"
+msgstr "アクションを除去ã§ãã¾ã›ã‚“"
+
+msgid "Edit Event"
+msgstr "イベントã®ç·¨é›†"
+
+msgid "Remove Event"
+msgstr "イベントã®é™¤åŽ»"
+
+msgid "Filter by name..."
+msgstr "åå‰ã§ãƒ•ã‚£ãƒ«ã‚¿..."
+
+msgid "Clear All"
+msgstr "ã™ã¹ã¦ã‚¯ãƒªã‚¢"
+
+msgid "Add New Action"
+msgstr "æ–°ã—ã„アクションã®è¿½åŠ "
+
msgid "Add"
msgstr "追加"
+msgid "Show Built-in Actions"
+msgstr "組ã¿è¾¼ã¿ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’表示"
+
msgid "Action"
msgstr "アクション(Action)"
@@ -193,6 +512,9 @@ msgstr "時間:"
msgid "Value:"
msgstr "値:"
+msgid "Update Selected Key Handles"
+msgstr "é¸æŠžã—ãŸã‚­ãƒ¼ãƒãƒ³ãƒ‰ãƒ«ã®æ›´æ–°"
+
msgid "Insert Key Here"
msgstr "ã“ã“ã«ã‚­ãƒ¼ã‚’挿入"
@@ -202,21 +524,98 @@ msgstr "é¸æŠžä¸­ã®ã‚­ãƒ¼ã‚’複製"
msgid "Delete Selected Key(s)"
msgstr "é¸æŠžä¸­ã®ã‚­ãƒ¼ã‚’削除"
+msgid "Make Handles Free"
+msgstr "フリーãƒãƒ³ãƒ‰ãƒ«ã‚’作æˆ"
+
+msgid "Make Handles Linear"
+msgstr "ç·šå½¢ãƒãƒ³ãƒ‰ãƒ«ã‚’作æˆ"
+
+msgid "Make Handles Balanced"
+msgstr "ãƒãƒ©ãƒ³ã‚¹ãƒãƒ³ãƒ‰ãƒ«ã‚’作æˆ"
+
+msgid "Make Handles Mirrored"
+msgstr "ミラーãƒãƒ³ãƒ‰ãƒ«ã‚’作æˆ"
+
+msgid "Make Handles Balanced (Auto Tangent)"
+msgstr "ãƒãƒ©ãƒ³ã‚¹ãƒãƒ³ãƒ‰ãƒ«ã‚’ä½œæˆ (自動タンジェント)"
+
+msgid "Make Handles Mirrored (Auto Tangent)"
+msgstr "ミラーãƒãƒ³ãƒ‰ãƒ«ã‚’ä½œæˆ (自動タンジェント)"
+
msgid "Add Bezier Point"
msgstr "ベジェãƒã‚¤ãƒ³ãƒˆã‚’追加"
msgid "Move Bezier Points"
msgstr "ベジェãƒã‚¤ãƒ³ãƒˆã‚’移動"
+msgid "Animation Duplicate Keys"
+msgstr "アニメーションã®ã‚­ãƒ¼ã‚’複製"
+
+msgid "Animation Delete Keys"
+msgstr "アニメーションã®ã‚­ãƒ¼ã‚’削除"
+
+msgid "Focus"
+msgstr "フォーカス"
+
+msgid "Select All Keys"
+msgstr "ã™ã¹ã¦ã®ã‚­ãƒ¼ã‚’é¸æŠž"
+
+msgid "Deselect All Keys"
+msgstr "ã™ã¹ã¦ã®ã‚­ãƒ¼ã®é¸æŠžã‚’解除"
+
+msgid "Animation Change Transition"
+msgstr "アニメーションã®ãƒˆãƒ©ãƒ³ã‚¸ã‚·ãƒ§ãƒ³ã‚’変更"
+
+msgid "Animation Change %s"
+msgstr "アニメーション %s ã«å¤‰æ›´"
+
+msgid "Animation Change Keyframe Value"
+msgstr "アニメーションキーフレームã®å€¤ã‚’変更"
+
+msgid "Animation Change Call"
+msgstr "アニメーション呼ã³å‡ºã—ã®å¤‰æ›´"
+
+msgid "Animation Multi Change Transition"
+msgstr "アニメーションã®ãƒˆãƒ©ãƒ³ã‚¸ã‚·ãƒ§ãƒ³ã‚’複数変更"
+
+msgid "Animation Multi Change %s"
+msgstr "アニメーション%sã«è¤‡æ•°å¤‰æ›´"
+
+msgid "Animation Multi Change Keyframe Value"
+msgstr "アニメーションキーフレームã®å€¤ã‚’複数変更"
+
+msgid "Animation Multi Change Call"
+msgstr "アニメーション呼ã³å‡ºã—を複数変更"
+
msgid "Change Animation Length"
msgstr "アニメーションã®é•·ã•ã‚’変更"
msgid "Change Animation Loop"
msgstr "アニメーションã®ãƒ«ãƒ¼ãƒ—を変更"
+msgid "Can't change loop mode on animation instanced from imported scene."
+msgstr ""
+"インãƒãƒ¼ãƒˆã—ãŸã‚·ãƒ¼ãƒ³ã‹ã‚‰ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹åŒ–ã—ãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®ãƒ«ãƒ¼ãƒ—モードãŒå¤‰æ›´"
+"ã§ãã¾ã›ã‚“。"
+
+msgid "Can't change loop mode on animation embedded in another scene."
+msgstr "別ã®ã‚·ãƒ¼ãƒ³ã«åŸ‹ã‚è¾¼ã¾ã‚ŒãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®ãƒ«ãƒ¼ãƒ—モードを変更ã§ãã¾ã›ã‚“。"
+
msgid "Property Track"
msgstr "プロパティトラック"
+msgid "3D Position Track"
+msgstr "3Dãƒã‚¸ã‚·ãƒ§ãƒ³ãƒˆãƒ©ãƒƒã‚¯"
+
+msgid "3D Rotation Track"
+msgstr "3D 回転トラック"
+
+msgid "3D Scale Track"
+msgstr "3Dスケールトラック"
+
+msgid "Blend Shape Track"
+msgstr "ブレンドシェイプトラック"
+
msgid "Call Method Track"
msgstr "メソッド呼ã³å‡ºã—トラック"
@@ -247,6 +646,9 @@ msgstr "関数:"
msgid "Audio Clips:"
msgstr "オーディオクリップ:"
+msgid "Animation Clips:"
+msgstr "アニメーションクリップ:"
+
msgid "Change Track Path"
msgstr "トラックパスを変更"
@@ -277,6 +679,9 @@ msgstr "回転:"
msgid "Scale:"
msgstr "スケール:"
+msgid "Blend Shape:"
+msgstr "形状ã®ãƒ–レンド:"
+
msgid "Type:"
msgstr "åž‹:"
@@ -292,6 +697,18 @@ msgstr "インãƒãƒ³ãƒ‰ãƒ«:"
msgid "Out-Handle:"
msgstr "アウトãƒãƒ³ãƒ‰ãƒ«:"
+msgid "Handle mode: Free\n"
+msgstr "ãƒãƒ³ãƒ‰ãƒ«ãƒ¢ãƒ¼ãƒ‰: フリー\n"
+
+msgid "Handle mode: Linear\n"
+msgstr "ãƒãƒ³ãƒ‰ãƒ«ãƒ¢ãƒ¼ãƒ‰: ç·šå½¢\n"
+
+msgid "Handle mode: Balanced\n"
+msgstr "ãƒãƒ³ãƒ‰ãƒ«ãƒ¢ãƒ¼ãƒ‰: ãƒãƒ©ãƒ³ã‚¹\n"
+
+msgid "Handle mode: Mirrored\n"
+msgstr "ãƒãƒ³ãƒ‰ãƒ«ãƒ¢ãƒ¼ãƒ‰: ミラー\n"
+
msgid "Stream:"
msgstr "ストリーム:"
@@ -325,6 +742,12 @@ msgstr "リニア"
msgid "Cubic"
msgstr "キュービック"
+msgid "Linear Angle"
+msgstr "直線角"
+
+msgid "Cubic Angle"
+msgstr "立方角"
+
msgid "Clamp Loop Interp"
msgstr "ループ補間をクランプ"
@@ -352,12 +775,28 @@ msgstr "アニメーション補間モードã®å¤‰æ›´"
msgid "Change Animation Loop Mode"
msgstr "アニメーションã®ãƒ«ãƒ¼ãƒ—モードを変更"
+msgid ""
+"Compressed tracks can't be edited or removed. Re-import the animation with "
+"compression disabled in order to edit."
+msgstr ""
+"圧縮ã•ã‚ŒãŸãƒˆãƒ©ãƒƒã‚¯ã¯ã€ç·¨é›†ã‚„削除ã¯ã§ãã¾ã›ã‚“。編集ã™ã‚‹ã«ã¯ã€åœ§ç¸®ã‚’無効ã«ã—ã¦"
+"アニメーションをå†ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¦ãã ã•ã„。"
+
msgid "Remove Anim Track"
msgstr "アニメーショントラックを除去"
+msgid "Create new track for %s and insert key?"
+msgstr "%s ã®æ–°è¦ãƒˆãƒ©ãƒƒã‚¯ã‚’作æˆã—ã€ã‚­ãƒ¼ã‚’挿入ã—ã¾ã™ã‹ï¼Ÿ"
+
+msgid "Create %d new tracks and insert keys?"
+msgstr "%d æ–°è¦ãƒˆãƒ©ãƒƒã‚¯ã‚’作æˆã—ã€ã‚­ãƒ¼ã‚’挿入ã—ã¾ã™ã‹ï¼Ÿ"
+
msgid "Create"
msgstr "作æˆ"
+msgid "Animation Insert Key"
+msgstr "アニメーションキーを挿入"
+
msgid "node '%s'"
msgstr "ノード '%s'"
@@ -378,6 +817,13 @@ msgstr "アニメーションã®ã‚¹ãƒ†ãƒƒãƒ—を変更"
msgid "Rearrange Tracks"
msgstr "トラックã®ä¸¦ã¹æ›¿ãˆ"
+msgid "Blend Shape tracks only apply to MeshInstance3D nodes."
+msgstr "Blend Shapeトラックã¯ã€MeshInstance3Dノードã«ã®ã¿é©ç”¨ã•ã‚Œã¾ã™ã€‚"
+
+msgid "Position/Rotation/Scale 3D tracks only apply to 3D-based nodes."
+msgstr ""
+"ä½ç½®/回転/スケール 3D トラックã¯ã€3D ベースã®ãƒŽãƒ¼ãƒ‰ã«ã®ã¿é©ç”¨ã•ã‚Œã¾ã™ã€‚"
+
msgid ""
"Audio tracks can only point to nodes of type:\n"
"-AudioStreamPlayer\n"
@@ -404,6 +850,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 "トラックã®åž‹ãŒ Node3D ã§ã¯ãªã„ãŸã‚ã€ã‚­ãƒ¼ã‚’挿入ã§ãã¾ã›ã‚“"
+
+msgid "Add Position Key"
+msgstr "ä½ç½®ã‚­ãƒ¼ã‚’追加"
+
+msgid "Add Rotation Key"
+msgstr "回転キーを追加"
+
+msgid "Add Scale Key"
+msgstr "スケールキーを追加"
+
msgid "Add Track Key"
msgstr "トラックキーを追加"
@@ -416,6 +874,9 @@ msgstr "メソッドトラックキーã®è¿½åŠ "
msgid "Method not found in object:"
msgstr "オブジェクト内ã«ãƒ¡ã‚½ãƒƒãƒ‰ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“:"
+msgid "Animation Move Keys"
+msgstr "アニメーション キーã®ç§»å‹•"
+
msgid "Position"
msgstr "ä½ç½®"
@@ -425,6 +886,9 @@ msgstr "回転"
msgid "Scale"
msgstr "スケール"
+msgid "BlendShape"
+msgstr "ブレンドシェイプ"
+
msgid "Methods"
msgstr "メソッド"
@@ -440,10 +904,41 @@ msgstr "クリップボードã¯ç©ºã§ã™ï¼"
msgid "Paste Tracks"
msgstr "トラックを貼り付ã‘"
+msgid "Animation Scale Keys"
+msgstr "アニメーション キーã®ã‚¹ã‚±ãƒ¼ãƒ«"
+
+msgid "Make Easing Keys"
+msgstr "イージングキーã®ä½œæˆ"
+
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
msgstr "ã“ã®ã‚ªãƒ—ションã¯å˜ä¸€ãƒˆãƒ©ãƒƒã‚¯ã§ã®ãƒ™ã‚¸ã‚§ç·¨é›†ã§ã¯æ©Ÿèƒ½ã—ã¾ã›ã‚“。"
+msgid "Animation Add RESET Keys"
+msgstr "RESETキーã®è¿½åŠ "
+
+msgid "Bake Animation as Linear keys."
+msgstr "アニメーションをリニア キーã¨ã—ã¦ãƒ™ã‚¤ã‚¯ã—ã¾ã™ã€‚"
+
+msgid ""
+"This animation belongs to an imported scene, so changes to imported tracks "
+"will not be saved.\n"
+"\n"
+"To modify this animation, navigate to the scene's Advanced Import settings "
+"and select the animation.\n"
+"Some options, including looping, are available here. To add custom tracks, "
+"enable \"Save To File\" and\n"
+"\"Keep Custom Tracks\"."
+msgstr ""
+"ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã¯ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•ã‚ŒãŸã‚·ãƒ¼ãƒ³ã«å±žã—ã¦ã„ã‚‹ãŸã‚ã€ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•ã‚ŒãŸ"
+"トラックã¸ã®å¤‰æ›´ã¯ä¿å­˜ã•ã‚Œã¾ã›ã‚“。\n"
+"\n"
+"ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’変更ã™ã‚‹ã«ã¯ã€ã‚·ãƒ¼ãƒ³ã®é«˜åº¦ãªã‚¤ãƒ³ãƒãƒ¼ãƒˆè¨­å®šã«ç§»å‹•ã—ã€ã‚¢ãƒ‹"
+"メーションをé¸æŠžã—ã¾ã™ã€‚\n"
+"ループをå«ã‚€ã„ãã¤ã‹ã®ã‚ªãƒ—ションãŒã‚ã‚Šã¾ã™ã€‚\n"
+"カスタムトラックを追加ã™ã‚‹ã«ã¯ã€ã€Œãƒ•ã‚¡ã‚¤ãƒ«ã«ä¿å­˜ã€ã¨ã€Œã‚«ã‚¹ã‚¿ãƒ ãƒˆãƒ©ãƒƒã‚¯ã‚’ä¿æŒ"
+"ã™ã‚‹ã€ã‚’有効ã«ã—ã¦ãã ã•ã„。"
+
msgid "Warning: Editing imported animation"
msgstr "警告:インãƒãƒ¼ãƒˆã—ãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’編集ã—ã¦ã„ã¾ã™"
@@ -452,6 +947,12 @@ msgstr ""
"アニメーションを作ã£ã¦ç·¨é›†ã™ã‚‹ã«ã¯ã€ AnimationPlayer ノードをé¸æŠžã—ã¦ãã ã•"
"ã„。"
+msgid "Imported Scene"
+msgstr "インãƒãƒ¼ãƒˆã•ã‚ŒãŸã‚·ãƒ¼ãƒ³"
+
+msgid "Toggle between the bezier curve editor and track editor."
+msgstr "ベジェ曲線エディタã¨ãƒˆãƒ©ãƒƒã‚¯ã‚¨ãƒ‡ã‚£ã‚¿ã‚’切り替ãˆã¾ã™ã€‚"
+
msgid "Only show tracks from nodes selected in tree."
msgstr "ツリーã§é¸æŠžã—ãŸãƒŽãƒ¼ãƒ‰ã®ãƒˆãƒ©ãƒƒã‚¯ã®ã¿ã‚’表示ã—ã¾ã™ã€‚"
@@ -486,6 +987,9 @@ msgstr "スケールã®é¸æŠž"
msgid "Scale From Cursor"
msgstr "カーソル基準ã§ã‚¹ã‚±ãƒ¼ãƒ«"
+msgid "Make Easing Selection"
+msgstr "イージングé¸æŠžã‚’作æˆ"
+
msgid "Duplicate Selection"
msgstr "é¸æŠžç¯„囲を複製"
@@ -504,6 +1008,18 @@ msgstr "å‰ã®ã‚¹ãƒ†ãƒƒãƒ—ã¸"
msgid "Apply Reset"
msgstr "リセット"
+msgid "Bake Animation"
+msgstr "アニメーションをベイク"
+
+msgid "Optimize Animation (no undo)"
+msgstr "アニメーションã®æœ€é©åŒ–(アンドゥãªã—)"
+
+msgid "Clean-Up Animation (no undo)"
+msgstr "アニメーションをクリーンアップ(アンドゥãªã—)"
+
+msgid "Pick a node to animate:"
+msgstr "アニメーションã™ã‚‹ãƒŽãƒ¼ãƒ‰ã‚’é¸æŠž:"
+
msgid "Use Bezier Curves"
msgstr "ベジェ曲線を使用"
@@ -513,9 +1029,15 @@ msgstr "RESETトラックを作æˆ"
msgid "Anim. Optimizer"
msgstr "アニメーションã®ã‚ªãƒ—ティマイザー"
+msgid "Max. Velocity Error:"
+msgstr "最大ベロシティエラー:"
+
msgid "Max. Angular Error:"
msgstr "最大。角度エラー:"
+msgid "Max. Precision Error:"
+msgstr "最大精度エラー:"
+
msgid "Optimize"
msgstr "最é©åŒ–"
@@ -537,12 +1059,21 @@ msgstr "クリーンアップ"
msgid "Scale Ratio:"
msgstr "スケール比:"
+msgid "Select Transition and Easing"
+msgstr "トランジションã¨ã‚¤ãƒ¼ã‚¸ãƒ³ã‚°ã‚’é¸æŠž"
+
+msgid "Anim. Baker"
+msgstr "アニメーションベイカー"
+
msgid "Select Tracks to Copy"
msgstr "コピーã™ã‚‹ãƒˆãƒ©ãƒƒã‚¯ã‚’é¸æŠž"
msgid "Select All/None"
msgstr "ã™ã¹ã¦ã‚’é¸æŠž/解除"
+msgid "Animation Change Keyframe Time"
+msgstr "アニメーションキーフレームã®æ™‚間を変更"
+
msgid "Add Audio Track Clip"
msgstr "オーディオトラッククリップã®è¿½åŠ "
@@ -561,6 +1092,14 @@ msgstr "行番å·:"
msgid "%d replaced."
msgstr "%d件を置æ›ã—ã¾ã—ãŸã€‚"
+msgid "%d match"
+msgid_plural "%d matches"
+msgstr[0] "%d件ã®ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ"
+
+msgid "%d of %d match"
+msgid_plural "%d of %d matches"
+msgstr[0] "%d件中 %d件ã®ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ"
+
msgid "Match Case"
msgstr "大文字å°æ–‡å­—を区別ã™ã‚‹"
@@ -619,9 +1158,15 @@ msgstr "スクリプトã«æŽ¥ç¶š:"
msgid "From Signal:"
msgstr "シグナルã‹ã‚‰:"
+msgid "Filter Nodes"
+msgstr "ノードをフィルタ"
+
msgid "Scene does not contain any script."
msgstr "シーンã«ã¯ã‚¹ã‚¯ãƒªãƒ—トãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。"
+msgid "Select Method"
+msgstr "メソッドã®é¸æŠž"
+
msgid "Remove"
msgstr "除去"
@@ -631,6 +1176,12 @@ msgstr "呼ã³å‡ºã—引数を追加:"
msgid "Extra Call Arguments:"
msgstr "追加ã®å‘¼ã³å‡ºã—引数:"
+msgid "Allows to drop arguments sent by signal emitter."
+msgstr "シグナルエミッターã‹ã‚‰é€ä¿¡ã•ã‚ŒãŸå¼•æ•°ã‚’ドロップã§ãるよã†ã«ã—ã¾ã™ã€‚"
+
+msgid "Unbind Signal Arguments:"
+msgstr "シグナルã®å¼•æ•°ã‚’変更:"
+
msgid "Receiver Method:"
msgstr "å—ä¿¡å´ãƒ¡ã‚½ãƒƒãƒ‰:"
@@ -662,6 +1213,9 @@ msgstr "接続"
msgid "Signal:"
msgstr "シグナル:"
+msgid "No description."
+msgstr "説明ãŒã‚ã‚Šã¾ã›ã‚“。"
+
msgid "Connect '%s' to '%s'"
msgstr "'%s' ã‚’ '%s' ã«æŽ¥ç¶š"
@@ -680,27 +1234,33 @@ msgstr "切断"
msgid "Connect a Signal to a Method"
msgstr "メソッドã«ã‚·ã‚°ãƒŠãƒ«ã‚’接続"
-msgid "Edit Connection:"
-msgstr "接続を編集:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr "シグナル %s ã‹ã‚‰ã™ã¹ã¦ã®æŽ¥ç¶šã‚’除去ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
msgid "Signals"
msgstr "シグナル"
+msgid "Filter Signals"
+msgstr "シグナルを絞り込む"
+
msgid "Are you sure you want to remove all connections from this signal?"
msgstr "ã“ã®ã‚·ã‚°ãƒŠãƒ«ã‹ã‚‰ã™ã¹ã¦ã®æŽ¥ç¶šã‚’除去ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
msgid "Disconnect All"
msgstr "ã™ã¹ã¦åˆ‡æ–­"
+msgid "Copy Name"
+msgstr "åå‰ã‚’コピー"
+
msgid "Edit..."
msgstr "編集..."
msgid "Go to Method"
msgstr "メソッドã¸ç§»å‹•"
+msgid "Change Type of \"%s\""
+msgstr "\"%s\" ã®åž‹ã‚’変更ã™ã‚‹"
+
msgid "Change"
msgstr "変更"
@@ -710,6 +1270,12 @@ msgstr "%s ã‚’æ–°è¦ä½œæˆ"
msgid "No results for \"%s\"."
msgstr "\"%s\" ã®çµæžœã¯ã‚ã‚Šã¾ã›ã‚“。"
+msgid "This class is marked as deprecated."
+msgstr "ã“ã®ã‚¯ãƒ©ã‚¹ã¯éžæŽ¨å¥¨ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚"
+
+msgid "This class is marked as experimental."
+msgstr "ã“ã®ã‚¯ãƒ©ã‚¹ã¯å®Ÿé¨“用ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã•ã‚Œã¾ã™ã€‚"
+
msgid "No description available for %s."
msgstr "%s ã«ã¤ã„ã¦ã®èª¬æ˜Žã¯ã‚ã‚Šã¾ã›ã‚“。"
@@ -719,6 +1285,9 @@ msgstr "ãŠæ°—ã«å…¥ã‚Š:"
msgid "Recent:"
msgstr "最近:"
+msgid "(Un)favorite selected item."
+msgstr "é¸æŠžä¸­ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ãŠæ°—ã«å…¥ã‚Šã«ã™ã‚‹ / ã—ãªã„"
+
msgid "Search:"
msgstr "検索:"
@@ -746,9 +1315,21 @@ msgstr "ノードã®ãƒ‘スをコピー"
msgid "Instance:"
msgstr "インスタンス:"
+msgid ""
+"This node has been instantiated from a PackedScene file:\n"
+"%s\n"
+"Click to open the original file in the Editor."
+msgstr ""
+"ã“ã®ãƒŽãƒ¼ãƒ‰ã¯ä»¥ä¸‹ã®PackedSceneファイルã‹ã‚‰ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹åŒ–ã•ã‚Œã¾ã—ãŸã€‚\n"
+"%s\n"
+"クリックã™ã‚‹ã¨å…ƒã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒã‚¨ãƒ‡ã‚£ã‚¿ã§é–‹ã‹ã‚Œã¾ã™ã€‚"
+
msgid "Toggle Visibility"
msgstr "å¯è¦–性ã®åˆ‡ã‚Šæ›¿ãˆ"
+msgid "ms"
+msgstr "ミリ秒"
+
msgid "Monitors"
msgstr "モニター"
@@ -818,6 +1399,21 @@ msgstr "時間"
msgid "Calls"
msgstr "呼ã³å‡ºã—"
+msgid "Fit to Frame"
+msgstr "フレームã«åˆã‚ã›ã‚‹"
+
+msgid "Linked"
+msgstr "連動"
+
+msgid "CPU"
+msgstr "CPU"
+
+msgid "GPU"
+msgstr "GPU"
+
+msgid "Execution resumed."
+msgstr "実行ãŒå†é–‹ã•ã‚Œã¾ã—ãŸã€‚"
+
msgid "Bytes:"
msgstr "ãƒã‚¤ãƒˆ:"
@@ -827,26 +1423,32 @@ msgstr "警告:"
msgid "Error:"
msgstr "エラー:"
-msgid "C++ Error"
-msgstr "C++ エラー"
+msgid "%s Error"
+msgstr "%s エラー"
-msgid "C++ Error:"
-msgstr "C++ エラー:"
+msgid "Stack Trace"
+msgstr "スタックトレース"
-msgid "Source"
-msgstr "ソース"
+msgid "Stack Trace:"
+msgstr "スタックトレース:"
-msgid "C++ Source"
-msgstr "C++ ソース"
+msgid "Debug session started."
+msgstr "デãƒãƒƒã‚°ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’開始ã—ã¾ã—ãŸã€‚"
-msgid "Source:"
-msgstr "ソース:"
+msgid "Debug session closed."
+msgstr "デãƒãƒƒã‚°ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’終了ã—ã¾ã—ãŸã€‚"
-msgid "C++ Source:"
-msgstr "C++ ソース:"
+msgid "Line %d"
+msgstr "è¡Œç•ªå· %d"
-msgid "Stack Trace"
-msgstr "スタックトレース"
+msgid "Delete Breakpoint"
+msgstr "ブレークãƒã‚¤ãƒ³ãƒˆã®å‰Šé™¤"
+
+msgid "Delete All Breakpoints in:"
+msgstr "ã™ã¹ã¦ã®ãƒ–レークãƒã‚¤ãƒ³ãƒˆã‚’消去:"
+
+msgid "Delete All Breakpoints"
+msgstr "ã™ã¹ã¦ã®ãƒ–レークãƒã‚¤ãƒ³ãƒˆã®å‰Šé™¤"
msgid "Copy Error"
msgstr "エラーをコピー"
@@ -854,6 +1456,9 @@ msgstr "エラーをコピー"
msgid "Open C++ Source on GitHub"
msgstr "C++ã®ã‚½ãƒ¼ã‚¹ã‚’GitHubã§é–‹ã"
+msgid "C++ Source"
+msgstr "C++ ソース"
+
msgid "Video RAM"
msgstr "ビデオRAM"
@@ -875,6 +1480,9 @@ msgstr "続行"
msgid "Stack Frames"
msgstr "スタックフレーム"
+msgid "Filter Stack Variables"
+msgstr "スタック変数ã§ãƒ•ã‚£ãƒ«ã‚¿"
+
msgid "Breakpoints"
msgstr "ブレークãƒã‚¤ãƒ³ãƒˆ"
@@ -887,6 +1495,9 @@ msgstr "ã™ã¹ã¦æŠ˜ã‚ŠãŸãŸã‚€"
msgid "Profiler"
msgstr "プロファイラー"
+msgid "Visual Profiler"
+msgstr "ビジュアルプロファイラー"
+
msgid "List of Video Memory Usage by Resource:"
msgstr "リソースã«ã‚ˆã‚‹ãƒ“デオメモリーã®æ¶ˆè²»é‡ä¸€è¦§:"
@@ -976,6 +1587,12 @@ msgstr "シーンを開ã"
msgid "Owners of: %s (Total: %d)"
msgstr "%s ã®ã‚ªãƒ¼ãƒŠãƒ¼ (åˆè¨ˆ: %d)"
+msgid "Localization remap"
+msgstr "ローカライズã®å†ãƒžãƒƒãƒ—"
+
+msgid "Localization remap for path '%s' and locale '%s'."
+msgstr "パス '%s' ã¨ãƒ­ã‚±ãƒ¼ãƒ« '%s' ã®ãƒ­ãƒ¼ã‚«ãƒ©ã‚¤ã‚ºã®å†ãƒžãƒƒãƒ—。"
+
msgid ""
"Remove the selected files from the project? (Cannot be undone.)\n"
"Depending on your filesystem configuration, the files will either be moved "
@@ -1192,6 +1809,12 @@ msgstr "ãƒã‚¤ãƒ‘ス"
msgid "Bus Options"
msgstr "ãƒã‚¹ オプション"
+msgid "Duplicate Bus"
+msgstr "オーディオãƒã‚¹ã‚’複製"
+
+msgid "Delete Bus"
+msgstr "オーディオãƒã‚¹ã‚’削除"
+
msgid "Reset Volume"
msgstr "音é‡ã‚’リセット"
@@ -1279,18 +1902,27 @@ msgstr "有効ãªæ–‡å­—:"
msgid "Must not collide with an existing engine class name."
msgstr "既存ã®ã‚¨ãƒ³ã‚¸ãƒ³ã‚¯ãƒ©ã‚¹åã¨é‡è¤‡ã—ã¦ã¯ãªã‚Šã¾ã›ã‚“。"
+msgid "Must not collide with an existing global script class name."
+msgstr "既存ã®ã‚°ãƒ­ãƒ¼ãƒãƒ«ã‚¹ã‚¯ãƒªãƒ—トクラスåã¨ç«¶åˆã—ãªã„よã†ã«ã—ã¦ãã ã•ã„。"
+
msgid "Must not collide with an existing built-in type name."
msgstr "既存ã®çµ„ã¿è¾¼ã¿åž‹åã¨é‡è¤‡ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“。"
msgid "Must not collide with an existing global constant name."
msgstr "既存ã®ã‚°ãƒ­ãƒ¼ãƒãƒ«å®šæ•°åã¨é‡è¤‡ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“。"
+msgid "Keyword cannot be used as an Autoload name."
+msgstr "キーワードã¯è‡ªå‹•èª­ã¿è¾¼ã¿ã®åå‰ã¨ã—ã¦ä½¿ç”¨ã§ãã¾ã›ã‚“。"
+
msgid "Autoload '%s' already exists!"
msgstr "自動読ã¿è¾¼ã¿ '%s' ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™ï¼"
msgid "Rename Autoload"
msgstr "自動読ã¿è¾¼ã¿ã®åå‰å¤‰æ›´"
+msgid "Toggle Autoload Globals"
+msgstr "グローãƒãƒ«ã®è‡ªå‹•èª­è¾¼ã¿ã‚’切り替ãˆ"
+
msgid "Move Autoload"
msgstr "自動読ã¿è¾¼ã¿ã‚’移動"
@@ -1303,12 +1935,18 @@ msgstr "有効"
msgid "Rearrange Autoloads"
msgstr "自動読ã¿è¾¼ã¿ã®ä¸¦ã¹æ›¿ãˆ"
+msgid "Can't add Autoload:"
+msgstr "自動読ã¿è¾¼ã¿ã‚’追加出æ¥ã¾ã›ã‚“:"
+
msgid "%s is an invalid path. File does not exist."
msgstr "%s ã¯ç„¡åŠ¹ãªãƒ‘スã§ã™ã€‚ファイルãŒå­˜åœ¨ã—ã¾ã›ã‚“。"
msgid "%s is an invalid path. Not in resource path (res://)."
msgstr "%s ã¯ç„¡åŠ¹ãªãƒ‘スã§ã™ã€‚リソースパス (res://) ã«å­˜åœ¨ã—ã¾ã›ã‚“。"
+msgid "Add Autoload"
+msgstr "自動読ã¿è¾¼ã¿ã‚’追加"
+
msgid "Path:"
msgstr "パス:"
@@ -1318,6 +1956,9 @@ msgstr "ノードå:"
msgid "Global Variable"
msgstr "グローãƒãƒ«å¤‰æ•°"
+msgid "3D Engine"
+msgstr "3Dエンジン"
+
msgid "2D Physics"
msgstr "2D物ç†"
@@ -1327,9 +1968,115 @@ msgstr "3D物ç†"
msgid "Navigation"
msgstr "ナビゲーション"
+msgid "XR"
+msgstr "XR"
+
+msgid "RenderingDevice"
+msgstr "レンダリングデãƒã‚¤ã‚¹"
+
msgid "OpenGL"
msgstr "OpenGL"
+msgid "Vulkan"
+msgstr "Vulkan"
+
+msgid "Text Server: Fallback"
+msgstr "テキストサーãƒãƒ¼: フォールãƒãƒƒã‚¯"
+
+msgid "Text Server: Advanced"
+msgstr "テキストサーãƒãƒ¼: 詳細"
+
+msgid "TTF, OTF, Type 1, WOFF1 Fonts"
+msgstr "TTF, OTF, Type 1, WOFF1 フォント"
+
+msgid "WOFF2 Fonts"
+msgstr "WOFF2 フォント"
+
+msgid "SIL Graphite Fonts"
+msgstr "SILグラファイトフォント"
+
+msgid "Multi-channel Signed Distance Field Font Rendering"
+msgstr "マルãƒãƒãƒ£ãƒ³ãƒãƒ«ç¬¦å·ä»˜ãè·é›¢ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ãƒ•ã‚©ãƒ³ãƒˆæç”»"
+
+msgid "3D Nodes as well as RenderingServer access to 3D features."
+msgstr "3DノードãŠã‚ˆã³3D機能ã¸ã®RenderingServerã®ã‚¢ã‚¯ã‚»ã‚¹ã€‚"
+
+msgid "2D Physics nodes and PhysicsServer2D."
+msgstr "2D物ç†ãƒŽãƒ¼ãƒ‰ã¨ PhysicsServer2D"
+
+msgid "3D Physics nodes and PhysicsServer3D."
+msgstr "3D物ç†ãƒŽãƒ¼ãƒ‰ã¨PhysicsServer3D"
+
+msgid "Navigation, both 2D and 3D."
+msgstr "2Dã¨3Dã®ãƒŠãƒ“ゲーション。"
+
+msgid "XR (AR and VR)."
+msgstr "XR (AR 㨠VR)."
+
+msgid ""
+"RenderingDevice based rendering (if disabled, the OpenGL back-end is "
+"required)."
+msgstr ""
+"レンダリングデãƒã‚¤ã‚¹ãƒ™ãƒ¼ã‚¹ã®ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ï¼ˆç„¡åŠ¹ã®å ´åˆã€OpenGLãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ãŒå¿…"
+"è¦ã§ã™ï¼‰"
+
+msgid ""
+"OpenGL back-end (if disabled, the RenderingDevice back-end is required)."
+msgstr ""
+"OpenGLãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ï¼ˆç„¡åŠ¹ã®å ´åˆã€RenderingDeviceãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ãŒå¿…è¦ã§ã™ï¼‰"
+
+msgid "Vulkan back-end of RenderingDevice."
+msgstr "レンダリングデãƒã‚¤ã‚¹ã®Vulkanãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰"
+
+msgid ""
+"Fallback implementation of Text Server\n"
+"Supports basic text layouts."
+msgstr ""
+"Text Server ã®ãƒ•ã‚©ãƒ¼ãƒ«ãƒãƒƒã‚¯å®Ÿè£…\n"
+"基本的ãªãƒ†ã‚­ã‚¹ãƒˆãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚’サãƒãƒ¼ãƒˆ"
+
+msgid ""
+"Text Server implementation powered by ICU and HarfBuzz libraries.\n"
+"Supports complex text layouts, BiDi, and contextual OpenType font features."
+msgstr ""
+"ICUã¨HarfBuzzライブラリã«ã‚ˆã‚‹ãƒ†ã‚­ã‚¹ãƒˆã‚µãƒ¼ãƒãƒ¼ã®å®Ÿè£…。\n"
+"複雑ãªãƒ†ã‚­ã‚¹ãƒˆãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã€BiDiã€ã‚³ãƒ³ãƒ†ã‚¯ã‚¹ãƒˆOpenTypeフォント機能をサãƒãƒ¼ãƒˆã—"
+"ã¾ã™ã€‚"
+
+msgid ""
+"TrueType, OpenType, Type 1, and WOFF1 font format support using FreeType "
+"library (if disabled, WOFF2 support is also disabled)."
+msgstr ""
+"FreeTypeライブラリを使用ã—ãŸTrueTypeã€OpenTypeã€Type1ã€WOFF1フォントフォー"
+"マット対応(無効ã®å ´åˆã€WOFF2対応も無効ã¨ãªã‚Šã¾ã™ï¼‰"
+
+msgid "WOFF2 font format support using FreeType and Brotli libraries."
+msgstr ""
+"FreeType ãŠã‚ˆã³ Brotli ライブラリを使用ã—㟠WOFF2 フォント形å¼ã®ã‚µãƒãƒ¼ãƒˆ"
+
+msgid ""
+"SIL Graphite smart font technology support (supported by Advanced Text "
+"Server only)."
+msgstr ""
+"SIL Graphiteスマートフォントテクノロジー対応(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 ""
+"msdfgenライブラリを用ã„ãŸãƒžãƒ«ãƒãƒãƒ£ãƒ³ãƒãƒ«ç¬¦å·ä»˜ãè·é›¢ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ãƒ•ã‚©ãƒ³ãƒˆã®ãƒ¬ãƒ³"
+"ダリングã«å¯¾å¿œï¼ˆã“ã®ã‚ªãƒ—ションを無効ã«ã—ã¦ã‚‚ã€ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°æ¸ˆã¿ã®MSDFフォント"
+"ã¯ä½¿ç”¨å¯èƒ½ã§ã™ï¼‰"
+
+msgid "General Features:"
+msgstr "主è¦æ©Ÿèƒ½:"
+
+msgid "Text Rendering and Font Options:"
+msgstr "テキストã®ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã¨ãƒ•ã‚©ãƒ³ãƒˆã®ã‚ªãƒ—ション:"
+
+msgid "File saving failed."
+msgstr "ファイルä¿å­˜ã‚¨ãƒ©ãƒ¼"
+
msgid "Nodes and Classes:"
msgstr "ノードã¨ã‚¯ãƒ©ã‚¹:"
@@ -1345,12 +2092,42 @@ msgstr "æ–°è¦"
msgid "Save"
msgstr "ä¿å­˜"
+msgid "Profile:"
+msgstr "プロファイル:"
+
msgid "Reset to Defaults"
msgstr "デフォルトã«æˆ»ã™"
+msgid "Detect from Project"
+msgstr "プロジェクトã‹ã‚‰æ¤œå‡º"
+
+msgid "Actions:"
+msgstr "アクション:"
+
+msgid "Configure Engine Build Profile:"
+msgstr "エンジンビルドプロファイルã®è¨­å®š:"
+
+msgid "Please Confirm:"
+msgstr "確èª:"
+
+msgid "Engine Build Profile"
+msgstr "エンジンビルドプロファイル"
+
+msgid "Load Profile"
+msgstr "プロファイルã®ãƒ­ãƒ¼ãƒ‰"
+
msgid "Export Profile"
msgstr "プロファイルã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ"
+msgid "Forced classes on detect:"
+msgstr "検出時ã®å¼·åˆ¶ã‚¯ãƒ©ã‚¹:"
+
+msgid "Edit Build Configuration Profile"
+msgstr "ビルド構æˆãƒ—ロファイルã®ç·¨é›†"
+
+msgid "Filter Commands"
+msgstr "コマンドã§ãƒ•ã‚£ãƒ«ã‚¿"
+
msgid "Paste Params"
msgstr "パラメーターを貼り付ã‘"
@@ -1372,6 +2149,10 @@ msgstr "[未ä¿å­˜]"
msgid "Please select a base directory first."
msgstr "ã¯ã˜ã‚ã«ãƒ™ãƒ¼ã‚¹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„。"
+msgid "Could not create folder. File with that name already exists."
+msgstr ""
+"フォルダを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ãã®åå‰ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã™ã§ã«å­˜åœ¨ã—ã¦ã„ã¾ã™ã€‚"
+
msgid "Choose a Directory"
msgstr "ディレクトリをé¸æŠž"
@@ -1408,6 +2189,9 @@ msgstr "ファイルシステム ドック"
msgid "Import Dock"
msgstr "インãƒãƒ¼ãƒˆãƒ‰ãƒƒã‚¯"
+msgid "History Dock"
+msgstr "履歴ドック"
+
msgid "Allows to view and edit 3D scenes."
msgstr "3Dシーンã®è¡¨ç¤ºã¨ç·¨é›†ãŒã§ãã¾ã™ã€‚"
@@ -1435,6 +2219,9 @@ msgstr ""
"å„アセットã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆè¨­å®šã‚’構æˆã§ãã¾ã™ã€‚動作ã«ã¯ãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ  ドッグãŒå¿…"
"è¦ã§ã™ã€‚"
+msgid "Provides an overview of the editor's and each scene's undo history."
+msgstr "エディターã¨å„シーンã®ã‚¢ãƒ³ãƒ‰ã‚¥å±¥æ­´ã®æ¦‚è¦ã‚’æä¾›ã—ã¾ã™ã€‚"
+
msgid "(current)"
msgstr "(ç¾åœ¨)"
@@ -1575,6 +2362,9 @@ msgstr "ファイルã¾ãŸã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’é–‹ã"
msgid "Save a File"
msgstr "ファイルをä¿å­˜"
+msgid "Favorited folder does not exist anymore and will be removed."
+msgstr "ãŠæ°—ã«å…¥ã‚Šãƒ•ã‚©ãƒ«ãƒ€ã¯å­˜åœ¨ã—ãªã„ãŸã‚ã€å‰Šé™¤ã•ã‚Œã¾ã™ã€‚"
+
msgid "Go Back"
msgstr "戻る"
@@ -1635,6 +2425,20 @@ msgstr "プレビュー:"
msgid "File:"
msgstr "ファイル:"
+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 ""
+"é¸æŠžã—ãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’削除ã—ã¾ã™ã‹ï¼Ÿå®‰å…¨ã®ãŸã‚ã€ã“ã“ã‹ã‚‰å‰Šé™¤ã§ãã‚‹ã®ã¯ãƒ•ã‚¡ã‚¤ãƒ«ã¨"
+"空ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã ã‘ã§ã™ã€‚(å…ƒã«æˆ»ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“)\n"
+"ファイルシステムã®è¨­å®šã«ã‚ˆã£ã¦ã€ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã‚·ã‚¹ãƒ†ãƒ ã®ã‚´ãƒŸç®±ã«ç§»å‹•ã•ã‚Œã‚‹ã‹ã€æ°¸"
+"ä¹…ã«å‰Šé™¤ã•ã‚Œã¾ã™ã€‚"
+
+msgid "Some extensions need the editor to restart to take effect."
+msgstr "一部ã®æ‹¡å¼µæ©Ÿèƒ½ã¯ã€ã‚¨ãƒ‡ã‚£ã‚¿ã®å†èµ·å‹•ãŒå¿…è¦ã§ã™ã€‚"
+
msgid "Restart"
msgstr "å†èµ·å‹•"
@@ -1654,6 +2458,55 @@ msgstr ""
msgid "(Re)Importing Assets"
msgstr "アセットを(å†)インãƒãƒ¼ãƒˆä¸­"
+msgid "Import resources of type: %s"
+msgstr "次ã®ã‚¿ã‚¤ãƒ—ã®ãƒªã‚½ãƒ¼ã‚¹ã‚’インãƒãƒ¼ãƒˆ: %s"
+
+msgid "No return value."
+msgstr "戻り値ã¯ã‚ã‚Šã¾ã›ã‚“ã€"
+
+msgid "Deprecated"
+msgstr "é‡è¤‡"
+
+msgid "Experimental"
+msgstr "実験的"
+
+msgid "This method supports a variable number of arguments."
+msgstr "ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã€å¯å¤‰æ•°ã®å¼•æ•°ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã™ã€‚"
+
+msgid ""
+"This method is called by the engine.\n"
+"It can be overridden to customize built-in behavior."
+msgstr ""
+"ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã‚¨ãƒ³ã‚¸ãƒ³ã‹ã‚‰å‘¼ã³å‡ºã•ã‚Œã¾ã™ã€‚\n"
+"オーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã™ã‚‹ã“ã¨ã§ã€çµ„ã¿è¾¼ã¿ã®å‹•ä½œã‚’カスタマイズã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
+
+msgid ""
+"This method has no side effects.\n"
+"It does not modify the object in any way."
+msgstr ""
+"ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã«ã¯å‰¯ä½œç”¨ã¯ã‚ã‚Šã¾ã›ã‚“。\n"
+"ã¾ãŸã€ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã‚ªãƒ–ジェクトを一切変更ã—ã¾ã›ã‚“。"
+
+msgid ""
+"This method does not need an instance to be called.\n"
+"It can be called directly using the class name."
+msgstr ""
+"ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã€å‘¼ã³å‡ºã™ãŸã‚ã«ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’å¿…è¦ã¨ã—ã¾ã›ã‚“。\n"
+"クラスåを使ã£ã¦ç›´æŽ¥å‘¼ã³å‡ºã™ã“ã¨ãŒã§ãã¾ã™ã€‚"
+
+msgid "Error codes returned:"
+msgstr "è¿”ã•ã‚ŒãŸã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰:"
+
+msgid "There is currently no description for this %s."
+msgstr "ã“ã® %s ã«ã¯ç¾åœ¨èª¬æ˜ŽãŒã‚ã‚Šã¾ã›ã‚“。"
+
+msgid ""
+"There is currently no description for this %s. Please help us by "
+"[color=$color][url=$url]contributing one[/url][/color]!"
+msgstr ""
+"ç¾åœ¨ã€ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã®èª¬æ˜Žã¯ã‚ã‚Šã¾ã›ã‚“。[color=$color][url=$url]貢献[/url][/"
+"color]ã—ã¦ç§ãŸã¡ã‚’助ã‘ã¦ãã ã•ã„ï¼"
+
msgid "Top"
msgstr "トップ"
@@ -1666,9 +2519,32 @@ msgstr "継承元:"
msgid "Inherited by:"
msgstr "継承先:"
+msgid ""
+"This class is marked as deprecated. It will be removed in future versions."
+msgstr ""
+"ã“ã®ã‚¯ãƒ©ã‚¹ã¯ã€éžæŽ¨å¥¨ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚å°†æ¥ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§å‰Šé™¤ã•ã‚Œã‚‹äºˆ"
+"定ã§ã™ã€‚"
+
+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 ""
+"ã“ã®ã‚¯ãƒ©ã‚¹ã¯å®Ÿé¨“用ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã•ã‚Œã¾ã™ã€‚å°†æ¥ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§å¤‰æ›´ã¾ãŸã¯å‰Šé™¤ã•ã‚Œ"
+"ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ã”自身ã®åˆ¤æ–­ã§ä½¿ç”¨ã—ã¦ãã ã•ã„。"
+
msgid "Description"
msgstr "説明"
+msgid "There is currently no description for this class."
+msgstr "ç¾åœ¨ã€ã“ã®ã‚¯ãƒ©ã‚¹ã®èª¬æ˜Žã¯ã‚ã‚Šã¾ã›ã‚“。"
+
+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 "オンラインãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«"
@@ -1681,6 +2557,15 @@ msgstr "%s を上書ã:"
msgid "default:"
msgstr "デフォルト:"
+msgid "property:"
+msgstr "プロパティ:"
+
+msgid "Constructors"
+msgstr "定数"
+
+msgid "Operators"
+msgstr "オペレーター"
+
msgid "Theme Properties"
msgstr "テーマ プロパティ"
@@ -1693,6 +2578,9 @@ msgstr "定数"
msgid "Fonts"
msgstr "フォント"
+msgid "Font Sizes"
+msgstr "フォントサイズ"
+
msgid "Icons"
msgstr "アイコン"
@@ -1702,12 +2590,28 @@ msgstr "スタイル"
msgid "Enumerations"
msgstr "列挙型"
+msgid "Annotations"
+msgstr "アノテーション"
+
+msgid "There is currently no description for this annotation."
+msgstr "ç¾åœ¨ã€ã“ã®ã‚¢ãƒŽãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ã®èª¬æ˜Žã¯ã‚ã‚Šã¾ã›ã‚“。"
+
+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"
msgstr "プロパティã®èª¬æ˜Ž"
msgid "(value)"
msgstr "(値)"
+msgid "There is currently no description for this property."
+msgstr "ç¾åœ¨ã€ã“ã®ãƒ—ロパティã®èª¬æ˜Žã¯ã‚ã‚Šã¾ã›ã‚“。"
+
msgid ""
"There is currently no description for this property. Please help us by "
"[color=$color][url=$url]contributing one[/url][/color]!"
@@ -1715,9 +2619,15 @@ msgstr ""
"ç¾åœ¨ã€ã“ã®ãƒ—ロパティã®èª¬æ˜Žã¯ã‚ã‚Šã¾ã›ã‚“。[color=$color][url=$url]貢献[/url][/"
"color]ã—ã¦ç§ãŸã¡ã‚’助ã‘ã¦ãã ã•ã„ï¼"
+msgid "Constructor Descriptions"
+msgstr "定数ã®èª¬æ˜Ž"
+
msgid "Method Descriptions"
msgstr "メソッドã®èª¬æ˜Ž"
+msgid "Operator Descriptions"
+msgstr "オペレーターã®èª¬æ˜Ž"
+
msgid "%d match."
msgstr "%d件ã®ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚"
@@ -1739,12 +2649,21 @@ msgstr "ã™ã¹ã¦è¡¨ç¤º"
msgid "Classes Only"
msgstr "クラスã®ã¿"
+msgid "Constructors Only"
+msgstr "定数ã®ã¿"
+
msgid "Methods Only"
msgstr "メソッドã®ã¿"
+msgid "Operators Only"
+msgstr "演算å­ã®ã¿"
+
msgid "Signals Only"
msgstr "シグナルã®ã¿"
+msgid "Annotations Only"
+msgstr "アノテーションã®ã¿"
+
msgid "Constants Only"
msgstr "定数ã®ã¿"
@@ -1757,6 +2676,9 @@ msgstr "テーマプロパティã®ã¿"
msgid "Member Type"
msgstr "メンãƒãƒ¼ã‚¿ã‚¤ãƒ—"
+msgid "(constructors)"
+msgstr "(定数)"
+
msgid "Class"
msgstr "クラス"
@@ -1766,6 +2688,9 @@ msgstr "メソッド"
msgid "Signal"
msgstr "シグナル"
+msgid "Annotation"
+msgstr "アノテーション"
+
msgid "Constant"
msgstr "コンスタント"
@@ -1775,9 +2700,21 @@ msgstr "プロパティ"
msgid "Theme Property"
msgstr "テーマプロパティ"
+msgid "This member is marked as deprecated."
+msgstr "ã“ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯éžæŽ¨å¥¨ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚"
+
+msgid "This member is marked as experimental."
+msgstr "ã“ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯å®Ÿé¨“用ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚"
+
msgid "Property:"
msgstr "プロパティ:"
+msgid "Pin Value"
+msgstr "値をピン留ã‚ã™ã‚‹"
+
+msgid "Pin Value [Disabled because '%s' is editor-only]"
+msgstr "値をピン留ã‚ã™ã‚‹ ['%s' 㯠editor-only ã®ãŸã‚無効]"
+
msgid ""
"Pinning a value forces it to be saved even if it's equal to the default."
msgstr ""
@@ -1786,44 +2723,131 @@ msgstr ""
msgid "Open Documentation"
msgstr "ドキュメントを開ã"
+msgid "Element %d: %s%d*"
+msgstr "è¦ç´  %d: %s%d*"
+
msgid "Move Up"
msgstr "上ã«ç§»å‹•"
msgid "Move Down"
msgstr "下ã«ç§»å‹•"
+msgid "Insert New Before"
+msgstr "空を挿入 (å‰)"
+
+msgid "Insert New After"
+msgstr "空を挿入 (後)"
+
+msgid "Clear Array"
+msgstr "é…列をクリア"
+
+msgid "Resize Array..."
+msgstr "é…列ã®ã‚µã‚¤ã‚ºã‚’変更..."
+
+msgid "Add Element"
+msgstr "è¦ç´ ã‚’追加"
+
msgid "Resize Array"
msgstr "é…列ã®ã‚µã‚¤ã‚ºã‚’変更"
+msgid "New Size:"
+msgstr "æ–°ã—ã„サイズ:"
+
+msgid "Element %s"
+msgstr "è¦ç´  %s"
+
+msgid "Add Metadata"
+msgstr "メタデータを追加"
+
msgid "Set %s"
msgstr "%s を設定"
msgid "Set Multiple:"
msgstr "複数設定:"
+msgid "Remove metadata %s"
+msgstr "メタデータ %s を削除"
+
msgid "Pinned %s"
msgstr "%s をピン留ã‚"
msgid "Unpinned %s"
msgstr "%s をピン留ã‚解除"
+msgid "Add metadata %s"
+msgstr "メタデータ %s を追加"
+
+msgid "Metadata name can't be empty."
+msgstr "メタデータåを空ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。"
+
+msgid "Metadata name must be a valid identifier."
+msgstr "メタデータåã¯æœ‰åŠ¹ãªè­˜åˆ¥å­ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+
+msgid "Metadata with name \"%s\" already exists."
+msgstr "\"%s\" ã¨ã„ã†åå‰ã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™ã€‚"
+
+msgid "Names starting with _ are reserved for editor-only metadata."
+msgstr "_ ã§å§‹ã¾ã‚‹åå‰ã¯ã€ã‚¨ãƒ‡ã‚£ã‚¿ãƒ¼å°‚用ã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ç”¨ã«äºˆç´„ã•ã‚Œã¦ã„ã¾ã™ã€‚"
+
+msgid "Metadata name is valid."
+msgstr "メタデータåã¯æœ‰åŠ¹ã§ã™ã€‚"
+
+msgid "Add Metadata Property for \"%s\""
+msgstr "\"%s\" ã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ プロパティを追加"
+
+msgid "Copy Value"
+msgstr "値をコピー"
+
+msgid "Paste Value"
+msgstr "値を貼り付ã‘"
+
msgid "Copy Property Path"
msgstr "プロパティã®ãƒ‘スをコピー"
+msgid "Select existing layout:"
+msgstr "既存ã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚’é¸æŠž:"
+
+msgid "Changed Locale Language Filter"
+msgstr "ロケール言語フィルターを変更"
+
+msgid "Changed Locale Script Filter"
+msgstr "ロケールスクリプトフィルタを変更"
+
+msgid "Changed Locale Country Filter"
+msgstr "ロケール国フィルターを変更"
+
msgid "Changed Locale Filter Mode"
-msgstr "ロケールフィルターモードã®å¤‰æ›´"
+msgstr "ロケールフィルターモードを変更"
+
+msgid "Select a Locale"
+msgstr "ロケールをé¸æŠž"
msgid "Show All Locales"
-msgstr "ã™ã¹ã¦ã®è¨€èªžã‚’表示"
+msgstr "ã™ã¹ã¦ã®ãƒ­ã‚±ãƒ¼ãƒ«ã‚’表示"
msgid "Show Selected Locales Only"
msgstr "é¸æŠžã—ãŸè¨€èªžã®ã¿è¡¨ç¤º"
+msgid "Edit Filters"
+msgstr "フィルターã®ç·¨é›†"
+
msgid "Language:"
msgstr "言語:"
-msgid "Script"
-msgstr "スクリプト"
+msgid "Country:"
+msgstr "国:"
+
+msgid "Language"
+msgstr "言語:"
+
+msgid "Country"
+msgstr "国"
+
+msgid "Variant"
+msgstr "ãƒãƒªã‚¢ãƒ³ãƒˆ"
+
+msgid "Filter Messages"
+msgstr "メッセージã§ãƒ•ã‚£ãƒ«ã‚¿"
msgid "Clear Output"
msgstr "出力をクリア"
@@ -1831,6 +2855,29 @@ msgstr "出力をクリア"
msgid "Copy Selection"
msgstr "é¸æŠžç¯„囲をコピー"
+msgid ""
+"Collapse duplicate messages into one log entry. Shows number of occurrences."
+msgstr ""
+"é‡è¤‡ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’1ã¤ã®ãƒ­ã‚°ã‚¨ãƒ³ãƒˆãƒªã«æŠ˜ã‚ŠãŸãŸã¿ã¾ã™ã€‚発生回数を表示ã—ã¾ã™ã€‚"
+
+msgid "Focus Search/Filter Bar"
+msgstr "フォーカス 検索/フィルターãƒãƒ¼"
+
+msgid "Toggle visibility of standard output messages."
+msgstr "標準出力メッセージã®è¡¨ç¤º/éžè¡¨ç¤ºã‚’切り替ãˆã¾ã™ã€‚"
+
+msgid "Toggle visibility of errors."
+msgstr "エラーã®è¡¨ç¤ºã‚’切り替ãˆã¾ã™ã€‚"
+
+msgid "Toggle visibility of warnings."
+msgstr "警告ã®è¡¨ç¤ºã‚’切り替ãˆã¾ã™ã€‚"
+
+msgid "Toggle visibility of editor messages."
+msgstr "エディタメッセージã®è¡¨ç¤º/éžè¡¨ç¤ºã‚’切り替ãˆã¾ã™ã€‚"
+
+msgid "Native Shader Source Inspector"
+msgstr "ãƒã‚¤ãƒ†ã‚£ãƒ– シェーダー ソース インスペクター"
+
msgid "New Window"
msgstr "æ–°è¦ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦"
@@ -1865,6 +2912,13 @@ msgstr ""
"ã“ã®ãƒªã‚½ãƒ¼ã‚¹ã¯ç·¨é›†ã—ãŸã‚·ãƒ¼ãƒ³ã«å±žã—ã¦ã„ãªã„ãŸã‚ä¿å­˜ã§ãã¾ã›ã‚“。ã¾ãšãƒ¦ãƒ‹ãƒ¼ã‚¯åŒ–"
"ã—ã¦ãã ã•ã„。"
+msgid ""
+"This resource can't be saved because it was imported from another file. Make "
+"it unique first."
+msgstr ""
+"ã“ã®ãƒªã‚½ãƒ¼ã‚¹ã¯åˆ¥ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‹ã‚‰ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•ã‚ŒãŸãŸã‚ã€ä¿å­˜ã§ãã¾ã›ã‚“。最åˆã«ã"
+"れをユニークã«ã—ã¾ã™ã€‚"
+
msgid "Save Resource As..."
msgstr "リソースを別åã§ä¿å­˜..."
@@ -1877,6 +2931,23 @@ msgstr "è¦æ±‚ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«å½¢å¼ã¯ä¸æ˜Žã§ã™:"
msgid "Error while saving."
msgstr "ä¿å­˜ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
+msgid "Can't open file '%s'. The file could have been moved or deleted."
+msgstr ""
+"'ï¼…s' ã‚’é–‹ãã“ã¨ãŒã§ãã¾ã›ã‚“。ファイルãŒç§»å‹•ã¾ãŸã¯å‰Šé™¤ã•ã‚ŒãŸå¯èƒ½æ€§ãŒã‚ã‚Šã¾"
+"ã™ã€‚"
+
+msgid "Error while parsing file '%s'."
+msgstr "ファイル '%s' ã®è§£æžä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
+
+msgid "Scene file '%s' appears to be invalid/corrupt."
+msgstr "シーン ファイル '%s' ãŒç„¡åŠ¹ã¾ãŸã¯å£Šã‚Œã¦ã„るよã†ã§ã™ã€‚"
+
+msgid "Missing file '%s' or one its dependencies."
+msgstr "'%s' ã¾ãŸã¯ãã®ä¾å­˜é–¢ä¿‚ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。"
+
+msgid "Error while loading file '%s'."
+msgstr "ファイル '%s' を読ã¿è¾¼ã‚“ã§ã„ã‚‹ã¨ãã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
+
msgid "Saving Scene"
msgstr "シーンをä¿å­˜ä¸­"
@@ -1890,6 +2961,13 @@ msgid "This operation can't be done without a tree root."
msgstr "ã“ã®æ“作ã¯ã€ãƒ„リーã®ãƒ«ãƒ¼ãƒˆãªã—ã§å®Ÿè¡Œã§ãã¾ã›ã‚“。"
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 ""
+"ã“ã®ã‚·ãƒ¼ãƒ³ã«ã¯ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã®å¾ªç’°å‚ç…§ãŒå«ã¾ã‚Œã¦ã„ã‚‹ãŸã‚ä¿å­˜ã§ãã¾ã›ã‚“。\n"
+"ã¾ãšãれを解消ã—ã¦ã‹ã‚‰ã€å†åº¦ä¿å­˜ã—ã¦ã¿ã¦ãã ã•ã„。"
+
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -1933,6 +3011,10 @@ msgstr "レイアウトåãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ï¼"
msgid "Restored the Default layout to its base settings."
msgstr "既定ã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚’基本設定ã«æˆ»ã—ã¾ã—ãŸã€‚"
+msgid "This object is marked as read-only, so it's not editable."
+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 "
@@ -1943,27 +3025,74 @@ msgstr ""
"ントをãŠèª­ã¿ãã ã•ã„。"
msgid ""
+"This resource belongs to a scene that was instantiated or inherited.\n"
+"Changes to it must be made inside the original scene."
+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 ""
+"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 ""
+"ã“ã®ã‚·ãƒ¼ãƒ³ã¯ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•ã‚ŒãŸã‚‚ã®ã§ã€å¤‰æ›´ã¯ä¿æŒã•ã‚Œã¾ã›ã‚“。\n"
+"インスタンス化もã—ãã¯ç¶™æ‰¿ã™ã‚‹ã“ã¨ã§ã€ç·¨é›†ãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚\n"
+"ã“ã®ãƒ¯ãƒ¼ã‚¯ãƒ•ãƒ­ãƒ¼ã‚’よりよãç†è§£ã™ã‚‹ãŸã‚ã«ã€ã‚·ãƒ¼ãƒ³ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«é–¢é€£ã™ã‚‹ãƒ‰ã‚­ãƒ¥"
+"メントをãŠèª­ã¿ãã ã•ã„。"
+
msgid "Changes may be lost!"
msgstr "変更ãŒå¤±ã‚れるã‹ã‚‚ã—ã‚Œã¾ã›ã‚“ï¼"
+msgid "This object is read-only."
+msgstr "ã“ã®ã‚ªãƒ–ジェクトã¯ã€èª­ã¿å–り専用ã§ã™ã€‚"
+
+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 ""
+"ムービーメーカーモードã¯æœ‰åŠ¹ã§ã™ãŒã€å‹•ç”»ãƒ•ã‚¡ã‚¤ãƒ«ã®ä¿å­˜ãƒ‘スãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›"
+"ん。\n"
+"デフォルトã®å‹•ç”»ãƒ•ã‚¡ã‚¤ãƒ«ã®ä¿å­˜ãƒ‘スã¯ã€ãƒ—ロジェクト設定ã®ã€ŒEditor > Movie "
+"Writerã€ã‚«ãƒ†ã‚´ãƒªã§æŒ‡å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚\n"
+"ã¾ãŸã€å˜ä¸€ã®ã‚·ãƒ¼ãƒ³ã‚’実行ã™ã‚‹å ´åˆã¯ã€ãƒ«ãƒ¼ãƒˆãƒŽãƒ¼ãƒ‰ã« `movie_file` 文字列メタ"
+"データを追加ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚\n"
+"ãã®ã‚·ãƒ¼ãƒ³ã‚’録画ã™ã‚‹ã¨ãã«ä½¿ç”¨ã™ã‚‹å‹•ç”»ãƒ•ã‚¡ã‚¤ãƒ«ã®ä¿å­˜ãƒ‘スを指定ã—ã¾ã™ã€‚"
+
msgid "There is no defined scene to run."
msgstr "実行ã™ã‚‹ã‚·ãƒ¼ãƒ³ãŒå®šç¾©ã•ã‚Œã¦ã„ã¾ã›ã‚“。"
msgid "Save scene before running..."
msgstr "実行å‰ã«ã‚·ãƒ¼ãƒ³ã‚’ä¿å­˜..."
+msgid "Could not start subprocess(es)!"
+msgstr "サブプロセスを開始ã§ãã¾ã›ã‚“ã§ã—ãŸï¼"
+
+msgid "Reload the played scene."
+msgstr "å†ç”Ÿã•ã‚ŒãŸã‚·ãƒ¼ãƒ³ã‚’リロード"
+
msgid "Play the project."
msgstr "プロジェクトを実行。"
msgid "Play the edited scene."
msgstr "編集ã—ãŸã‚·ãƒ¼ãƒ³ã‚’実行。"
+msgid "Play a custom scene."
+msgstr "カスタムシーンを実行"
+
msgid "Open Base Scene"
msgstr "ベースã®ã‚·ãƒ¼ãƒ³ã‚’é–‹ã"
@@ -1979,9 +3108,15 @@ msgstr "スクリプトをクイックオープン..."
msgid "Save & Reload"
msgstr "ä¿å­˜ã—ã¦å†èª­ã¿è¾¼ã¿"
+msgid "Save modified resources before reloading?"
+msgstr "リロードã™ã‚‹å‰ã«å¤‰æ›´ã—ãŸãƒªã‚½ãƒ¼ã‚¹ã‚’ä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ"
+
msgid "Save & Quit"
msgstr "ä¿å­˜ã—ã¦çµ‚了"
+msgid "Save modified resources before closing?"
+msgstr "é–‰ã˜ã‚‹å‰ã«å¤‰æ›´ã—ãŸãƒªã‚½ãƒ¼ã‚¹ã‚’ä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ"
+
msgid "Save changes to '%s' before reloading?"
msgstr "å†èª­ã¿è¾¼ã¿å‰ã«ã€'%s' ã¸ã®å¤‰æ›´ã‚’ä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ"
@@ -2017,12 +3152,30 @@ msgstr "マウスボタンãŒæŠ¼ã•ã‚Œã¦ã„ã‚‹é–“ã¯å…ƒã«æˆ»ã›ã¾ã›ã‚“。"
msgid "Nothing to undo."
msgstr "å…ƒã«æˆ»ã™ã‚‚ã®ãŒã‚ã‚Šã¾ã›ã‚“。"
+msgid "Global Undo: %s"
+msgstr "グローãƒãƒ«å…ƒã«æˆ»ã™: %s"
+
+msgid "Remote Undo: %s"
+msgstr "リモート元ã«æˆ»ã™: %s"
+
+msgid "Scene Undo: %s"
+msgstr "シーン元ã«æˆ»ã™: %s"
+
msgid "Can't redo while mouse buttons are pressed."
msgstr "マウスボタンãŒæŠ¼ã•ã‚Œã¦ã„ã‚‹é–“ã¯ã‚„ã‚Šç›´ã›ã¾ã›ã‚“。"
msgid "Nothing to redo."
msgstr "ã‚„ã‚Šç›´ã™ã‚‚ã®ãŒã‚ã‚Šã¾ã›ã‚“。"
+msgid "Global Redo: %s"
+msgstr "グローãƒãƒ«ã‚„ã‚Šç›´ã™: %s"
+
+msgid "Remote Redo: %s"
+msgstr "リモートやり直ã™: %s"
+
+msgid "Scene Redo: %s"
+msgstr "シーンやり直ã™: %s"
+
msgid "Can't reload a scene that was never saved."
msgstr "ä¿å­˜ã•ã‚Œã¦ã„ãªã„シーンを読ã¿è¾¼ã‚€ã“ã¨ã¯ã§ãã¾ã›ã‚“。"
@@ -2194,6 +3347,9 @@ msgstr "ビューをパン"
msgid "Dock Position"
msgstr "ドックã®ä½ç½®"
+msgid "Make Floating"
+msgstr "フローティングを作æˆ"
+
msgid "Add a new scene."
msgstr "æ–°è¦ã‚·ãƒ¼ãƒ³ã‚’追加ã™ã‚‹ã€‚"
@@ -2215,6 +3371,18 @@ msgstr "以å‰ã«é–‹ã„ãŸã‚·ãƒ¼ãƒ³ã«ç§»å‹•ã™ã‚‹ã€‚"
msgid "Copy Text"
msgstr "テキストをコピー"
+msgid "Next Scene Tab"
+msgstr "次ã®ã‚·ãƒ¼ãƒ³ã‚¿ãƒ–"
+
+msgid "Previous Scene Tab"
+msgstr "å‰ã®ã‚·ãƒ¼ãƒ³ã‚¿ãƒ–"
+
+msgid "Focus FileSystem Filter"
+msgstr "フォーカス ファイルシステム フィルタ"
+
+msgid "Command Palette"
+msgstr "コマンドパレット"
+
msgid "New Scene"
msgstr "æ–°è¦ã‚·ãƒ¼ãƒ³"
@@ -2233,6 +3401,9 @@ msgstr "最近開ã„ãŸã‚·ãƒ¼ãƒ³ã‚’é–‹ã"
msgid "Save Scene"
msgstr "シーンをä¿å­˜"
+msgid "Export As..."
+msgstr "エクスãƒãƒ¼ãƒˆ..."
+
msgid "MeshLibrary..."
msgstr "メッシュライブラリ..."
@@ -2248,9 +3419,18 @@ msgstr "プロジェクト"
msgid "Project Settings..."
msgstr "プロジェクト設定..."
+msgid "Project Settings"
+msgstr "プロジェクト設定"
+
msgid "Version Control"
msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«"
+msgid "Create Version Control Metadata"
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç®¡ç†ç”¨ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã®ä½œæˆ"
+
+msgid "Version Control Settings"
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç®¡ç†è¨­å®š"
+
msgid "Export..."
msgstr "エクスãƒãƒ¼ãƒˆ..."
@@ -2260,6 +3440,9 @@ msgstr "Androidビルドテンプレートã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«..."
msgid "Open User Data Folder"
msgstr "ユーザーデータフォルダーを開ã"
+msgid "Customize Engine Build Configuration..."
+msgstr "エンジンã®ãƒ“ルド構æˆã‚’カスタマイズã™ã‚‹..."
+
msgid "Tools"
msgstr "ツール"
@@ -2278,6 +3461,9 @@ msgstr "エディター"
msgid "Editor Settings..."
msgstr "エディター設定..."
+msgid "Command Palette..."
+msgstr "コマンドパレット..."
+
msgid "Editor Layout"
msgstr "エディターレイアウト"
@@ -2306,6 +3492,9 @@ msgstr "エディター機能ã®ç®¡ç†..."
msgid "Manage Export Templates..."
msgstr "エクスãƒãƒ¼ãƒˆãƒ†ãƒ³ãƒ—レートã®ç®¡ç†..."
+msgid "Configure FBX Importer..."
+msgstr "FBX Importerã®è¨­å®š..."
+
msgid "Help"
msgstr "ヘルプ"
@@ -2333,12 +3522,66 @@ msgstr "Godotã«ã¤ã„ã¦"
msgid "Support Godot Development"
msgstr "Godotã®é–‹ç™ºã‚’サãƒãƒ¼ãƒˆã™ã‚‹"
+msgid "Run the project's default scene."
+msgstr "プロジェクトã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã‚·ãƒ¼ãƒ³ã‚’実行ã—ã¾ã™ã€‚"
+
msgid "Run Project"
msgstr "プロジェクトを実行"
+msgid "Pause the running project's execution for debugging."
+msgstr "実行中ã®ãƒ—ロジェクトã®å®Ÿè¡Œã‚’一時åœæ­¢ã—ã€ãƒ‡ãƒãƒƒã‚°ã‚’è¡Œã„ã¾ã™ã€‚"
+
+msgid "Pause Running Project"
+msgstr "実行中ã®ãƒ—ロジェクトを一時åœæ­¢"
+
+msgid "Stop the currently running project."
+msgstr "ç¾åœ¨å®Ÿè¡Œä¸­ã®ãƒ—ロジェクトをåœæ­¢ã—ã¾ã™ã€‚"
+
+msgid "Stop Running Project"
+msgstr "プロジェクトã®å®Ÿè¡Œã‚’åœæ­¢"
+
+msgid "Run the currently edited scene."
+msgstr "ç¾åœ¨ç·¨é›†ä¸­ã®ã‚·ãƒ¼ãƒ³ã‚’実行ã—ã¾ã™ã€‚"
+
+msgid "Run Current Scene"
+msgstr "ç¾åœ¨ã®ã‚·ãƒ¼ãƒ³ã‚’実行"
+
+msgid "Run a specific scene."
+msgstr "特定ã®ã‚·ãƒ¼ãƒ³ã‚’実行ã—ã¾ã™ã€‚"
+
+msgid "Run Specific Scene"
+msgstr "特定ã®ã‚·ãƒ¼ãƒ³ã‚’実行"
+
+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 ""
+"ムービーメーカーモードを有効ã«ã—ã¾ã™ã€‚\n"
+"プロジェクトã¯å®‰å®šã—ãŸFPSã§å®Ÿè¡Œã•ã‚Œã€ãƒ“ジュアルã¨ã‚ªãƒ¼ãƒ‡ã‚£ã‚ªå‡ºåŠ›ã¯å‹•ç”»ãƒ•ã‚¡ã‚¤ãƒ«"
+"ã«è¨˜éŒ²ã•ã‚Œã¾ã™ã€‚"
+
+msgid "Choose a renderer."
+msgstr "レンダラーをé¸æŠž"
+
+msgid "Forward+"
+msgstr "Forward+"
+
+msgid "Mobile"
+msgstr "モãƒã‚¤ãƒ«"
+
+msgid "Compatibility"
+msgstr "互æ›æ€§"
+
+msgid "Changing the renderer requires restarting the editor."
+msgstr "レンダラーを変更ã™ã‚‹ã«ã¯ã€ã‚¨ãƒ‡ã‚£ã‚¿ã®å†èµ·å‹•ãŒå¿…è¦ã§ã™ã€‚"
+
msgid "Update Continuously"
msgstr "継続的ã«æ›´æ–°"
+msgid "Update When Changed"
+msgstr "変更時ã«æ›´æ–°"
+
msgid "Hide Update Spinner"
msgstr "アップデートスピナーをéžè¡¨ç¤º"
@@ -2351,6 +3594,9 @@ msgstr "インスペクター"
msgid "Node"
msgstr "ノード"
+msgid "History"
+msgstr "履歴"
+
msgid "Expand Bottom Panel"
msgstr "下パãƒãƒ«ã‚’展開"
@@ -2371,22 +3617,8 @@ msgstr "テンプレートã®ç®¡ç†"
msgid "Install from file"
msgstr "ファイルã‹ã‚‰ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«"
-msgid ""
-"This will set up your project for custom Android builds by installing the "
-"source template to \"res://android/build\".\n"
-"You can then apply modifications and build your own custom APK on export "
-"(adding modules, changing the AndroidManifest.xml, etc.).\n"
-"Note that in order to make custom builds instead of using pre-built APKs, "
-"the \"Use Custom Build\" option should be enabled in the Android export "
-"preset."
-msgstr ""
-"ã“ã®æ“作㯠\"res://android/build\" ã«ã‚½ãƒ¼ã‚¹ãƒ†ãƒ³ãƒ—レートをインストールã—ã€"
-"Androidã®ã‚«ã‚¹ã‚¿ãƒ ãƒ“ルドã®è¨­å®šãŒãƒ—ロジェクトã«ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—ã•ã‚Œã¾ã™ã€‚\n"
-"後ã‹ã‚‰è¨­å®šã«å¤‰æ›´ã‚’加ãˆãŸã‚Šã€ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆæ™‚ã«ã‚«ã‚¹ã‚¿ãƒ APKをビルドã§ãã¾ã™ (モ"
-"ジュールを追加ã™ã‚‹ã€AndroidManifest.xmlを変更ã™ã‚‹ãªã©)。\n"
-"ビルド済ã¿APKã®ä»£ã‚ã‚Šã«ã‚«ã‚¹ã‚¿ãƒ ãƒ“ルドをã™ã‚‹ãŸã‚ã«ã¯ã€Androidã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆè¨­"
-"定ã®ã€ŒUse Custom Build (カスタムビルドを使用ã™ã‚‹)ã€ã®ã‚ªãƒ—ションãŒæœ‰åŠ¹åŒ–ã•ã‚Œã¦"
-"ã„ã‚‹å¿…è¦ãŒã‚ã‚‹ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。"
+msgid "Select Android sources file"
+msgstr "Androidã®ã‚½ãƒ¼ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠž"
msgid ""
"The Android build template is already installed in this project and it won't "
@@ -2456,6 +3688,9 @@ msgstr "次ã®ã‚¨ãƒ‡ã‚£ã‚¿ãƒ¼ã‚’é–‹ã"
msgid "Open the previous Editor"
msgstr "å‰ã®ã‚¨ãƒ‡ã‚£ã‚¿ãƒ¼ã‚’é–‹ã"
+msgid "Ok"
+msgstr "OK"
+
msgid "Warning!"
msgstr "警告ï¼"
@@ -2480,6 +3715,9 @@ msgstr "プラグインã®ç·¨é›†"
msgid "Installed Plugins:"
msgstr "インストール済プラグイン:"
+msgid "Create New Plugin"
+msgstr "æ–°ã—ã„プラグインを作æˆ"
+
msgid "Version"
msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³"
@@ -2495,6 +3733,9 @@ msgstr "テキストを編集:"
msgid "On"
msgstr "オン"
+msgid "Renaming layer %d:"
+msgstr "レイヤー %d をリãƒãƒ¼ãƒ :"
+
msgid "No name provided."
msgstr "åå‰ãŒä»˜ã„ã¦ã„ã¾ã›ã‚“。"
@@ -2507,12 +3748,45 @@ msgstr "ビット %d, 値 %d"
msgid "Rename"
msgstr "åå‰ã®å¤‰æ›´"
+msgid "Rename layer"
+msgstr "レイヤーåを変更"
+
+msgid "Layer %d"
+msgstr "レイヤー %d"
+
+msgid "No Named Layers"
+msgstr "ç„¡åレイヤー"
+
+msgid "Edit Layer Names"
+msgstr "レイヤーåã®ç·¨é›†"
+
+msgid "<empty>"
+msgstr "<空>"
+
+msgid "Temporary Euler may be changed implicitly!"
+msgstr "一時的ãªã‚ªã‚¤ãƒ©ãƒ¼ã¯æš—黙的ã«å¤‰æ›´ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™!"
+
+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 ""
+"一時的ãªã‚ªã‚¤ãƒ©ãƒ¼ã¯ã€å…ƒã®å€¤ã‚’æŒã¤ã‚ªãƒ–ジェクトã«æ ¼ç´ã•ã‚Œã¾ã›ã‚“。代ã‚ã‚Šã«ã€ä¸å¯"
+"逆変æ›ã®ã‚¯ã‚©ãƒ¼ã‚¿ãƒ‹ã‚ªãƒ³ã¨ã—ã¦æ ¼ç´ã•ã‚Œã¾ã™ã€‚\n"
+"ã“ã‚Œã¯ã€ã‚ªã‚¤ãƒ©ãƒ¼->四元数ã®çµæžœã¯ä¸€æ„ã«æ±ºå®šã§ãã¾ã™ãŒã€å››å…ƒæ•°->オイラーã®çµæžœ"
+"ã¯è¤‡æ•°å­˜åœ¨ã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹ãŸã‚ã§ã™ã€‚"
+
msgid "Assign..."
msgstr "割り当ã¦..."
msgid "Invalid RID"
msgstr "無効ãªRID"
+msgid "Recursion detected, unable to assign resource to property."
+msgstr "å†å¸°ãŒæ¤œå‡ºã•ã‚Œã€ãƒªã‚½ãƒ¼ã‚¹ã‚’プロパティã«å‰²ã‚Šå½“ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。"
+
msgid ""
"Can't create a ViewportTexture on resources saved as a file.\n"
"Resource needs to belong to a scene."
@@ -2537,12 +3811,24 @@ msgstr "ビューãƒãƒ¼ãƒˆã‚’é¸ã¶"
msgid "Selected node is not a Viewport!"
msgstr "é¸æŠžã—ãŸãƒŽãƒ¼ãƒ‰ã¯ãƒ“ューãƒãƒ¼ãƒˆã§ã¯ã‚ã‚Šã¾ã›ã‚“ï¼"
+msgid "(Nil) %s"
+msgstr "(Nil) %s"
+
+msgid "%s (size %s)"
+msgstr "%s (サイズ %s)"
+
msgid "Size:"
msgstr "サイズ:"
msgid "Remove Item"
msgstr "アイテムを除去"
+msgid "Dictionary (Nil)"
+msgstr "Dictionary (Nil)"
+
+msgid "Dictionary (size %d)"
+msgstr "Dictionary (サイズ %d)"
+
msgid "New Key:"
msgstr "æ–°è¦ã‚­ãƒ¼:"
@@ -2552,6 +3838,15 @@ msgstr "æ–°è¦ã®å€¤:"
msgid "Add Key/Value Pair"
msgstr "キー/値ã®ãƒšã‚¢ã‚’追加"
+msgid "Localizable String (Nil)"
+msgstr "ローカライズå¯èƒ½ãªæ–‡å­—列(Nil)"
+
+msgid "Localizable String (size %d)"
+msgstr "ローカライズå¯èƒ½ãªæ–‡å­—列 (サイズ %d)"
+
+msgid "Add Translation"
+msgstr "翻訳を追加"
+
msgid ""
"The selected resource (%s) does not match any type expected for this "
"property (%s)."
@@ -2562,9 +3857,15 @@ msgstr ""
msgid "Quick Load"
msgstr "クイックロード"
+msgid "Inspect"
+msgstr "検査"
+
msgid "Make Unique"
msgstr "ユニーク化"
+msgid "Make Unique (Recursive)"
+msgstr "ユニーク化 (å†å¸°çš„)"
+
msgid "Convert to %s"
msgstr "%s ã«å¤‰æ›"
@@ -2577,6 +3878,15 @@ msgstr "æ–°è¦ã‚¹ã‚¯ãƒªãƒ—ト"
msgid "Extend Script"
msgstr "スクリプトを拡張"
+msgid "New Shader"
+msgstr "æ–°ã—ã„シェーダー"
+
+msgid "No Remote Debug export presets configured."
+msgstr "リモートデãƒãƒƒã‚°ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆãƒ—リセットãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。"
+
+msgid "Remote Debug"
+msgstr "リモートデãƒãƒƒã‚°"
+
msgid ""
"No runnable export preset found for this platform.\n"
"Please add a runnable preset in the Export menu or define an existing preset "
@@ -2595,6 +3905,18 @@ msgstr "ロジックを _run() メソッドã«è¨˜è¿°ã™ã‚‹ã€‚"
msgid "There is an edited scene already."
msgstr "ã™ã§ã«ç·¨é›†ã•ã‚ŒãŸã‚·ãƒ¼ãƒ³ãŒã‚ã‚Šã¾ã™ã€‚"
+msgid ""
+"Couldn't run editor script, did you forget to override the '_run' method?"
+msgstr ""
+"エディタスクリプトを実行ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚'_run'メソッドをオーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã™ã‚‹"
+"ã®ã‚’忘れã¦ã„ã¾ã›ã‚“ã‹ï¼Ÿ"
+
+msgid "Edit Built-in Action"
+msgstr "組ã¿è¾¼ã¿ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã®ç·¨é›†"
+
+msgid "Edit Shortcut"
+msgstr "ショートカットを編集"
+
msgid "Common"
msgstr "一般"
@@ -2604,6 +3926,9 @@ msgstr "エディター設定"
msgid "General"
msgstr "一般"
+msgid "Filter Settings"
+msgstr "フィルター設定"
+
msgid "The editor must be restarted for changes to take effect."
msgstr "変更を有効ã«ã™ã‚‹ã«ã¯ã€ã‚¨ãƒ‡ã‚£ã‚¿ãƒ¼ã‚’å†èµ·å‹•ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
@@ -2613,8 +3938,81 @@ msgstr "ショートカット"
msgid "Binding"
msgstr "ãƒã‚¤ãƒ³ãƒ‰"
-msgid "%s Error"
-msgstr "%s エラー"
+msgid ""
+"Hold %s to round to integers.\n"
+"Hold Shift for more precise changes."
+msgstr ""
+"%s を押ã—ãŸã¾ã¾ã§æ•´æ•°å€¤ã«ä¸¸ã‚る。\n"
+"Shiftを押ã—ãŸã¾ã¾ã§ç²¾å¯†èª¿æ•´ã€‚"
+
+msgid "No notifications."
+msgstr "通知ã¯ã‚ã‚Šã¾ã›ã‚“。"
+
+msgid "Show notifications."
+msgstr "通知を見る"
+
+msgid "Silence the notifications."
+msgstr "通知を無効ã«ã™ã‚‹"
+
+msgid "Left Stick Left, Joystick 0 Left"
+msgstr "左スティック 左, ジョイスティック 0 左"
+
+msgid "Left Stick Right, Joystick 0 Right"
+msgstr "左スティック å³, ジョイスティック 0 å³"
+
+msgid "Left Stick Up, Joystick 0 Up"
+msgstr "左スティック 上, ジョイスティック 0 上"
+
+msgid "Left Stick Down, Joystick 0 Down"
+msgstr "左スティック 下, ジョイスティック 0 下"
+
+msgid "Right Stick Left, Joystick 1 Left"
+msgstr "å³ã‚¹ãƒ†ã‚£ãƒƒã‚¯ å·¦, ジョイスティック 1 å·¦"
+
+msgid "Right Stick Right, Joystick 1 Right"
+msgstr "å³ã‚¹ãƒ†ã‚£ãƒƒã‚¯ å³, ジョイスティック 1 å³"
+
+msgid "Right Stick Up, Joystick 1 Up"
+msgstr "å³ã‚¹ãƒ†ã‚£ãƒƒã‚¯ 上, ジョイスティック 1 上"
+
+msgid "Right Stick Down, Joystick 1 Down"
+msgstr "å³ã‚¹ãƒ†ã‚£ãƒƒã‚¯ 下, ジョイスティック 1 下"
+
+msgid "Joystick 2 Left"
+msgstr "ジョイスティック 2 左"
+
+msgid "Left Trigger, Sony L2, Xbox LT, Joystick 2 Right"
+msgstr "左トリガー, ソニー L2, Xbox LT, ジョイスティック 2 å³"
+
+msgid "Joystick 2 Up"
+msgstr "ジョイスティック 2 上"
+
+msgid "Right Trigger, Sony R2, Xbox RT, Joystick 2 Down"
+msgstr "å³ãƒˆãƒªã‚¬ãƒ¼, ソニー R2, Xbox RT, ジョイスティック 2 下"
+
+msgid "Joystick 3 Left"
+msgstr "ジョイスティック 3 左"
+
+msgid "Joystick 3 Right"
+msgstr "ジョイスティック 3 å³"
+
+msgid "Joystick 3 Up"
+msgstr "ジョイスティック 3 上"
+
+msgid "Joystick 3 Down"
+msgstr "ジョイスティック 3 下"
+
+msgid "Joystick 4 Left"
+msgstr "ジョイスティック 4 左"
+
+msgid "Joystick 4 Right"
+msgstr "ジョイスティック 4 å³"
+
+msgid "Joystick 4 Up"
+msgstr "ジョイスティック 4 上"
+
+msgid "Joystick 4 Down"
+msgstr "ジョイスティック 4 下"
msgid "All Devices"
msgstr "ã™ã¹ã¦ã®ãƒ‡ãƒã‚¤ã‚¹"
@@ -2622,6 +4020,12 @@ msgstr "ã™ã¹ã¦ã®ãƒ‡ãƒã‚¤ã‚¹"
msgid "Device"
msgstr "デãƒã‚¤ã‚¹"
+msgid "Listening for input..."
+msgstr "入力を確èªã—ã¦ã„ã¾ã™..."
+
+msgid "Filter by event..."
+msgstr "イベントã§ãƒ•ã‚£ãƒ«ã‚¿..."
+
msgid "Project export for platform:"
msgstr "次ã®ãƒ—ラットフォームå‘ã‘ã«ãƒ—ロジェクトをエクスãƒãƒ¼ãƒˆ:"
@@ -2661,6 +4065,15 @@ msgstr "プロジェクトファイルをエクスãƒãƒ¼ãƒˆã§ãã¾ã›ã‚“ã§ã—
msgid "Can't open file to read from path \"%s\"."
msgstr "読ã¿è¾¼ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã‚’パス \"%s\" ã‹ã‚‰é–‹ã‘ã¾ã›ã‚“。"
+msgid "Can't open executable file from path \"%s\"."
+msgstr "パス \"%s\" ã‹ã‚‰å®Ÿè¡Œå¯èƒ½ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‹ã‘ã¾ã›ã‚“。"
+
+msgid "Can't create encrypted file."
+msgstr "æš—å·åŒ–ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’作æˆã§ãã¾ã›ã‚“。"
+
+msgid "Can't open encrypted file to write."
+msgstr "æš—å·åŒ–ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‹ã„ã¦æ›¸ã込むã“ã¨ãŒã§ãã¾ã›ã‚“。"
+
msgid "Save ZIP"
msgstr "ZIPã‚’ä¿å­˜"
@@ -2784,6 +4197,9 @@ msgstr "ダウンロード中"
msgid "Connection Error"
msgstr "接続エラー"
+msgid "TLS Handshake Error"
+msgstr "TLSãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚¨ãƒ©ãƒ¼"
+
msgid "Can't open the export templates file."
msgstr "エクスãƒãƒ¼ãƒˆãƒ†ãƒ³ãƒ—レート ファイルを開ã‘ã¾ã›ã‚“。"
@@ -2888,6 +4304,9 @@ msgstr ""
msgid "Runnable"
msgstr "実行å¯èƒ½"
+msgid "Export the project for all the presets defined."
+msgstr "定義ã•ã‚ŒãŸã™ã¹ã¦ã®ãƒ—リセットã®ãƒ—ロジェクトをエクスãƒãƒ¼ãƒˆã—ã¾ã™ã€‚"
+
msgid "All presets must have an export path defined for Export All to work."
msgstr ""
"å…¨ã¦ã®ãƒ—リセットã¯ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆãŒå…¨ã¦æ©Ÿèƒ½ã™ã‚‹ãŸã‚ã«ã€ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆãƒ‘スを定義ã™"
@@ -2896,6 +4315,9 @@ msgstr ""
msgid "Delete preset '%s'?"
msgstr "プリセット '%s' を削除ã—ã¾ã™ã‹ï¼Ÿ"
+msgid "%s Export"
+msgstr "%s エクスãƒãƒ¼ãƒˆ"
+
msgid "Release"
msgstr "リリース"
@@ -2938,12 +4360,28 @@ msgstr "é¸æŠžã—ãŸã‚·ãƒ¼ãƒ³(ã¨ä¾å­˜é–¢ä¿‚ã«ã‚ã‚‹ã‚‚ã®)をエクスãƒãƒ¼ã
msgid "Export selected resources (and dependencies)"
msgstr "é¸æŠžã—ãŸãƒªã‚½ãƒ¼ã‚¹(ã¨ä¾å­˜é–¢ä¿‚ã«ã‚ã‚‹ã‚‚ã®)をエクスãƒãƒ¼ãƒˆ"
+msgid "Export all resources in the project except resources checked below"
+msgstr ""
+"以下ã®ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã‚’オンã«ã—ãŸãƒªã‚½ãƒ¼ã‚¹ã‚’除ãã€ãƒ—ロジェクト内ã®ã™ã¹ã¦ã®ãƒª"
+"ソースをエクスãƒãƒ¼ãƒˆ"
+
+msgid "Export as dedicated server"
+msgstr "専用サーãƒãƒ¼ã¨ã—ã¦ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ"
+
msgid "Export Mode:"
msgstr "エクスãƒãƒ¼ãƒˆãƒ¢ãƒ¼ãƒ‰:"
msgid "Resources to export:"
msgstr "エクスãƒãƒ¼ãƒˆã™ã‚‹ãƒªã‚½ãƒ¼ã‚¹:"
+msgid ""
+"\"Strip Visuals\" will replace the following resources with placeholders:"
+msgstr ""
+"\"ストリップビジュアル\" ã¯ã€æ¬¡ã®ãƒªã‚½ãƒ¼ã‚¹ã‚’プレースホルダーã«ç½®ãæ›ãˆã¾ã™:"
+
+msgid "Strip Visuals"
+msgstr "ストリップビジュアル"
+
msgid "Keep"
msgstr "ä¿æŒ"
@@ -2970,9 +4408,35 @@ msgstr "カスタム (コンマ区切り):"
msgid "Feature List:"
msgstr "機能一覧:"
+msgid "Encryption"
+msgstr "æš—å·åŒ–"
+
+msgid "Encrypt Exported PCK"
+msgstr "エクスãƒãƒ¼ãƒˆã•ã‚ŒãŸPCKã®æš—å·åŒ–"
+
+msgid "Encrypt Index (File Names and Info)"
+msgstr "æš—å·åŒ–インデックス(ファイルåã¨æƒ…報)"
+
+msgid ""
+"Filters to include files/folders\n"
+"(comma-separated, e.g: *.tscn, *.tres, scenes/*)"
+msgstr ""
+"ファイル/フォルダーをå«ã‚ã‚‹ãŸã‚ã®ãƒ•ã‚£ãƒ«ã‚¿\n"
+"(カンマ区切りã€ä¾‹: *.tscn, *.tres, scenes/*)"
+
+msgid ""
+"Filters to exclude files/folders\n"
+"(comma-separated, e.g: *.ctex, *.import, music/*)"
+msgstr ""
+"ファイル/フォルダーを除外ã™ã‚‹ãŸã‚ã®ãƒ•ã‚£ãƒ«ã‚¿\n"
+"(カンマ区切りã€ä¾‹: *.ctex, *.import, music/*)"
+
msgid "Invalid Encryption Key (must be 64 hexadecimal characters long)"
msgstr "無効ãªæš—å·åŒ–キー (16進数ã§64文字ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™)"
+msgid "Encryption Key (256-bits as hexadecimal):"
+msgstr "æš—å·åŒ–キー (16 進数㧠256 ビット):"
+
msgid ""
"Note: Encryption key needs to be stored in the binary,\n"
"you need to build the export templates from source."
@@ -2983,6 +4447,9 @@ msgstr ""
msgid "More Info..."
msgstr "詳細情報..."
+msgid "Export PCK/ZIP..."
+msgstr "PCK/Zipã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ..."
+
msgid "Export Project..."
msgstr "プロジェクトã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ..."
@@ -3013,9 +4480,39 @@ msgstr "エクスãƒãƒ¼ãƒˆãƒ†ãƒ³ãƒ—レートã®ç®¡ç†"
msgid "Export With Debug"
msgstr "デãƒãƒƒã‚°ä»˜ãエクスãƒãƒ¼ãƒˆ"
+msgid "Path to FBX2glTF executable is empty."
+msgstr "FBX2glTFã®å®Ÿè¡Œãƒ•ã‚¡ã‚¤ãƒ«ã¸ã®ãƒ‘スãŒç©ºã§ã™ã€‚"
+
+msgid "Path to FBX2glTF executable is invalid."
+msgstr "FBX2glTF 実行å¯èƒ½ãƒ•ã‚¡ã‚¤ãƒ«ã¸ã®ãƒ‘スãŒç„¡åŠ¹ã§ã™ã€‚"
+
+msgid "Error executing this file (wrong version or architecture)."
+msgstr ""
+"ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®å®Ÿè¡Œã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸï¼ˆãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¾ãŸã¯ã‚¢ãƒ¼ã‚­ãƒ†ã‚¯ãƒãƒ£ãŒæ­£"
+"ã—ãã‚ã‚Šã¾ã›ã‚“)。"
+
+msgid "FBX2glTF executable is valid."
+msgstr "FBX2glTFã®å®Ÿè¡Œãƒ•ã‚¡ã‚¤ãƒ«ã¯æœ‰åŠ¹ã§ã™ã€‚"
+
+msgid "Configure FBX Importer"
+msgstr "FBXインãƒãƒ¼ã‚¿ãƒ¼ã®è¨­å®š"
+
+msgid ""
+"FBX2glTF is required for importing FBX files.\n"
+"Please download it and provide a valid path to the binary:"
+msgstr ""
+"FBX2glTFã¯ã€FBXファイルをインãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã«å¿…è¦ã§ã™ã€‚\n"
+"ダウンロードã—ã€ãƒã‚¤ãƒŠãƒªã¸ã®æœ‰åŠ¹ãªãƒ‘スを指定ã—ã¦ãã ã•ã„。"
+
+msgid "Click this link to download FBX2glTF"
+msgstr "FBX2glTFをダウンロードã™ã‚‹ã«ã¯ã€ã“ã®ãƒªãƒ³ã‚¯ã‚’クリックã—ã¦ãã ã•ã„"
+
msgid "Browse"
msgstr "å‚ç…§"
+msgid "Confirm Path"
+msgstr "パスã®ç¢ºèª"
+
msgid "Favorites"
msgstr "ãŠæ°—ã«å…¥ã‚Š"
@@ -3042,6 +4539,12 @@ msgstr "移動中ã®ã‚¨ãƒ©ãƒ¼:"
msgid "Error duplicating:"
msgstr "複製エラー:"
+msgid "Failed to save resource at %s: %s"
+msgstr "%s ã§ãƒªã‚½ãƒ¼ã‚¹ã‚’ä¿å­˜ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+msgid "Failed to load resource at %s: %s"
+msgstr "%s ã§ãƒªã‚½ãƒ¼ã‚¹ã‚’ロードã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
msgid "Unable to update dependencies:"
msgstr "ä¾å­˜é–¢ä¿‚ã‚’æ›´æ–°ã§ãã¾ã›ã‚“:"
@@ -3096,6 +4599,9 @@ msgstr "æ–°ã—ã„継承シーン"
msgid "Set As Main Scene"
msgstr "メインシーンã¨ã—ã¦è¨­å®š"
+msgid "Instantiate"
+msgstr "インスタンス化"
+
msgid "Add to Favorites"
msgstr "ãŠæ°—ã«å…¥ã‚Šã«è¿½åŠ "
@@ -3111,6 +4617,21 @@ msgstr "オーナーを見る..."
msgid "Move To..."
msgstr "移動..."
+msgid "Folder..."
+msgstr "フォルダー..."
+
+msgid "Scene..."
+msgstr "シーン..."
+
+msgid "Script..."
+msgstr "スクリプト..."
+
+msgid "Resource..."
+msgstr "リソース..."
+
+msgid "TextFile..."
+msgstr "テキストファイル..."
+
msgid "New Scene..."
msgstr "æ–°è¦ã‚·ãƒ¼ãƒ³..."
@@ -3120,6 +4641,12 @@ msgstr "æ–°è¦ã‚¹ã‚¯ãƒªãƒ—ト..."
msgid "New Resource..."
msgstr "æ–°è¦ãƒªã‚½ãƒ¼ã‚¹..."
+msgid "New TextFile..."
+msgstr "æ–°è¦ãƒ†ã‚­ã‚¹ãƒˆãƒ•ã‚¡ã‚¤ãƒ«..."
+
+msgid "Sort Files"
+msgstr "ファイルã®ä¸¦ã³æ›¿ãˆ"
+
msgid "Sort by Name (Ascending)"
msgstr "åå‰ (昇順) ã§ä¸¦ã³æ›¿ãˆ"
@@ -3138,18 +4665,33 @@ msgstr "更新日時ãŒæ–°ã—ã„é †ã§ä¸¦ã³æ›¿ãˆ"
msgid "Sort by First Modified"
msgstr "更新日時ãŒå¤ã„é †ã§ä¸¦ã³æ›¿ãˆ"
+msgid "Copy UID"
+msgstr "UIDをコピー"
+
msgid "Duplicate..."
msgstr "複製..."
msgid "Rename..."
msgstr "åå‰ã‚’変更..."
+msgid "Open in External Program"
+msgstr "外部プログラムã§é–‹ã"
+
+msgid "Go to previous selected folder/file."
+msgstr "å‰ã«é¸æŠžã—ãŸãƒ•ã‚©ãƒ«ãƒ€/ファイルã«ç§»å‹•ã—ã¾ã™ã€‚"
+
+msgid "Go to next selected folder/file."
+msgstr "次ã«é¸æŠžã—ãŸãƒ•ã‚©ãƒ«ãƒ€/ファイルã«ç§»å‹•ã—ã¾ã™ã€‚"
+
msgid "Re-Scan Filesystem"
msgstr "ファイルシステムをå†ã‚¹ã‚­ãƒ£ãƒ³"
msgid "Toggle Split Mode"
msgstr "分割モード切り替ãˆ"
+msgid "Filter Files"
+msgstr "ファイルをフィルタ"
+
msgid ""
"Scanning Files,\n"
"Please Wait..."
@@ -3196,9 +4738,21 @@ msgstr "ç½®æ›..."
msgid "Replace in Files"
msgstr "複数ファイル内ã§ç½®æ›"
+msgid "Replace all (no undo)"
+msgstr "ã™ã¹ã¦ç½®æ›ï¼ˆã‚¢ãƒ³ãƒ‰ã‚¥ä¸å¯ï¼‰"
+
msgid "Searching..."
msgstr "検索中..."
+msgid "%d match in %d file"
+msgstr "%d 件ã®ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠(%d 個ã®ãƒ•ã‚¡ã‚¤ãƒ«å†…)"
+
+msgid "%d matches in %d file"
+msgstr "%d 件ã®ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠(%d 個ã®ãƒ•ã‚¡ã‚¤ãƒ«å†…)"
+
+msgid "%d matches in %d files"
+msgstr "%d 件ã®ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠(%d 個ã®ãƒ•ã‚¡ã‚¤ãƒ«å†…)"
+
msgid "Add to Group"
msgstr "グループã«è¿½åŠ "
@@ -3235,12 +4789,158 @@ msgstr "グループエディター"
msgid "Manage Groups"
msgstr "グループã®ç®¡ç†"
+msgid "The Beginning"
+msgstr "ã¯ã˜ã¾ã‚Š"
+
+msgid "Global"
+msgstr "グローãƒãƒ«"
+
+msgid "Audio Stream Importer: %s"
+msgstr "オーディオ ストリーム インãƒãƒ¼ã‚¿ãƒ¼: %s"
+
msgid "Reimport"
msgstr "å†ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
+msgid "Enable looping."
+msgstr "ループを有効化"
+
msgid "Offset:"
msgstr "オフセット:"
+msgid ""
+"Loop offset (from beginning). Note that if BPM is set, this setting will be "
+"ignored."
+msgstr ""
+"ループã®ã‚ªãƒ•ã‚»ãƒƒãƒˆï¼ˆå…ˆé ­ã‹ã‚‰ï¼‰ã€‚BPMãŒè¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã€ã“ã®è¨­å®šã¯ç„¡è¦–ã•ã‚Œã¾"
+"ã™ã®ã§ã”注æ„ãã ã•ã„。"
+
+msgid "Loop:"
+msgstr "ループ:"
+
+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 ""
+"インタラクティブストリームã«ä½¿ç”¨ã™ã‚‹Beats Per Measure(テンãƒï¼‰ã‚’設定ã—ã¾"
+"ã™ã€‚\n"
+"ã“ã‚Œã¯ã€ãƒ“ート情報を設定ã™ã‚‹ãŸã‚ã«å¿…è¦ã§ã™ã€‚"
+
+msgid "Beat Count:"
+msgstr "ビート数:"
+
+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 ""
+"音楽を考慮ã—ãŸãƒ«ãƒ¼ãƒ—å†ç”Ÿã«ä½¿ç”¨ã™ã‚‹Beatsã®é‡ã‚’設定ã—ã¾ã™ã€‚0ã®å ´åˆã€é•·ã•ã‹ã‚‰è‡ª"
+"動検出ã•ã‚Œã¾ã™ã€‚\n"
+"ループå†ç”ŸãŒæ­£ã—ã機能ã™ã‚‹ã‚ˆã†ã«ã€ã“ã®å€¤ã‚’設定ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ï¼ˆæ‰‹å‹•ã¾"
+"ãŸã¯ãƒ—レビューã§ãƒ“ート番å·ã‚’クリック)"
+
+msgid "Bar Beats:"
+msgstr "å°ç¯€ã‚ãŸã‚Šã®æ‹æ•°:"
+
+msgid ""
+"Configure the Beats Per Bar. This used for music-aware transitions between "
+"AudioStreams."
+msgstr ""
+"Beats Per Bar を設定ã—ã¾ã™ã€‚AudioStreamé–“ã®éŸ³æ¥½ã‚’考慮ã—ãŸãƒˆãƒ©ãƒ³ã‚¸ã‚·ãƒ§ãƒ³ã«ä½¿ç”¨"
+"ã•ã‚Œã¾ã™ã€‚"
+
+msgid "Music Playback:"
+msgstr "音楽ã®å†ç”Ÿè¨­å®š:"
+
+msgid "New Configuration"
+msgstr "æ–°ã—ã„構æˆ"
+
+msgid "Remove Variation"
+msgstr "ãƒãƒªã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã‚’削除"
+
+msgid ""
+"Warning: There are no configurations specified, no glyphs will be pre-"
+"rendered."
+msgstr "警告: 構æˆãŒæŒ‡å®šã•ã‚Œã¦ãŠã‚‰ãšã€ã‚°ãƒªãƒ•ã¯äº‹å‰ã«ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã•ã‚Œã¾ã›ã‚“。"
+
+msgid ""
+"Warning: Multiple configurations have identical settings. Duplicates will be "
+"ignored."
+msgstr "警告: 複数ã®æ§‹æˆã®è¨­å®šã¯åŒã˜ã§ã™ã€‚é‡è¤‡ã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"Note: LCD Subpixel antialiasing is selected, each of the glyphs will be pre-"
+"rendered for all supported subpixel layouts (5x)."
+msgstr ""
+"注: LCD サブピクセル アンãƒã‚¨ã‚¤ãƒªã‚¢ã‚·ãƒ³ã‚°ãŒé¸æŠžã•ã‚Œã¦ã„ã‚‹å ´åˆã€å„グリフã¯ã‚µ"
+"ãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã‚‹ã™ã¹ã¦ã®ã‚µãƒ–ピクセル レイアウト(5x)ã«å¯¾ã—ã¦äº‹å‰ã«ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°"
+"ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"Note: Subpixel positioning is selected, each of the glyphs might be pre-"
+"rendered for multiple subpixel offsets (up to 4x)."
+msgstr ""
+"注: サブピクセルã®é…ç½®ãŒé¸æŠžã•ã‚Œã¦ã„ã‚‹å ´åˆã€å„グリフã¯è¤‡æ•°ã®ã‚µãƒ–ピクセル オフ"
+"セット(最大 4 å€)ã«å¯¾ã—ã¦äº‹å‰ã«ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã•ã‚Œã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚"
+
+msgid "Advanced Import Settings for '%s'"
+msgstr "'%s' ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã®è©³ç´°è¨­å®š"
+
+msgid "Rendering Options"
+msgstr "レンダリング オプション"
+
+msgid "Select font rendering options, fallback font, and metadata override:"
+msgstr ""
+"フォントレンダリングオプションã€ãƒ•ã‚©ãƒ¼ãƒ«ãƒãƒƒã‚¯ãƒ•ã‚©ãƒ³ãƒˆã€ãŠã‚ˆã³ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã‚ªãƒ¼"
+"ãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã‚’é¸æŠžã—ã¾ã™ã€‚"
+
+msgid "Pre-render Configurations"
+msgstr "プリレンダーã®æ§‹æˆ"
+
+msgid ""
+"Add font size, and variation coordinates, and select glyphs to pre-render:"
+msgstr ""
+"フォントサイズã€ãƒãƒªã‚¨ãƒ¼ã‚·ãƒ§ãƒ³åº§æ¨™ã‚’追加ã—ã€ãƒ—リレンダリングã™ã‚‹ã‚°ãƒªãƒ•ã‚’é¸æŠž"
+"ã—ã¾ã™ã€‚"
+
+msgid "Configuration:"
+msgstr "構æˆ:"
+
+msgid "Add configuration"
+msgstr "構æˆã‚’追加"
+
+msgid "Clear Glyph List"
+msgstr "グリフ リストをクリア"
+
+msgid "Glyphs from the Translations"
+msgstr "翻訳ã‹ã‚‰ã®ã‚°ãƒªãƒ•"
+
+msgid "Select translations to add all required glyphs to pre-render list:"
+msgstr ""
+"翻訳をé¸æŠžã™ã‚‹ã¨ã€å¿…è¦ãªã‚°ãƒªãƒ•ãŒã™ã¹ã¦ãƒ—リレンダーリストã«è¿½åŠ ã•ã‚Œã¾ã™ã€‚"
+
+msgid "Shape all Strings in the Translations and Add Glyphs"
+msgstr "翻訳文ã®æ–‡å­—列をã™ã¹ã¦ã‚·ã‚§ã‚¤ãƒ—ã—ã€ã‚°ãƒªãƒ•ã‚’追加ã™ã‚‹"
+
+msgid "Glyphs from the Text"
+msgstr "テキストã‹ã‚‰ã‚°ãƒªãƒ•"
+
+msgid ""
+"Enter a text and select OpenType features to shape and add all required "
+"glyphs to pre-render list:"
+msgstr ""
+"テキストを入力ã—ã€OpenType フィーãƒãƒ£ã‚’é¸æŠžã—ã¦ã‚·ã‚§ã‚¤ãƒ—ã—ã€å¿…è¦ãªã™ã¹ã¦ã®ã‚°ãƒª"
+"フをプリレンダリング リストã«è¿½åŠ ã—ã¾ã™ã€‚"
+
+msgid "Shape Text and Add Glyphs"
+msgstr "テキストã®ã‚·ã‚§ã‚¤ãƒ—ã¨ã‚°ãƒªãƒ•ã‚’追加"
+
+msgid "Glyphs from the Character Map"
+msgstr "文字コード表ã®ã‚°ãƒªãƒ•"
+
msgid "Importing Scene..."
msgstr "シーンをインãƒãƒ¼ãƒˆä¸­..."
@@ -3276,12 +4976,25 @@ msgstr "2D"
msgid "3D"
msgstr "3D"
+msgid "Error opening scene"
+msgstr "シーンを開ãéš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+
+msgid "Set paths to save animations as resource files on Reimport"
+msgstr ""
+"å†ã‚¤ãƒ³ãƒãƒ¼ãƒˆæ™‚ã«ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’リソース ファイルã¨ã—ã¦ä¿å­˜ã™ã‚‹ãƒ‘スを設定"
+
+msgid "Actions..."
+msgstr "æ“作..."
+
msgid "Meshes"
msgstr "メッシュ"
msgid "Materials"
msgstr "マテリアル"
+msgid "Save Extension:"
+msgstr "æ‹¡å¼µå­ã‚’ä¿å­˜:"
+
msgid "Select Importer"
msgstr "インãƒãƒ¼ã‚¿ãƒ¼ã‚’é¸æŠž"
@@ -3317,6 +5030,9 @@ msgstr "åå‰ã‚’付ã‘ã¦ã‚¤ãƒ³ãƒãƒ¼ãƒˆ:"
msgid "Preset"
msgstr "プリセット"
+msgid "Advanced..."
+msgstr "高度ãªè¨­å®š..."
+
msgid "Save Scenes, Re-Import, and Restart"
msgstr "シーンをä¿å­˜ã—ã€å†ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¦ã‹ã‚‰ã€å†èµ·å‹•ã—ã¾ã™"
@@ -3435,9 +5151,15 @@ msgstr "ロケールã«å¾“ã„å†ãƒžãƒƒãƒ—:"
msgid "Locale"
msgstr "ロケール"
+msgid "Set %s on %d nodes"
+msgstr "%d ノード㫠%s を設定"
+
msgid "Select a single node to edit its signals and groups."
msgstr "ノードを1ã¤é¸æŠžã—ã¦ã‚·ã‚°ãƒŠãƒ«ã¨ã‚°ãƒ«ãƒ¼ãƒ—を編集ã—ã¾ã™ã€‚"
+msgid "Subfolder name is not a valid folder name."
+msgstr "サブフォルダåã¯æœ‰åŠ¹ãªãƒ•ã‚©ãƒ«ãƒ€åã§ã¯ã‚ã‚Šã¾ã›ã‚“。"
+
msgid "Edit a Plugin"
msgstr "プラグインã®ç·¨é›†"
@@ -3542,6 +5264,12 @@ msgstr "点をé¸æŠžã—ã¦ç§»å‹•ã—ã€å³ã‚¯ãƒªãƒƒã‚¯ã§ç‚¹ã‚’作æˆã—ã¾ã™ã€‚
msgid "Enable snap and show grid."
msgstr "スナップã¨ã‚°ãƒªãƒƒãƒ‰ã®è¡¨ç¤ºã‚’有効ã«ã™ã‚‹ã€‚"
+msgid "Sync:"
+msgstr "åŒæœŸ:"
+
+msgid "Blend:"
+msgstr "ブレンド:"
+
msgid "Point"
msgstr "点"
@@ -3584,15 +5312,9 @@ msgstr "点ã¨ä¸‰è§’形を消ã™ã€‚"
msgid "Generate blend triangles automatically (instead of manually)"
msgstr "自動的ã«ãƒ–レンド三角形を生æˆ"
-msgid "Blend:"
-msgstr "ブレンド:"
-
msgid "Parameter Changed:"
msgstr "パラメーターãŒå¤‰æ›´ã•ã‚Œã¾ã—ãŸ:"
-msgid "Edit Filters"
-msgstr "フィルターã®ç·¨é›†"
-
msgid "Output node can't be added to the blend tree."
msgstr "出力ノードをブレンドツリーã«è¿½åŠ ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。"
@@ -3660,9 +5382,21 @@ msgstr "ノードを追加..."
msgid "Enable Filtering"
msgstr "フィルタリングを有効化"
+msgid "Library Name:"
+msgstr "ライブラリå:"
+
+msgid "Animation name can't be empty."
+msgstr "アニメーションåを空ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。"
+
msgid "Load Animation"
msgstr "アニメーション読ã¿è¾¼ã¿"
+msgid "Invalid AnimationLibrary file."
+msgstr "無効㪠AnimationLibrary ファイルã§ã™ã€‚"
+
+msgid "Invalid Animation file."
+msgstr "無効ãªAnimationファイルã§ã™ã€‚"
+
msgid "Animation Name:"
msgstr "アニメーションå:"
@@ -3672,6 +5406,18 @@ msgstr "貼り付ã‘ãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³"
msgid "Open in Inspector"
msgstr "インスペクターã§é–‹ã"
+msgid "Paste Animation to Library from clipboard"
+msgstr "Animationをクリップボードã‹ã‚‰ãƒ©ã‚¤ãƒ–ラリã«è²¼ã‚Šä»˜ã‘"
+
+msgid "Save animation library to resource on disk"
+msgstr "アニメーション ライブラリをディスク上ã®ãƒªã‚½ãƒ¼ã‚¹ã«ä¿å­˜"
+
+msgid "Copy animation to clipboard"
+msgstr "クリップボードã«ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’コピー"
+
+msgid "Save animation to resource on disk"
+msgstr "アニメーションをディスク上ã®ãƒªã‚½ãƒ¼ã‚¹ã«ä¿å­˜"
+
msgid "Storage"
msgstr "ストレージ"
@@ -3705,15 +5451,15 @@ msgstr "次ã®å¤‰æ›´ã‚’ブレンド"
msgid "Change Blend Time"
msgstr "ブレンド時間ã®å¤‰æ›´"
+msgid "Duplicated Animation Name:"
+msgstr "複製ã•ã‚ŒãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³å:"
+
msgid "Play selected animation backwards from current pos. (A)"
msgstr "é¸æŠžã—ãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ç¾åœ¨ã®ä½ç½®ã‹ã‚‰é€†å†ç”Ÿã™ã‚‹ã€‚(A)"
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "é¸æŠžã—ãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’最後ã‹ã‚‰é€†å†ç”Ÿã™ã‚‹ã€‚(Shift+A)"
-msgid "Stop animation playback. (S)"
-msgstr "アニメーションã®å†ç”Ÿã‚’åœæ­¢ã™ã‚‹ã€‚(S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "é¸æŠžã—ãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’最åˆã‹ã‚‰å†ç”Ÿã™ã‚‹ã€‚(Shift+D)"
@@ -3732,6 +5478,9 @@ msgstr "アニメーションツール"
msgid "Animation"
msgstr "アニメーション"
+msgid "Manage Animations..."
+msgstr "アニメーションã®ç®¡ç†..."
+
msgid "Edit Transitions..."
msgstr "トランジションã®ç·¨é›†..."
@@ -4103,6 +5852,15 @@ msgstr "グループ化済ã¿"
msgid "Add Node Here"
msgstr "ã“ã“ã«ãƒŽãƒ¼ãƒ‰ã‚’追加"
+msgid "Moving:"
+msgstr "移動:"
+
+msgid "Rotating:"
+msgstr "回転:"
+
+msgid "Scaling:"
+msgstr "スケール:"
+
msgid ""
"Project Camera Override\n"
"Overrides the running project's camera with the editor viewport camera."
@@ -4595,6 +6353,9 @@ msgstr ""
"リモートã®ãƒ‡ãƒã‚¤ã‚¹ä¸Šã§ä½¿ç”¨ã™ã‚‹å ´åˆã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ ã®ã‚ªãƒ—ション"
"も有効ã§ã‚ã‚Œã°ã‚ˆã‚ŠåŠ¹çŽ‡çš„ã«ãªã‚Šã¾ã™ã€‚"
+msgid " - Variation"
+msgstr " - ãƒãƒªã‚¨ãƒ¼ã‚·ãƒ§ãƒ³"
+
msgid "Convert to CPUParticles2D"
msgstr "CPUParticles2D ã«å¤‰æ›"
@@ -4634,12 +6395,21 @@ msgstr "サーフェスãƒã‚¤ãƒ³ãƒˆï¼‹Normal(指å‘性)"
msgid "Volume"
msgstr "ボリューム"
+msgid "Emission Source:"
+msgstr "放出æº:"
+
msgid "Generate Visibility AABB"
msgstr "å¯è¦–性ã®AABBを生æˆ"
msgid "Gradient Edited"
msgstr "グラデーション編集"
+msgid "Swap GradientTexture2D Fill Points"
+msgstr "GradientTexture2D å¡—ã‚Šãƒã‚¤ãƒ³ãƒˆã‚’入れ替ãˆ"
+
+msgid "Swap Gradient Fill Points"
+msgstr "Gradient ã®å¡—ã‚Šã¤ã¶ã—ãƒã‚¤ãƒ³ãƒˆã‚’入れ替ãˆ"
+
msgid "Toggle Grid Snap"
msgstr "グリッドスナップã®åˆ‡ã‚Šæ›¿ãˆ"
@@ -4720,6 +6490,18 @@ msgstr "デãƒãƒƒã‚°ã™ã‚‹ãƒ¡ãƒƒã‚·ãƒ¥ãŒã‚ã‚Šã¾ã›ã‚“。"
msgid "Mesh has no UV in layer %d."
msgstr "メッシュã®ãƒ¬ã‚¤ãƒ¤ãƒ¼ %dã«UVãŒã‚ã‚Šã¾ã›ã‚“。"
+msgid "MeshInstance3D lacks a Mesh."
+msgstr "MeshInstanceã«ãƒ¡ãƒƒã‚·ãƒ¥ãŒã‚ã‚Šã¾ã›ã‚“。"
+
+msgid "Mesh has no surface to create outlines from."
+msgstr "メッシュã«ã‚¢ã‚¦ãƒˆãƒ©ã‚¤ãƒ³ã‚’作æˆã™ã‚‹ãŸã‚ã®ã‚µãƒ¼ãƒ•ã‚§ã‚¹ãŒã‚ã‚Šã¾ã›ã‚“。"
+
+msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES."
+msgstr "メッシュã®ãƒ—リミティブ型㌠PRIMITIVE_TRIANGLES ã§ã¯ã‚ã‚Šã¾ã›ã‚“。"
+
+msgid "Could not create outline."
+msgstr "アウトラインを生æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
+
msgid "Create Outline"
msgstr "アウトラインを生æˆ"
@@ -4927,12 +6709,6 @@ msgstr "Notifierã®AABBを変更"
msgid "Change Particles AABB"
msgstr "パーティクルã®AABBを変更"
-msgid "Change Box Shape Extents"
-msgstr "ボックスシェイプã®ç¯„囲を変更"
-
-msgid "Change Probe Extents"
-msgstr "プローブã®ç¯„囲を変更"
-
msgid "Change Capsule Shape Radius"
msgstr "カプセルシェイプã®åŠå¾„を変更"
@@ -5011,6 +6787,9 @@ msgstr "キーã¯ç„¡åŠ¹åŒ–ã•ã‚Œã¦ã„ã¾ã™(キーã¯æŒ¿å…¥ã•ã‚Œã¦ã„ã¾ã›ã‚
msgid "Animation Key Inserted."
msgstr "アニメーションキーãŒæŒ¿å…¥ã•ã‚Œã¾ã—ãŸã€‚"
+msgid "Objects: %d\n"
+msgstr "オブジェクトID\n"
+
msgid "Top View."
msgstr "上é¢å›³ã€‚"
@@ -5044,6 +6823,9 @@ msgstr "回転"
msgid "Translate"
msgstr "移動"
+msgid "Translating:"
+msgstr "ä½ç½®ã®å¤‰æ›´:"
+
msgid "Rotating %s degrees."
msgstr "%s 度回転。"
@@ -5068,6 +6850,9 @@ msgstr "シェーディングãªã—ã§è¡¨ç¤º"
msgid "Shadow Atlas"
msgstr "シャドウアトラス"
+msgid "Display Advanced..."
+msgstr "詳細ãªè¡¨ç¤ºè¨­å®š..."
+
msgid "View Environment"
msgstr "環境を表示"
@@ -5147,6 +6932,9 @@ msgstr "ノードをフロアã«ã‚¹ãƒŠãƒƒãƒ—"
msgid "Couldn't find a solid floor to snap the selection to."
msgstr "é¸æŠžå¯¾è±¡ã‚’スナップã•ã›ã‚‹å‰›ä½“ã®åºŠã‚’見ã¤ã‘られã¾ã›ã‚“ã§ã—ãŸã€‚"
+msgid "Preview disabled."
+msgstr "プレビューã¯ç„¡åŠ¹ã§ã™ã€‚"
+
msgid "Use Local Space"
msgstr "ローカル空間を使用"
@@ -5737,6 +7525,9 @@ msgstr "標準"
msgid "Connections to method:"
msgstr "メソッドã¸ã®æŽ¥ç¶š:"
+msgid "Source"
+msgstr "ソース"
+
msgid "Target"
msgstr "ターゲット"
@@ -5859,6 +7650,9 @@ msgstr "次ã®ãƒ–レークãƒã‚¤ãƒ³ãƒˆã«ç§»å‹•"
msgid "Go to Previous Breakpoint"
msgstr "å‰ã®ãƒ–レークãƒã‚¤ãƒ³ãƒˆã«ç§»å‹•"
+msgid "Save File As"
+msgstr "åå‰ã‚’付ã‘ã¦ä¿å­˜"
+
msgid "This skeleton has no bones, create some children Bone2D nodes."
msgstr "ã“ã®skeletonã«ã¯ãƒœãƒ¼ãƒ³ãŒã‚ã‚Šã¾ã›ã‚“。å­Bone2Dノードを追加ã—ã¦ãã ã•ã„。"
@@ -5880,6 +7674,9 @@ msgstr "レストãƒãƒ¼ã‚ºã‚’上書ã"
msgid "Create physical bones"
msgstr "物ç†ãƒœãƒ¼ãƒ³ã‚’作æˆã™ã‚‹"
+msgid "Export Skeleton Profile As..."
+msgstr "スケルトンプロファイルをエクスãƒãƒ¼ãƒˆ..."
+
msgid "Play IK"
msgstr "IKã‚’å†ç”Ÿ"
@@ -5901,6 +7698,9 @@ msgstr "LightOccluder2Dを作æˆ"
msgid "LightOccluder2D Preview"
msgstr "LightOccluder2D プレビュー"
+msgid "Can't convert a Sprite2D from a foreign scene."
+msgstr "外部シーンã‹ã‚‰ Sprite2D を変æ›ã§ãã¾ã›ã‚“。"
+
msgid "Can't convert a sprite using animation frames to mesh."
msgstr "アニメーションフレームを使用ã—ã¦ã‚¹ãƒ—ライトをメッシュã«å¤‰æ›ã§ãã¾ã›ã‚“。"
@@ -5928,6 +7728,9 @@ msgstr "ジオメトリãŒç„¡åŠ¹ã§ã™ã€‚ライトオクールダーを作æˆã§
msgid "Create LightOccluder2D Sibling"
msgstr "LightOccluder2Dã®å…„弟を作æˆ"
+msgid "Simplification:"
+msgstr "簡略化:"
+
msgid "Shrink (Pixels):"
msgstr "ç¸®å° (ピクセル):"
@@ -5979,15 +7782,15 @@ msgstr "(空)"
msgid "Animations:"
msgstr "アニメーション:"
-msgid "Speed:"
-msgstr "速度:"
-
-msgid "Loop"
-msgstr "ループ"
+msgid "Delete Animation"
+msgstr "アニメーションを削除ã—ã¾ã™ã‹ï¼Ÿ"
msgid "Animation Frames:"
msgstr "アニメーション フレーム:"
+msgid "Frame Duration:"
+msgstr "フレームæŒç¶šæ™‚é–“:"
+
msgid "Zoom Reset"
msgstr "ズームをリセット"
@@ -6036,21 +7839,41 @@ msgstr "ステップ:"
msgid "Styleboxes"
msgstr "StyleBox"
+msgid "1 color"
+msgid_plural "{num} colors"
+msgstr[0] "{num}色"
+
msgid "No colors found."
msgstr "カラーãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
+msgid "1 constant"
+msgid_plural "{num} constants"
+msgstr[0] "[num] 定数"
+
msgid "No constants found."
msgstr "定数ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
msgid "No fonts found."
msgstr "フォントãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
+msgid "1 font size"
+msgid_plural "{num} font sizes"
+msgstr[0] "[num] フォントサイズ"
+
msgid "No icons found."
msgstr "アイコンãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
+msgid "1 stylebox"
+msgid_plural "{num} styleboxes"
+msgstr[0] "[num] StyleBox"
+
msgid "No styleboxes found."
msgstr "StyleBoxãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
+msgid "{num} currently selected"
+msgid_plural "{num} currently selected"
+msgstr[0] "{num} 個 é¸æŠžä¸­"
+
msgid "Nothing was selected for the import."
msgstr "インãƒãƒ¼ãƒˆã™ã‚‹ã‚‚ã®ãŒé¸æŠžã•ã‚Œã¦ã„ã¾ã›ã‚“。"
@@ -6190,6 +8013,9 @@ msgstr ""
"ã“ã®ãƒ†ãƒ¼ãƒžã‚¿ã‚¤ãƒ—ã¯ç©ºã§ã™ã€‚\n"
"手動もã—ãã¯ä»–ã®ãƒ†ãƒ¼ãƒžã‹ã‚‰ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¦ã€ã‚¢ã‚¤ãƒ†ãƒ ã‚’追加ã—ã¦ãã ã•ã„。"
+msgid "Remove Data Type Items From Theme"
+msgstr "テーマã‹ã‚‰ãƒ‡ãƒ¼ã‚¿åž‹ã‚¢ã‚¤ãƒ†ãƒ ã‚’除去"
+
msgid "Add Color Item"
msgstr "カラーアイテムã®è¿½åŠ "
@@ -6317,9 +8143,15 @@ msgstr "アイテムã®ã‚¿ã‚¤ãƒ—を追加"
msgid "Add Type"
msgstr "タイプを追加"
+msgid "Override All Default Theme Items"
+msgstr "ã™ã¹ã¦ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®ãƒ†ãƒ¼ãƒžã‚¢ã‚¤ãƒ†ãƒ ã‚’上書ã"
+
msgid "Set Base Type"
msgstr "基底型を設定"
+msgid "Add a type from a list of available types or create a new one."
+msgstr "利用å¯èƒ½ãªã‚¿ã‚¤ãƒ—ã®ãƒªã‚¹ãƒˆã‹ã‚‰ã‚¿ã‚¤ãƒ—を追加ã™ã‚‹ã‹ã€æ–°è¦ã«ä½œæˆã—ã¾ã™ã€‚"
+
msgid "Show Default"
msgstr "デフォルトを表示"
@@ -6336,6 +8168,9 @@ msgstr "ã™ã¹ã¦ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã‚¿ã‚¤ãƒ—ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’オーãƒãƒ¼ãƒ©ã‚¤
msgid "Base Type"
msgstr "基底型"
+msgid "Select the variation base type from a list of available types."
+msgstr "使用å¯èƒ½ãªã‚¿ã‚¤ãƒ—ã®ãƒªã‚¹ãƒˆã‹ã‚‰ãƒãƒªã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã®ãƒ™ãƒ¼ã‚¹ã‚¿ã‚¤ãƒ—ã‚’é¸æŠžã€‚"
+
msgid "Theme:"
msgstr "テーマ:"
@@ -6449,12 +8284,48 @@ msgstr "å·¦å³å転"
msgid "Flip Vertically"
msgstr "上下å転"
+msgid "Painting:"
+msgstr "ペイント設定:"
+
+msgid "Shift+Ctrl: Draw rectangle."
+msgstr "Shift+Ctrl: 四角形をæç”»"
+
+msgid "Scattering:"
+msgstr "æ‹¡æ•£:"
+
msgid "Tiles"
msgstr "タイル"
+msgid "Toggle grid visibility."
+msgstr "グリッドã®è¡¨ç¤ºã‚’切り替ãˆ"
+
+msgid "Delete All Tile Proxies"
+msgstr "ã™ã¹ã¦ã®ã‚¿ã‚¤ãƒ«ãƒ—ロキシを削除"
+
+msgid "Global actions:"
+msgstr "グローãƒãƒ«ã‚¢ã‚¯ã‚·ãƒ§ãƒ³:"
+
+msgid "Select tiles."
+msgstr "タイルをé¸æŠžã—ã¾ã™ã€‚"
+
+msgid "No tiles selected."
+msgstr "タイルãŒé¸æŠžã•ã‚Œã¦ã„ã¾ã›ã‚“。"
+
+msgid "Paint Properties:"
+msgstr "ペイント設定:"
+
msgid "Yes"
msgstr "ã¯ã„"
+msgid "Add a new atlas source"
+msgstr "æ–°ã—ã„アトラスソースを追加"
+
+msgid "Add a Scene Tile"
+msgstr "シーンタイルã®è¿½åŠ "
+
+msgid "Tile properties:"
+msgstr "タイル設定:"
+
msgid "TileSet"
msgstr "タイルセット"
@@ -6491,6 +8362,9 @@ msgstr "%s ブランãƒã‚’削除ã—ã¾ã™ã‹?"
msgid "Do you want to remove the %s remote?"
msgstr "リモート %s を削除ã—ã¾ã™ã‹ï¼Ÿ"
+msgid "Create VCS metadata files for:"
+msgstr "VCSメタデータ ファイルを作æˆ:"
+
msgid "Apply"
msgstr "é©ç”¨"
@@ -6965,6 +8839,9 @@ msgstr "パラメーターã®åŒæ›²ã‚¿ãƒ³ã‚¸ã‚§ãƒ³ãƒˆã‚’è¿”ã—ã¾ã™ã€‚"
msgid "Finds the truncated value of the parameter."
msgstr "パラメーターを切りæ¨ã¦ãŸå€¤ã‚’求ã‚ã¾ã™ã€‚"
+msgid "Converts screen UV to a SDF."
+msgstr "スクリーンUVã‚’SDFã«å¤‰æ›ã—ã¾ã™ã€‚"
+
msgid "Perform the cubic texture lookup."
msgstr "立体テクスãƒãƒ£ãƒ»ãƒ«ãƒƒã‚¯ã‚¢ãƒƒãƒ—を実行ã—ã¾ã™ã€‚"
@@ -7002,6 +8879,12 @@ msgstr "トランスフォームã®é€†è¡Œåˆ—を計算ã—ã¾ã™ã€‚"
msgid "Calculates the transpose of a transform."
msgstr "トランスフォームã®è»¢ç½®ã‚’計算ã—ã¾ã™ã€‚"
+msgid "Sums two transforms."
+msgstr "2 ã¤ã®Transformã‚’åˆè¨ˆã—ã¾ã™ã€‚"
+
+msgid "Subtracts two transforms."
+msgstr "2 ã¤ã®Transformを減算ã—ã¾ã™ã€‚"
+
msgid "Multiplies vector by transform."
msgstr "トランスフォームã§ãƒ™ã‚¯ãƒˆãƒ«ã‚’ä¹—ç®—ã—ã¾ã™ã€‚"
@@ -7244,6 +9127,9 @@ msgstr "プロジェクトã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãƒ‘ス:"
msgid "Renderer:"
msgstr "レンダラー:"
+msgid "Version Control Metadata:"
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç®¡ç†ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿:"
+
msgid "Missing Project"
msgstr "プロジェクトãŒã‚ã‚Šã¾ã›ã‚“"
@@ -7263,6 +9149,62 @@ msgid "Can't open project at '%s'."
msgstr "次ã®å ´æ‰€ã®ãƒ—ロジェクトを開ã‘ã¾ã›ã‚“ '%s'。"
msgid ""
+"The selected project \"%s\" does not specify its supported Godot version in "
+"its configuration file (\"project.godot\").\n"
+"\n"
+"Project path: %s\n"
+"\n"
+"If you proceed with opening it, it will be converted to Godot's current "
+"configuration file format.\n"
+"\n"
+"Warning: You won't be able to open the project with previous versions of the "
+"engine anymore."
+msgstr ""
+"次ã®ãƒ—ロジェクト設定ファイルã«ã¯ã€ä½œæˆã«ä½¿ç”¨ã•ã‚ŒãŸGodotã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒæŒ‡å®šã•ã‚Œ"
+"ã¦ã„ã¾ã›ã‚“。\n"
+"\n"
+"%s\n"
+"\n"
+"ファイルを開ãã¨ã€Godotã®ç¾åœ¨ã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«å½¢å¼ã«å¤‰æ›ã•ã‚Œã¾ã™ã€‚\n"
+"\n"
+"警告: 以å‰ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚¨ãƒ³ã‚¸ãƒ³ã§ã¯ãƒ—ロジェクトを開ã‘ãªããªã‚Šã¾ã™ã€‚"
+
+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 ""
+"以下ã®ãƒ—ロジェクト設定ファイルã¯ã€å¤ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚¨ãƒ³ã‚¸ãƒ³ã«ã‚ˆã‚Šç”Ÿæˆã•ã‚Œã¦ãŠ"
+"ã‚Šã€ç¾åœ¨ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç”¨ã«å¤‰æ›ãŒå¿…è¦ã§ã™:\n"
+"\n"
+"%s\n"
+"\n"
+"変æ›ã—ã¾ã™ã‹ï¼Ÿ\n"
+"\n"
+"警告: プロジェクトã¯æ—§ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚¨ãƒ³ã‚¸ãƒ³ã§é–‹ãã“ã¨ãŒã§ããªããªã‚Šã¾ã™ã€‚"
+
+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 ""
"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."
@@ -7381,9 +9323,6 @@ msgstr "入力アクションã®è¿½åŠ "
msgid "Change Action deadzone"
msgstr "アクション デッドゾーンを変更"
-msgid "Add Input Action Event"
-msgstr "入力アクション イベントを追加"
-
msgid "Erase Input Action"
msgstr "入力アクションを消去"
@@ -7393,6 +9332,9 @@ msgstr "入力アクションイベントã®åå‰ã‚’変更ã™ã‚‹"
msgid "Project Settings (project.godot)"
msgstr "プロジェクト設定 (project.godot)"
+msgid "Select a Setting or Type its Name"
+msgstr "設定をé¸æŠž ã¾ãŸã¯ 設定åを入力"
+
msgid "Input Map"
msgstr "インプットマップ"
@@ -7411,9 +9353,6 @@ msgstr "プロパティã®é¸æŠž"
msgid "Select Virtual Method"
msgstr "Virtualメソッドをé¸æŠž"
-msgid "Select Method"
-msgstr "メソッドã®é¸æŠž"
-
msgid "Batch Rename"
msgstr "åå‰ã®ä¸€æ‹¬å¤‰æ›´"
@@ -7432,6 +9371,21 @@ msgstr "高度ãªã‚ªãƒ—ション"
msgid "Substitute"
msgstr "代替"
+msgid "Node name."
+msgstr "ノードå"
+
+msgid "Node's parent name, if available."
+msgstr "ノードã®è¦ªã®åå‰ (使用å¯èƒ½ãªå ´åˆ)"
+
+msgid "Node type."
+msgstr "ノードタイプ"
+
+msgid "Current scene name."
+msgstr "ç¾åœ¨ã®ã‚·ãƒ¼ãƒ³å"
+
+msgid "Root node name."
+msgstr "ルートノードå"
+
msgid ""
"Sequential integer counter.\n"
"Compare counter options."
@@ -7445,9 +9399,15 @@ msgstr "レベルã”ã¨ã®ã‚«ã‚¦ãƒ³ã‚¿ãƒ¼"
msgid "If set, the counter restarts for each group of child nodes."
msgstr "設定ã™ã‚‹ã¨ã€å­ãƒŽãƒ¼ãƒ‰ã®ã‚°ãƒ«ãƒ¼ãƒ—ã”ã¨ã«ã‚«ã‚¦ãƒ³ã‚¿ãƒ¼ãŒå†èµ·å‹•ã—ã¾ã™ã€‚"
+msgid "Initial value for the counter."
+msgstr "カウンターã®åˆæœŸå€¤"
+
msgid "Step"
msgstr "ステップ"
+msgid "Amount by which counter is incremented for each node."
+msgstr "å„ノードã®ã‚«ã‚¦ãƒ³ã‚¿ãƒ¼ã®å¢—分é‡"
+
msgid "Padding"
msgstr "パディング"
@@ -7491,12 +9451,21 @@ msgstr "文字 %s"
msgid "Reparent Node"
msgstr "親ノードを変更"
+msgid "Select new parent:"
+msgstr "æ–°ã—ã„親をé¸æŠž:"
+
msgid "Keep Global Transform"
msgstr "グローãƒãƒ« トランスフォームをä¿æŒ"
msgid "Reparent"
msgstr "親を変更"
+msgid "File name invalid."
+msgstr "ファイルåãŒç„¡åŠ¹ã§ã™ã€‚"
+
+msgid "Root Type:"
+msgstr "ルートã®åž‹:"
+
msgid "2D Scene"
msgstr "2D シーン"
@@ -7506,6 +9475,9 @@ msgstr "3D シーン"
msgid "User Interface"
msgstr "ユーザーインターフェース"
+msgid "Root Name:"
+msgstr "ルートã®åå‰:"
+
msgid "Error loading scene from %s"
msgstr "シーンを%sã‹ã‚‰èª­ã¿è¾¼ã‚€éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç”Ÿã˜ã¾ã—ãŸ"
@@ -7755,6 +9727,17 @@ msgstr ""
"内ã®ã©ã“ã‹ã‚‰ã§ã‚‚アクセスã§ãã¾ã™ã€‚\n"
"クリックã™ã‚‹ã¨ç„¡åŠ¹ã«ãªã‚Šã¾ã™ã€‚"
+msgid "Node has one connection."
+msgid_plural "Node has {num} connections."
+msgstr[0] "ノードã«ã¯ {num} 個ã®æŽ¥ç¶šãŒã‚ã‚Šã¾ã™ã€‚"
+
+msgid "Node is in this group:"
+msgid_plural "Node is in the following groups:"
+msgstr[0] "ノードã¯æ¬¡ã®ã‚°ãƒ«ãƒ¼ãƒ—内ã«ã‚ã‚Šã¾ã™:"
+
+msgid "Click to show signals dock."
+msgstr "クリックã§ã‚·ã‚°ãƒŠãƒ«ã®ãƒ‰ãƒƒã‚¯ã‚’表示ã—ã¾ã™ã€‚"
+
msgid "Open Script:"
msgstr "スクリプトを開ã:"
@@ -7885,6 +9868,12 @@ msgstr "無効ãªãƒ™ãƒ¼ã‚¹ãƒ‘スã§ã™ã€‚"
msgid "Wrong extension chosen."
msgstr "é–“é•ã£ãŸæ‹¡å¼µå­ãŒé¸æŠžã•ã‚Œã¾ã—ãŸã€‚"
+msgid "Mode:"
+msgstr "モード:"
+
+msgid "Global shader parameter '%s' already exists'"
+msgstr "グローãƒãƒ«ã‚·ã‚§ãƒ¼ãƒ€ãƒ¼ãƒ‘ラメーター '%s' ã¯å­˜åœ¨ã—ã¦ã„ã¾ã™"
+
msgid "Change Cylinder Radius"
msgstr "円柱ã®åŠå¾„を変更"
@@ -7924,6 +9913,9 @@ msgstr "無効ãªã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹è¾žæ›¸å½¢å¼ã§ã™(@path ã§ç„¡åŠ¹ãªã‚¹ã‚¯ãƒ
msgid "Invalid instance dictionary (invalid subclasses)"
msgstr "無効ãªã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹è¾žæ›¸ã§ã™(無効ãªã‚µãƒ–クラス)"
+msgid "Path to Blender installation is valid."
+msgstr "Blenderã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãƒ‘スã¯æœ‰åŠ¹ã§ã™ã€‚"
+
msgid "Next Plane"
msgstr "次ã®å¹³é¢"
@@ -8006,7 +9998,7 @@ msgid "GridMap Settings"
msgstr "グリッドマップã®è¨­å®š"
msgid "Pick Distance:"
-msgstr "è·é›¢ã‚’å–å¾—:"
+msgstr "é¸æŠžè·é›¢:"
msgid "Give a MeshLibrary resource to this GridMap to use its meshes."
msgstr ""
@@ -8043,6 +10035,12 @@ msgstr "サイズ"
msgid "Network Profiler"
msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ—ロファイラー"
+msgid "Not possible to add a new property to synchronize without a root."
+msgstr "ルートãªã—ã§åŒæœŸã™ã‚‹æ–°ã—ã„プロパティを追加ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。"
+
+msgid "Delete Property?"
+msgstr "プロパティを削除ã—ã¾ã™ã‹ï¼Ÿ"
+
msgid "A NavigationMesh resource must be set or created for this node to work."
msgstr ""
"ã“ã®ãƒŽãƒ¼ãƒ‰ã‚’å‹•ã‹ã™ãŸã‚ã« NavigationMesh リソースを設定ã¾ãŸã¯ä½œæˆã™ã‚‹å¿…è¦ãŒã‚"
@@ -8093,6 +10091,12 @@ msgstr "ジオメトリを解æžã—ã¦ã„ã¾ã™..."
msgid "Done!"
msgstr "完了ï¼"
+msgid "Error loading %s: %s."
+msgstr "%s ã®ãƒ­ãƒ¼ãƒ‰ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ: %s"
+
+msgid "Add an action set."
+msgstr "アクションセットを追加ã—ã¾ã™ã€‚"
+
msgid "Package name is missing."
msgstr "パッケージåãŒã‚ã‚Šã¾ã›ã‚“。"
@@ -8190,18 +10194,9 @@ msgstr "APK expansion ã®å…¬é–‹éµãŒç„¡åŠ¹ã§ã™ã€‚"
msgid "Invalid package name:"
msgstr "無効ãªãƒ‘ッケージå:"
-msgid "\"Use Custom Build\" must be enabled to use the plugins."
-msgstr ""
-"プラグインを利用ã™ã‚‹ã«ã¯ã€ŒUse Custom Build (カスタムビルドを使用ã™ã‚‹)ã€ãŒæœ‰åŠ¹"
-"ã«ãªã£ã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
-
msgid "\"Passthrough\" is only valid when \"XR Mode\" is \"OpenXR\"."
msgstr "\"パススルー\" 㯠\"XR Mode\" ㌠\"OpenXR\" ã®å ´åˆã«ã®ã¿æœ‰åŠ¹ã§ã™ã€‚"
-msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled."
-msgstr ""
-"\"Export AAB\" 㯠\"Use Custom Build\" ãŒæœ‰åŠ¹ã§ã‚ã‚‹å ´åˆã«ã®ã¿æœ‰åŠ¹ã«ãªã‚Šã¾ã™ã€‚"
-
msgid "Code Signing"
msgstr "コード署å"
@@ -8227,6 +10222,13 @@ msgstr "apksigner実行ファイルを開始ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
msgid "'apksigner' returned with error #%d"
msgstr "'apksigner' ãŒã‚¨ãƒ©ãƒ¼ #%d ã§çµ‚了ã—ã¾ã—ãŸ"
+msgid ""
+"output: \n"
+"%s"
+msgstr ""
+"出力:\n"
+"%s"
+
msgid "Verifying %s..."
msgstr "%s を検証中..."
@@ -8249,13 +10251,6 @@ msgid "Unsupported export format!"
msgstr "サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„エクスãƒãƒ¼ãƒˆå½¢å¼ã§ã™ï¼"
msgid ""
-"Trying to build from a custom built template, but no version info for it "
-"exists. Please reinstall from the 'Project' menu."
-msgstr ""
-"カスタムビルドã•ã‚ŒãŸãƒ†ãƒ³ãƒ—レートã‹ã‚‰ãƒ“ルドã—よã†ã¨ã—ã¾ã—ãŸãŒã€ãã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³"
-"情報ãŒå­˜åœ¨ã—ã¾ã›ã‚“。 「プロジェクトã€ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‹ã‚‰å†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¦ãã ã•ã„。"
-
-msgid ""
"Android build version mismatch: Template installed: %s, Godot version: %s. "
"Please reinstall Android build template from 'Project' menu."
msgstr ""
@@ -8265,12 +10260,29 @@ msgstr ""
"「プロジェクト ã€ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‹ã‚‰Androidビルドテンプレートをå†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¦ã"
"ã ã•ã„。"
+msgid ""
+"Unable to overwrite res://android/build/res/*.xml files with project name."
+msgstr ""
+"res://android/build/res/*.xml ファイルをプロジェクトåã§ä¸Šæ›¸ãã§ãã¾ã›ã‚“。"
+
+msgid "Could not export project files to gradle project."
+msgstr ""
+"プロジェクトファイルをgradleプロジェクトã«ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
+
msgid "Could not write expansion package file!"
msgstr "拡張パッケージファイルを書ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸï¼"
msgid "Building Android Project (gradle)"
msgstr "Androidプロジェクトã®æ§‹ç¯‰(gradle)"
+msgid ""
+"Building of Android project failed, check output for the error. "
+"Alternatively visit docs.godotengine.org for Android build documentation."
+msgstr ""
+"Androidプロジェクトã®ãƒ“ルドã«å¤±æ•—ã—ã¾ã—ãŸã€‚エラーã®å‡ºåŠ›ã‚’確èªã—ã¦ãã ã•ã„。\n"
+"ã¾ãŸã€Androidビルドã«ã¤ã„ã¦ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã¯ docs.godotengine.org ã‚’ã”覧ãã ã•"
+"ã„。"
+
msgid "Moving output"
msgstr "出力çµæžœã®ç§»å‹•ä¸­"
@@ -8287,6 +10299,19 @@ msgstr "パッケージãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: \"%s\"。"
msgid "Creating APK..."
msgstr "APK を作æˆã—ã¦ã„ã¾ã™..."
+msgid "Could not find template APK to export: \"%s\"."
+msgstr "エクスãƒãƒ¼ãƒˆã™ã‚‹ãƒ†ãƒ³ãƒ—レートAPKãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ: \"%s\""
+
+msgid ""
+"Missing libraries in the export template for the selected architectures: %s. "
+"Please build a template with all required libraries, or uncheck the missing "
+"architectures in the export preset."
+msgstr ""
+"é¸æŠžã•ã‚ŒãŸã‚¢ãƒ¼ã‚­ãƒ†ã‚¯ãƒãƒ£: %s ã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆãƒ†ãƒ³ãƒ—レートã®ãƒ©ã‚¤ãƒ–ラリãŒä¸è¶³ã—ã¦"
+"ã„ã¾ã™ã€‚\n"
+"å¿…è¦ãªãƒ©ã‚¤ãƒ–ラリをã™ã¹ã¦å«ã‚€ãƒ†ãƒ³ãƒ—レートを作æˆã™ã‚‹ã‹ã€ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã®ãƒ—リセッ"
+"トã§ã€ä¸è¶³ã—ã¦ã„るアーキテクãƒãƒ£ã®ãƒã‚§ãƒƒã‚¯ã‚’外ã—ã¦ãã ã•ã„。"
+
msgid "Adding files..."
msgstr "ファイルを追加中..."
@@ -8370,6 +10395,15 @@ msgstr ""
"公証ã®æ‰‹ç¶šãã¯é€šå¸¸1時間以内ã«çµ‚了ã—ã¾ã™ã€‚手続ããŒå®Œäº†ã™ã‚‹ã¨EメールãŒå±Šãã¾"
"ã™ã€‚"
+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 "無効ãªã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆå½¢å¼ã§ã™ã€‚"
@@ -8432,6 +10466,13 @@ msgstr ""
"ãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹ Mac ãŠã‚ˆã³ Apple Silicon æ­è¼‰ã® Mac ã§ã¯å‹•ä½œã—ã¾ã›ã‚“。"
msgid ""
+"Code signing: Using ad-hoc signature. The exported project will be blocked "
+"by Gatekeeper"
+msgstr ""
+"コード署å: アドホック署åを使用ã—ã¾ã™ã€‚エクスãƒãƒ¼ãƒˆã•ã‚ŒãŸãƒ—ロジェクト㯠"
+"Gatekeeper ã«ã‚ˆã£ã¦ãƒ–ロックã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
"Privacy: Microphone access is enabled, but usage description is not "
"specified."
msgstr ""
@@ -8517,6 +10558,9 @@ msgstr ""
"スプラッシュスクリーンã®ç”»åƒã‚µã‚¤ã‚ºãŒç„¡åŠ¹ã§ã™(縦横620x300ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›"
"ん)。"
+msgid "Could not open template for export: \"%s\"."
+msgstr "エクスãƒãƒ¼ãƒˆç”¨ã®ãƒ†ãƒ³ãƒ—レートを開ã‘ã¾ã›ã‚“ã§ã—ãŸ: \"%s\""
+
msgid "Invalid export template: \"%s\"."
msgstr "無効ãªã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆãƒ†ãƒ³ãƒ—レート: \"%s\"。"
@@ -8698,6 +10742,13 @@ msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
"PathFollow2D ã¯ã€Path2D ノードã®å­ã¨ã—ã¦è¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã®ã¿å‹•ä½œã—ã¾ã™ã€‚"
+msgid ""
+"A PhysicalBone2D only works with a Skeleton2D or another PhysicalBone2D as a "
+"parent node!"
+msgstr ""
+"PhysicalBone2D ã¯ã€è¦ªãƒŽãƒ¼ãƒ‰ã¨ã—㦠Skeleton2D ã¾ãŸã¯åˆ¥ã® PhysicalBone2D ã§ã®ã¿"
+"機能ã—ã¾ã™ã€‚"
+
msgid "Path property must point to a valid Node2D node to work."
msgstr ""
"Path プロパティã¯ã€å‹•ä½œã™ã‚‹ã‚ˆã†ã«æœ‰åŠ¹ãª Node2D ノードを示ã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
@@ -8716,6 +10767,16 @@ msgstr ""
"ã“ã®ãƒœãƒ¼ãƒ³ã«ã¯é©åˆ‡ãªRESTãƒãƒ¼ã‚ºãŒã‚ã‚Šã¾ã›ã‚“。 Skeleton2Dノードã«ç§»å‹•ã—ã¦è¨­å®šã—"
"ã¾ã™ã€‚"
+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, "
+"CharacterBody3D, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon2Dã¯ã€CollisionObject2D派生ノードã«ã‚³ãƒªã‚¸ãƒ§ãƒ³ã‚·ã‚§ã‚¤ãƒ—ã‚’æä¾›ã™"
+"ã‚‹ãŸã‚ã«ã®ã¿æ©Ÿèƒ½ã—ã¾ã™ã€‚シェイプを追加ã™ã‚‹å ´åˆã¯ã€Area2Dã€StaticBody2Dã€"
+"RigidBody2Dã€KinematicBody2Dãªã©ã®å­ã¨ã—ã¦ä½¿ç”¨ã—ã¦ãã ã•ã„。"
+
msgid "Nothing is visible because no mesh has been assigned."
msgstr "メッシュãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ãªã„ãŸã‚ã€ä½•ã‚‚表示ã•ã‚Œã¾ã›ã‚“。"
@@ -8723,6 +10784,9 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr "æ画パスã«ãƒ¡ãƒƒã‚·ãƒ¥ãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ãªã„ãŸã‚ã€ä½•ã‚‚表示ã•ã‚Œã¾ã›ã‚“。"
+msgid "Creating probes"
+msgstr "プローブã®ä½œæˆ"
+
msgid "This body will be ignored until you set a mesh."
msgstr "ã“ã®ãƒœãƒ‡ã‚£ã¯ã€ãƒ¡ãƒƒã‚·ãƒ¥ã‚’設定ã™ã‚‹ã¾ã§ç„¡è¦–ã•ã‚Œã¾ã™ã€‚"
@@ -8767,9 +10831,22 @@ msgstr "AnimationPlayerã«è¨­å®šã•ã‚ŒãŸãƒ‘スã‹ã‚‰AnimationPlayerノードãŒ
msgid "The AnimationPlayer root node is not a valid node."
msgstr "AnimationPlayerルートノードãŒæœ‰åŠ¹ãªãƒŽãƒ¼ãƒ‰ã§ã¯ã‚ã‚Šã¾ã›ã‚“。"
+msgid ""
+"Color: #%s\n"
+"LMB: Apply color"
+msgstr ""
+"色: #%s\n"
+"左クリック: 色をセット"
+
msgid "Pick a color from the editor window."
msgstr "エディターウィンドウã‹ã‚‰è‰²ã‚’é¸æŠžã€‚"
+msgid "Select a picker shape."
+msgstr "ピッカーシェイプをé¸æŠž"
+
+msgid "Select a picker mode."
+msgstr "ピッカー・モードをé¸æŠž"
+
msgid "Switch between hexadecimal and code values."
msgstr "16進数ã¨ã‚³ãƒ¼ãƒ‰å€¤ã‚’切り替ãˆã¾ã™ã€‚"
@@ -8845,6 +10922,16 @@ msgid ""
msgstr ""
"レンダーã™ã‚‹ã«ã¯Viewportã®ç¸¦æ¨ªãã‚Œãžã‚ŒãŒ2ピクセル以上ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+msgid "Unsupported BMFont texture format."
+msgstr "サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„ BMFont テクスãƒãƒ£å½¢å¼ã§ã™ã€‚"
+
+msgid ""
+"Shader keywords cannot be used as parameter names.\n"
+"Choose another name."
+msgstr ""
+"シェーダーã®ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã¯ãƒ‘ラメーターã®åå‰ã¨ã—ã¦ä½¿ç”¨ã§ãã¾ã›ã‚“。\n"
+"別ã®åå‰ã‚’é¸ã‚“ã§ãã ã•ã„。"
+
msgid ""
"The sampler port is connected but not used. Consider changing the source to "
"'SamplerPort'."
@@ -8870,6 +10957,15 @@ msgstr "ç¹°ã‚Šè¿”ã—"
msgid "Invalid comparison function for that type."
msgstr "ãã®ã‚¿ã‚¤ãƒ—ã®æ¯”較関数ã¯ç„¡åŠ¹ã§ã™ã€‚"
+msgid "Invalid arguments for the built-in function: \"%s(%s)\"."
+msgstr "組ã¿è¾¼ã¿é–¢æ•° \"%s(%s)\" ã®å¼•æ•°ãŒç„¡åŠ¹ã§ã™ã€‚"
+
+msgid "Invalid assignment of '%s' to '%s'."
+msgstr "'%s' ã‹ã‚‰ '%s' ã¸ã®å‰²ã‚Šå½“ã¦ãŒç„¡åŠ¹ã§ã™ã€‚"
+
+msgid "Expected constant expression."
+msgstr "定数å¼ãŒå¿…è¦ã§ã™ã€‚"
+
msgid "Varying may not be assigned in the '%s' function."
msgstr "Varying 㯠'%s' 関数ã§å‰²ã‚Šå½“ã¦ã‚‰ã‚Œãªã„å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚"
@@ -8881,3 +10977,81 @@ msgstr "uniform ã¸ã®å‰²ã‚Šå½“ã¦ã€‚"
msgid "Constants cannot be modified."
msgstr "定数ã¯å¤‰æ›´ã§ãã¾ã›ã‚“。"
+
+msgid "Cannot convert from '%s' to '%s'."
+msgstr "'%s' ã‹ã‚‰ '%s' ã«å¤‰æ›ã§ãã¾ã›ã‚“。"
+
+msgid "Expected ')' in expression."
+msgstr "å¼ã« ')' ãŒå¿…è¦ã§ã™ã€‚"
+
+msgid "Void value not allowed in expression."
+msgstr "void 値ã¯å¼ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。"
+
+msgid "No matching constructor found for: '%s'."
+msgstr "'%s' ã«ä¸€è‡´ã™ã‚‹ã‚³ãƒ³ã‚¹ãƒˆãƒ©ã‚¯ã‚¿ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。"
+
+msgid "No matching function found for: '%s'."
+msgstr "'%s' ã«ä¸€è‡´ã™ã‚‹é–¢æ•°ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。"
+
+msgid "Invalid arguments to unary operator '%s': %s."
+msgstr "å˜é …æ¼”ç®—å­ '%s' ã®å¼•æ•°ãŒç„¡åŠ¹ã§ã™: %s"
+
+msgid "Invalid argument to ternary operator: '%s'."
+msgstr "ä¸‰é …æ¼”ç®—å­ '%s' ã®å¼•æ•°ãŒç„¡åŠ¹ã§ã™ã€‚"
+
+msgid "Invalid arguments to operator '%s': '%s'."
+msgstr "æ¼”ç®—å­ '%s' ã®å¼•æ•°ãŒç„¡åŠ¹ã§ã™: '%s'"
+
+msgid "Invalid variable type (samplers are not allowed)."
+msgstr "変数ã®åž‹ãŒç„¡åŠ¹ã§ã™ (サンプラーã¯ä½¿ç”¨ã§ãã¾ã›ã‚“)"
+
+msgid "Duplicated case label: %d."
+msgstr "case ラベルãŒé‡è¤‡ã—ã¦ã„ã¾ã™: %d"
+
+msgid "Duplicated render mode: '%s'."
+msgstr "rebder mode ãŒé‡è¤‡ã—ã¦ã„ã¾ã™: '%s'"
+
+msgid "Duplicated hint: '%s'."
+msgstr "ヒントãŒé‡è¤‡ã—ã¦ã„ã¾ã™: '%s'"
+
+msgid "Duplicated filter mode: '%s'."
+msgstr "filter mode ãŒé‡è¤‡ã—ã¦ã„ã¾ã™: '%s'"
+
+msgid "Duplicated repeat mode: '%s'."
+msgstr "repeat mode ãŒé‡è¤‡ã—ã¦ã„ã¾ã™: '%s'"
+
+msgid "Invalid constant type (samplers are not allowed)."
+msgstr "定数ã®åž‹ãŒç„¡åŠ¹ã§ã™ (サンプラーã¯ä½¿ç”¨ã§ãã¾ã›ã‚“)"
+
+msgid "Invalid function type (samplers are not allowed)."
+msgstr "関数ã®åž‹ãŒç„¡åŠ¹ã§ã™ (サンプラーã¯ä½¿ç”¨ã§ãã¾ã›ã‚“)"
+
+msgid "Expected a '%s'."
+msgstr "'%s' ãŒå¿…è¦ã§ã™ã€‚"
+
+msgid "Expected a '%s' or '%s'."
+msgstr "'%s' ã¾ãŸã¯ '%s' ãŒå¿…è¦ã§ã™ã€‚"
+
+msgid "Redefinition of '%s'."
+msgstr "'%s' ã®å†å®šç¾©ã€‚"
+
+msgid "Invalid argument name."
+msgstr "引数åãŒç„¡åŠ¹ã§ã™ã€‚"
+
+msgid "Condition evaluation error."
+msgstr "æ¡ä»¶è©•ä¾¡ã‚¨ãƒ©ãƒ¼"
+
+msgid "Invalid macro argument count."
+msgstr "マクロ引数ã®æ•°ãŒç„¡åŠ¹ã§ã™ã€‚"
+
+msgid "The const '%s' is declared but never used."
+msgstr "const '%s' ã¯å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ãŒä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã›ã‚“。"
+
+msgid "The function '%s' is declared but never used."
+msgstr "関数 '%s' ã¯å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ãŒä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã›ã‚“。"
+
+msgid "The struct '%s' is declared but never used."
+msgstr "構造体 '%s' ã¯å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ãŒä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã›ã‚“。"
+
+msgid "The local variable '%s' is declared but never used."
+msgstr "ローカル変数 '%s' ã¯å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ãŒä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã›ã‚“。"
diff --git a/editor/translations/editor/ko.po b/editor/translations/editor/ko.po
index c157b684b5..3400b8d86e 100644
--- a/editor/translations/editor/ko.po
+++ b/editor/translations/editor/ko.po
@@ -42,13 +42,14 @@
# Godoto <aicompose@gmail.com>, 2022.
# gaenyang <gaenyang@outlook.com>, 2022.
# 오지훈 <jule1130@naver.com>, 2023.
+# ì´ì •í¬ <daemul72@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-01-20 10:19+0000\n"
-"Last-Translator: 오지훈 <jule1130@naver.com>\n"
+"PO-Revision-Date: 2023-02-09 15:26+0000\n"
+"Last-Translator: ì´ì •í¬ <daemul72@gmail.com>\n"
"Language-Team: Korean <https://hosted.weblate.org/projects/godot-engine/"
"godot/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.15.1\n"
+"X-Generator: Weblate 4.16-dev\n"
msgid "Physical"
msgstr "물리"
@@ -609,6 +610,9 @@ msgstr "ì´ ì‹œê·¸ë„ì—ì„œ:"
msgid "Scene does not contain any script."
msgstr "ì”¬ì— ìŠ¤í¬ë¦½íŠ¸ê°€ 없습니다."
+msgid "Select Method"
+msgstr "메서드 ì„ íƒ"
+
msgid "Remove"
msgstr "제거"
@@ -666,9 +670,6 @@ msgstr "ì—°ê²° ëŠê¸°"
msgid "Connect a Signal to a Method"
msgstr "시그ë„ì„ ë©”ì„œë“œì— ì—°ê²°"
-msgid "Edit Connection:"
-msgstr "연결 변경:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr "\"%s\" 시그ë„ì˜ ëª¨ë“  ì—°ê²°ì„ ì œê±°í•˜ì‹œê² ìŠµë‹ˆê¹Œ?"
@@ -813,23 +814,8 @@ msgstr "경고:"
msgid "Error:"
msgstr "오류:"
-msgid "C++ Error"
-msgstr "C++ 오류"
-
-msgid "C++ Error:"
-msgstr "C++ 오류:"
-
-msgid "Source"
-msgstr "소스"
-
-msgid "C++ Source"
-msgstr "C++ 소스"
-
-msgid "Source:"
-msgstr "소스:"
-
-msgid "C++ Source:"
-msgstr "C++ 소스:"
+msgid "%s Error"
+msgstr "%s 오류"
msgid "Stack Trace"
msgstr "ìŠ¤íƒ ì¶”ì "
@@ -840,6 +826,9 @@ msgstr "오류 복사"
msgid "Open C++ Source on GitHub"
msgstr "GitHubì—ì„œ C++ 소스 열기"
+msgid "C++ Source"
+msgstr "C++ 소스"
+
msgid "Video RAM"
msgstr "비디오 RAM"
@@ -1302,6 +1291,12 @@ msgstr "노드 ì´ë¦„:"
msgid "Global Variable"
msgstr "전역 변수"
+msgid "2D Physics"
+msgstr "2D 물리"
+
+msgid "3D Physics"
+msgstr "3D 물리"
+
msgid "Navigation"
msgstr "네비게ì´ì…˜"
@@ -1652,6 +1647,9 @@ msgstr "%s 오버ë¼ì´ë“œ:"
msgid "default:"
msgstr "ë””í´íŠ¸:"
+msgid "Operators"
+msgstr "ì—°ì‚°ìž"
+
msgid "Theme Properties"
msgstr "테마 ì†ì„±ë“¤"
@@ -1789,12 +1787,12 @@ msgstr "모든 ë¡œì¼€ì¼ ë³´ì´ê¸°"
msgid "Show Selected Locales Only"
msgstr "ì„ íƒí•œ 로케ì¼ë§Œ ë³´ì´ê¸°"
+msgid "Edit Filters"
+msgstr "필터 편집"
+
msgid "Language:"
msgstr "언어:"
-msgid "Script"
-msgstr "스í¬ë¦½íŠ¸"
-
msgid "Variant"
msgstr "변종"
@@ -2341,22 +2339,6 @@ msgid "Install from file"
msgstr "파ì¼ì—ì„œ 설치"
msgid ""
-"This will set up your project for custom Android builds by installing the "
-"source template to \"res://android/build\".\n"
-"You can then apply modifications and build your own custom APK on export "
-"(adding modules, changing the AndroidManifest.xml, etc.).\n"
-"Note that in order to make custom builds instead of using pre-built APKs, "
-"the \"Use Custom Build\" option should be enabled in the Android export "
-"preset."
-msgstr ""
-"\"res://android/build\"ì— ì†ŒìŠ¤ í…œí”Œë¦¿ì„ ì„¤ì¹˜í•´ì„œ 프로ì íŠ¸ë¥¼ 커스텀 Android 빌"
-"ë“œì— ë§žê²Œ 설정합니다.\n"
-"그런 ë‹¤ìŒ ìˆ˜ì • ì‚¬í•­ì„ ì ìš©í•˜ê³  커스텀 APK를 빌드해서 내보낼 수 있습니다(모듈 "
-"추가, AndroidManifest.xml 변경 등).\n"
-"미리 ë¹Œë“œëœ APK를 사용하는 대신 커스텀 빌드를 만들려면, Android 내보내기 프리"
-"ì…‹ì—ì„œ \"커스텀 빌드 사용(Use Custom Build)\" ì„¤ì •ì„ í™œì„±í™”í•´ì•¼ 합니다."
-
-msgid ""
"The Android build template is already installed in this project and it won't "
"be overwritten.\n"
"Remove the \"res://android/build\" directory manually before attempting this "
@@ -2579,9 +2561,6 @@ msgstr "단축키"
msgid "Binding"
msgstr "ë°”ì¸ë”©"
-msgid "%s Error"
-msgstr "%s 오류"
-
msgid "All Devices"
msgstr "모든 기기"
@@ -3498,6 +3477,9 @@ msgstr "ì ì„ ì„ íƒí•˜ê³  ì´ë™í•©ë‹ˆë‹¤. ìš°í´ë¦­ìœ¼ë¡œ ì ì„ 만드세요
msgid "Enable snap and show grid."
msgstr "ìŠ¤ëƒ…ì„ í™œì„±í™”í•˜ê³  격ìžë¥¼ ë³´ì´ê²Œ 합니다."
+msgid "Blend:"
+msgstr "혼합:"
+
msgid "Point"
msgstr "ì "
@@ -3540,15 +3522,9 @@ msgstr "ì ê³¼ 삼ê°í˜• 지우기."
msgid "Generate blend triangles automatically (instead of manually)"
msgstr "(ìˆ˜ë™ ëŒ€ì‹ ) ìžë™ìœ¼ë¡œ 혼합 삼ê°í˜• 만들기"
-msgid "Blend:"
-msgstr "혼합:"
-
msgid "Parameter Changed:"
msgstr "매개변수 변경ë¨:"
-msgid "Edit Filters"
-msgstr "필터 편집"
-
msgid "Output node can't be added to the blend tree."
msgstr "출력 노드를 혼합 íŠ¸ë¦¬ì— ì¶”ê°€í•  수 없습니다."
@@ -3670,9 +3646,6 @@ msgstr "ì„ íƒí•œ 애니메ì´ì…˜ì„ 현재 위치ì—ì„œ 거꾸로 재ìƒí•©ë‹ˆë
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "ì„ íƒí•œ 애니메ì´ì…˜ì„ ëì—ì„œ 거꾸로 재ìƒí•©ë‹ˆë‹¤. (Shift+A)"
-msgid "Stop animation playback. (S)"
-msgstr "애니메ì´ì…˜ 재ìƒì„ 중단합니다. (S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "ì„ íƒí•œ 애니메ì´ì…˜ì„ 처ìŒë¶€í„° 재ìƒí•©ë‹ˆë‹¤. (Shift+D)"
@@ -4888,12 +4861,6 @@ msgstr "알림 AABB 바꾸기"
msgid "Change Particles AABB"
msgstr "íŒŒí‹°í´ AABB 바꾸기"
-msgid "Change Box Shape Extents"
-msgstr "박스 모양 범위 바꾸기"
-
-msgid "Change Probe Extents"
-msgstr "프로브 범위 바꾸기"
-
msgid "Change Capsule Shape Radius"
msgstr "ìº¡ìŠ ëª¨ì–‘ 반경 바꾸기"
@@ -5003,7 +4970,7 @@ msgid "Rotate"
msgstr "회전"
msgid "Translate"
-msgstr "ì´ë™"
+msgstr "옮기기"
msgid "Translating:"
msgstr "번역 중:"
@@ -5695,6 +5662,9 @@ msgstr "표준"
msgid "Connections to method:"
msgstr "ë©”ì„œë“œì— ì—°ê²°:"
+msgid "Source"
+msgstr "소스"
+
msgid "Target"
msgstr "Target(대ìƒ)"
@@ -5939,12 +5909,6 @@ msgstr "(비었ìŒ)"
msgid "Animations:"
msgstr "애니메ì´ì…˜:"
-msgid "Speed:"
-msgstr "ì†ë„:"
-
-msgid "Loop"
-msgstr "루프"
-
msgid "Animation Frames:"
msgstr "애니메ì´ì…˜ 프레임:"
@@ -7329,9 +7293,6 @@ msgstr "입력 액션 추가"
msgid "Change Action deadzone"
msgstr "ì•¡ì…˜ ë°ë“œì¡´ 바꾸기"
-msgid "Add Input Action Event"
-msgstr "ìž…ë ¥ ì•¡ì…˜ ì´ë²¤íŠ¸ 추가"
-
msgid "Erase Input Action"
msgstr "입력 액션 지우기"
@@ -7359,9 +7320,6 @@ msgstr "ì†ì„± ì„ íƒ"
msgid "Select Virtual Method"
msgstr "ê°€ìƒ ë©”ì„œë“œ ì„ íƒ"
-msgid "Select Method"
-msgstr "메서드 ì„ íƒ"
-
msgid "Batch Rename"
msgstr "ì¼ê´„ ì´ë¦„ 바꾸기"
@@ -8133,12 +8091,6 @@ msgstr "APK í™•ìž¥ì— ìž˜ëª»ëœ ê³µê°œ 키입니다."
msgid "Invalid package name:"
msgstr "ìž˜ëª»ëœ íŒ¨í‚¤ì§€ ì´ë¦„:"
-msgid "\"Use Custom Build\" must be enabled to use the plugins."
-msgstr "플러그ì¸ì„ 사용하려면 \"Use Custom Build\"ê°€ 활성화ë˜ì–´ì•¼ 합니다."
-
-msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled."
-msgstr "\"Export AAB\"는 \"Use Custom Build\"ê°€ í™œì„±í™”ëœ ê²½ìš°ì—만 유효합니다."
-
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."
@@ -8183,13 +8135,6 @@ msgid "Unsupported export format!"
msgstr "지ì›ë˜ì§€ 않는 내보내기 형ì‹ìž…니다!"
msgid ""
-"Trying to build from a custom built template, but no version info for it "
-"exists. Please reinstall from the 'Project' menu."
-msgstr ""
-"커스텀 빌드 템플릿으로 빌드하려 했으나, 버전 ì •ë³´ê°€ 없습니다. '프로ì íŠ¸"
-"(Project)' 메뉴ì—ì„œ 다시 설치해주세요."
-
-msgid ""
"Android build version mismatch: Template installed: %s, Godot version: %s. "
"Please reinstall Android build template from 'Project' menu."
msgstr ""
diff --git a/editor/translations/editor/lv.po b/editor/translations/editor/lv.po
index b6f4152e33..79048ab1e7 100644
--- a/editor/translations/editor/lv.po
+++ b/editor/translations/editor/lv.po
@@ -553,9 +553,6 @@ msgstr "Atvienot"
msgid "Connect a Signal to a Method"
msgstr "Savienot SignÄlu ar Metodi"
-msgid "Edit Connection:"
-msgstr "Izmainīt Savienojumu:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
"Vai esat droÅ¡s(Å¡a), ka vÄ“laties noņemt visus savienojumus no \"%s\" signÄla?"
@@ -663,18 +660,12 @@ msgstr "Izsaukumi"
msgid "Error:"
msgstr "Kļūda:"
-msgid "Source"
-msgstr "Avots"
+msgid "%s Error"
+msgstr "%s Kļūda"
msgid "C++ Source"
msgstr "C++ avots"
-msgid "Source:"
-msgstr "Avots:"
-
-msgid "C++ Source:"
-msgstr "C++ Avots:"
-
msgid "Skip Breakpoints"
msgstr "Izlaist pÄrrÄvumpunktus"
@@ -2067,22 +2058,6 @@ msgstr "PÄrvaldÄ«t Å¡ablonus"
msgid "Install from file"
msgstr "Instalēt no faila"
-msgid ""
-"This will set up your project for custom Android builds by installing the "
-"source template to \"res://android/build\".\n"
-"You can then apply modifications and build your own custom APK on export "
-"(adding modules, changing the AndroidManifest.xml, etc.).\n"
-"Note that in order to make custom builds instead of using pre-built APKs, "
-"the \"Use Custom Build\" option should be enabled in the Android export "
-"preset."
-msgstr ""
-"Å is iestatÄ«s jÅ«su projektu priekÅ¡ pielÄgotÄm Android bÅ«vÄ“m, ieinstalÄ“jot "
-"avota Å¡ablonu uz \"res://android/build\".\n"
-"JÅ«s varat veikt izmaiņas un uzbÅ«vÄ“t paÅ¡i savu pielÄgoto APK pie "
-"eksportēšanas (pievienot moduļus, mainīt AndroidManifest.xml, utt.).\n"
-"PiezÄ«me - lai veiktu pielÄgotÄs bÅ«ves jau iebÅ«vÄ“to APK vietÄ, opcijai "
-"\"Izmantot PielÄgotu bÅ«vi\" jÄbÅ«t ieslÄ“gtai pie Android eksporta Å¡ablona."
-
msgid "Import Templates From ZIP File"
msgstr "Importēr šablonus no ZIP faila"
@@ -2207,9 +2182,6 @@ msgstr "Jau ir rediģēta aina."
msgid "General"
msgstr "VispÄrÄ“ji"
-msgid "%s Error"
-msgstr "%s Kļūda"
-
msgid "Storing File:"
msgstr "Faila saglabÄÅ¡ana:"
@@ -2487,15 +2459,15 @@ msgstr "Pievienot Mezgla Punktu"
msgid "Add Animation Point"
msgstr "Pievienot AnimÄcijas Punktu"
+msgid "Blend:"
+msgstr "SapludinÄt:"
+
msgid "Open Animation Node"
msgstr "AtvÄ“rt AnimÄcijas Mezglu"
msgid "Add Triangle"
msgstr "Pievienot Trijstūri"
-msgid "Blend:"
-msgstr "SapludinÄt:"
-
msgid "Nodes Connected"
msgstr "Mezgli Savienoti"
@@ -2951,6 +2923,9 @@ msgstr "Notīrīt nesenos skriptus"
msgid "Standard"
msgstr "Standarts"
+msgid "Source"
+msgstr "Avots"
+
msgid ""
"Missing connected method '%s' for signal '%s' from node '%s' to node '%s'."
msgstr ""
@@ -3025,9 +3000,6 @@ msgstr "Nav izvēlēti kadri"
msgid "Animations:"
msgstr "AnimÄcijas:"
-msgid "Loop"
-msgstr "Cilpa"
-
msgid "Animation Frames:"
msgstr "AnimÄcijas Kadri:"
diff --git a/editor/translations/editor/ms.po b/editor/translations/editor/ms.po
index 6334a8cf3b..83a970ad95 100644
--- a/editor/translations/editor/ms.po
+++ b/editor/translations/editor/ms.po
@@ -594,9 +594,6 @@ msgstr "Putuskan sambungan"
msgid "Connect a Signal to a Method"
msgstr "Sambungkan Isyarat ke Kaedah"
-msgid "Edit Connection:"
-msgstr "Edit Sambungan:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
"Adakah anda pasti anda mahu mengeluarkan semua sambungan dari isyarat \"% "
@@ -709,6 +706,9 @@ msgstr "Masa"
msgid "Calls"
msgstr "Panggilan"
+msgid "%s Error"
+msgstr "%s Ralat"
+
msgid "Expand All"
msgstr "Kembangkan Semua"
@@ -1577,6 +1577,9 @@ msgstr "%s tidak dipinkan"
msgid "Copy Property Path"
msgstr "Salin Laluan Sifat"
+msgid "Edit Filters"
+msgstr "Sunting Filters"
+
msgid "Language:"
msgstr "Bahasa:"
@@ -2107,24 +2110,6 @@ msgid "Install from file"
msgstr "Pasang dari fail"
msgid ""
-"This will set up your project for custom Android builds by installing the "
-"source template to \"res://android/build\".\n"
-"You can then apply modifications and build your own custom APK on export "
-"(adding modules, changing the AndroidManifest.xml, etc.).\n"
-"Note that in order to make custom builds instead of using pre-built APKs, "
-"the \"Use Custom Build\" option should be enabled in the Android export "
-"preset."
-msgstr ""
-"Ini akan menyiapkan projek anda untuk binaan Android khas dengan memasang "
-"templat sumber pada \"res://android/build\".\n"
-"Anda kemudian boleh menerapkan pengubahsuaian dan membina APK tersuai anda "
-"sendiri pada eksport (menambah modul, menukar AndroidManifest.xml, dan lain-"
-"lain).\n"
-"Perhatikan bahawa untuk membuat binaan tersuai dan bukannya menggunakan APK "
-"pra-dibina, pilihan \"Gunakan Bina Tersuai\" harus diaktifkan dalam pratetap "
-"eksport Android."
-
-msgid ""
"The Android build template is already installed in this project and it won't "
"be overwritten.\n"
"Remove the \"res://android/build\" directory manually before attempting this "
@@ -2333,9 +2318,6 @@ msgstr "Sudah ada adegan yang diedit."
msgid "General"
msgstr "Am"
-msgid "%s Error"
-msgstr "%s Ralat"
-
msgid "Device"
msgstr "Peranti"
@@ -3005,6 +2987,9 @@ msgstr "Pilih dan pindahkan titik-titik, cipta titik-titik dengan RMB."
msgid "Enable snap and show grid."
msgstr "Aktifkan snap dan tunjukkan grid."
+msgid "Blend:"
+msgstr "Adun:"
+
msgid "Point"
msgstr "Titik"
@@ -3048,15 +3033,9 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
"Jana segi tiga-segi tiga campuran secara automatik (bukan secara manual)"
-msgid "Blend:"
-msgstr "Adun:"
-
msgid "Parameter Changed:"
msgstr "Parameter Berubah:"
-msgid "Edit Filters"
-msgstr "Sunting Filters"
-
msgid "Output node can't be added to the blend tree."
msgstr "Nod keluaran tidak boleh ditambah ke pokok adunan."
@@ -3177,9 +3156,6 @@ msgstr "Mainkan animasi terpilih ke belakang dari pos semasa. (A)"
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "Mainkan animasi terpillih ke belakang dari hujung. (Shift+A)"
-msgid "Stop animation playback. (S)"
-msgstr "Hentikan playback animasi. (S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "Mainkan animasi terpilih dari awal. (Shift+D)"
diff --git a/editor/translations/editor/nb.po b/editor/translations/editor/nb.po
index 8be049d267..e2001fa866 100644
--- a/editor/translations/editor/nb.po
+++ b/editor/translations/editor/nb.po
@@ -605,18 +605,6 @@ msgstr "Advarsel:"
msgid "Error:"
msgstr "Feil:"
-msgid "C++ Error"
-msgstr "C++-feil"
-
-msgid "C++ Error:"
-msgstr "C++-feil:"
-
-msgid "Source"
-msgstr "Kilde"
-
-msgid "Source:"
-msgstr "Kildekode:"
-
msgid "Copy Error"
msgstr "Feil ved kopiering"
@@ -1179,12 +1167,12 @@ msgstr "Endre størrelsen på Array"
msgid "Set Multiple:"
msgstr "Sett mange:"
+msgid "Edit Filters"
+msgstr "Rediger filtere"
+
msgid "Language:"
msgstr "Språk:"
-msgid "Script"
-msgstr "Skript"
-
msgid "Clear Output"
msgstr "Nullstill Resultat"
@@ -2075,9 +2063,6 @@ msgstr "Punkt"
msgid "Triangle already exists."
msgstr "Triangelet finnes allerede."
-msgid "Edit Filters"
-msgstr "Rediger filtere"
-
msgid "Functions"
msgstr "Funksjoner"
@@ -2120,9 +2105,6 @@ msgstr "Spill av valgte animasjon baklengs fra gjeldende posisjon. (A)"
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "Spill av valgte animasjon baklengs fra slutten. (Shift+A)"
-msgid "Stop animation playback. (S)"
-msgstr "Stopp avspilling av animasjon. (S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "Spill av valgte animasjon fra start. (Shift+D)"
@@ -2807,6 +2789,9 @@ msgstr "Søkeresultater"
msgid "Standard"
msgstr "Standard"
+msgid "Source"
+msgstr "Kilde"
+
msgid "Target"
msgstr "MÃ¥l"
@@ -2885,9 +2870,6 @@ msgstr "Fjern Animasjon?"
msgid "(empty)"
msgstr "(tom)"
-msgid "Loop"
-msgstr "Repeter"
-
msgid "Zoom Reset"
msgstr "Tilbakestill forstørring"
diff --git a/editor/translations/editor/nl.po b/editor/translations/editor/nl.po
index e829ebaa7a..668568460d 100644
--- a/editor/translations/editor/nl.po
+++ b/editor/translations/editor/nl.po
@@ -19,7 +19,7 @@
# Pieter-Jan Briers <pieterjan.briers@gmail.com>, 2017-2018.
# Robin Arys <robinarys@hotmail.com>, 2017.
# Senno Kaasjager <senno.kaasjager@gmail.com>, 2017.
-# Uxilo <jmolendijk93@gmail.com>, 2017-2018.
+# Uxilo <jmolendijk93@gmail.com>, 2017-2018, 2023.
# Willem <studiebolmail@gmail.com>, 2018.
# Wout Standaert <wout@blobkat.com>, 2017.
# Zatherz <zatherz@linux.pl>, 2017.
@@ -65,8 +65,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: 2022-09-23 04:16+0000\n"
-"Last-Translator: Nnn <irri2020@outlook.com>\n"
+"PO-Revision-Date: 2023-02-08 12:14+0000\n"
+"Last-Translator: Uxilo <jmolendijk93@gmail.com>\n"
"Language-Team: Dutch <https://hosted.weblate.org/projects/godot-engine/godot/"
"nl/>\n"
"Language: nl\n"
@@ -74,14 +74,35 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.14.1\n"
+"X-Generator: Weblate 4.16-dev\n"
msgid "Physical"
msgstr "Fysiek"
+msgid "Left Mouse Button"
+msgstr "Linker Muis Knop"
+
+msgid "Right Mouse Button"
+msgstr "Rechter Muis Knop"
+
+msgid "Middle Mouse Button"
+msgstr "Middelste Muis Knop"
+
+msgid "Mouse Wheel Up"
+msgstr "Scrollwiel Omhoog"
+
+msgid "Mouse Wheel Down"
+msgstr "Scrollwiel Omlaag"
+
msgid "Button"
msgstr "Button (Knop)"
+msgid "Double Click"
+msgstr "Dubbel Klik"
+
+msgid "Mouse motion at position (%s) with velocity (%s)"
+msgstr "Muis beweging op positie (%s) met snelheid (%s)"
+
msgid "Select"
msgstr "Selecteer"
@@ -181,9 +202,24 @@ msgstr "Action '%s' bestaat al."
msgid "Add Event"
msgstr "Event Toevoegen"
+msgid "Remove Action"
+msgstr "Verwijder Actie"
+
+msgid "Cannot Remove Action"
+msgstr "Kan Actie Niet Verwijderen"
+
+msgid "Filter by name..."
+msgstr "Filter op naam..."
+
+msgid "Add New Action"
+msgstr "Nieuwe Actie Toevoegen"
+
msgid "Add"
msgstr "Toevoegen"
+msgid "Show Built-in Actions"
+msgstr "Weergeef Ingebouwde Acties"
+
msgid "Action"
msgstr "Actie"
@@ -211,6 +247,9 @@ msgstr "Bézierpunt toevoegen"
msgid "Move Bezier Points"
msgstr "Beweeg Bézierpunten"
+msgid "Focus"
+msgstr "Focus"
+
msgid "Change Animation Length"
msgstr "Verander Animatielengte"
@@ -250,6 +289,9 @@ msgstr "Functies:"
msgid "Audio Clips:"
msgstr "Audioclips:"
+msgid "Animation Clips:"
+msgstr "Animatieclips:"
+
msgid "Change Track Path"
msgstr "Verander Track pad"
@@ -268,12 +310,33 @@ msgstr "Naadloze-lusmodus (interpoleert einde met begin van lus)"
msgid "Remove this track."
msgstr "Verwijder deze track."
+msgid "Time (s):"
+msgstr "Tijd (s):"
+
+msgid "Position:"
+msgstr "Positie:"
+
+msgid "Rotation:"
+msgstr "Rotatie:"
+
msgid "Scale:"
msgstr "Schaal:"
msgid "Type:"
msgstr "Type:"
+msgid "(Invalid, expected type: %s)"
+msgstr "(Ongeldig, verwachtte type: %s)"
+
+msgid "Start (s):"
+msgstr "Start (s):"
+
+msgid "End (s):"
+msgstr "Eind (s):"
+
+msgid "Animation Clip:"
+msgstr "Animatie Clip:"
+
msgid "Toggle Track Enabled"
msgstr "Track in-/uit schakelen"
@@ -381,12 +444,24 @@ msgstr "Track path is niet geldig, dus kan geen methode key toevoegen."
msgid "Add Method Track Key"
msgstr "Voeg Methode Track sleutel toe"
+msgid "Method not found in object:"
+msgstr "Methode niet gevonden in object:"
+
msgid "Position"
msgstr "Positie"
+msgid "Rotation"
+msgstr "Rotatie"
+
+msgid "Scale"
+msgstr "Schaal"
+
msgid "Methods"
msgstr "Methoden"
+msgid "Bezier"
+msgstr "Bezier"
+
msgid "Audio"
msgstr "Audio"
@@ -409,6 +484,9 @@ msgid "Select an AnimationPlayer node to create and edit animations."
msgstr ""
"Selecteer een AnimationPlayer uit de Scene Tree om animaties te wijzigen."
+msgid "Imported Scene"
+msgstr "Geïmporteerde Scene"
+
msgid "Only show tracks from nodes selected in tree."
msgstr "Alleen sporen van geselecteerde knopen tonen."
@@ -460,6 +538,15 @@ msgstr "Ga naar Vorige Stap"
msgid "Apply Reset"
msgstr "Reset"
+msgid "Optimize Animation (no undo)"
+msgstr "Optimaliseer Animatie (Onomkeerbaar)"
+
+msgid "Clean-Up Animation (no undo)"
+msgstr "Animatie Opschonen (Onomkeerbaar)"
+
+msgid "Pick a node to animate:"
+msgstr "Kies een node om te animeren:"
+
msgid "Use Bezier Curves"
msgstr "Gebruik Bezier Curves"
@@ -517,6 +604,16 @@ msgstr "Regelnummer:"
msgid "%d replaced."
msgstr "%d vervangingen."
+msgid "%d match"
+msgid_plural "%d matches"
+msgstr[0] "%d overeenkomst gevonden"
+msgstr[1] "%d overeenkomsten gevonden"
+
+msgid "%d of %d match"
+msgid_plural "%d of %d matches"
+msgstr[0] "%d overeenkomst gevonden"
+msgstr[1] "%d overeenkomsten gevonden"
+
msgid "Match Case"
msgstr "Hoofdlettergevoelig"
@@ -567,7 +664,7 @@ msgstr ""
"script aan de doelknoop."
msgid "Connect to Node:"
-msgstr "Aan knoop verbinden:"
+msgstr "Aan Node verbinden:"
msgid "Connect to Script:"
msgstr "Met script verbinden:"
@@ -578,6 +675,9 @@ msgstr "Vanuit signaal:"
msgid "Scene does not contain any script."
msgstr "Scene bevat geen script."
+msgid "Select Method"
+msgstr "Selecteer Method"
+
msgid "Remove"
msgstr "Verwijderen"
@@ -602,6 +702,9 @@ msgstr ""
"Stelt het signaal uit, bewaart het in een wachtrij en activeert het pas op "
"een dood moment."
+msgid "One Shot"
+msgstr "Eenmalig"
+
msgid "Disconnects the signal after its first emission."
msgstr "Koppelt het signaal automatisch los na de eerste uitzending."
@@ -617,6 +720,9 @@ msgstr "Verbinden"
msgid "Signal:"
msgstr "Signaal:"
+msgid "No description."
+msgstr "Geen omschrijving."
+
msgid "Connect '%s' to '%s'"
msgstr "Verbind '%s' met '%s'"
@@ -635,9 +741,6 @@ msgstr "Loskoppelen"
msgid "Connect a Signal to a Method"
msgstr "Verbind een signaal met een methode"
-msgid "Edit Connection:"
-msgstr "Verbinding bewerken:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
"Weet je zeker dat je alle verbindingen met signaal \"%s\" wilt verwijderen?"
@@ -645,6 +748,9 @@ msgstr ""
msgid "Signals"
msgstr "Signalen"
+msgid "Filter Signals"
+msgstr "Filter Signalen"
+
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
"Weet je zeker dat je alle verbindingen naar dit signaal wilt verwijderen?"
@@ -652,12 +758,18 @@ msgstr ""
msgid "Disconnect All"
msgstr "Alles loskoppelen"
+msgid "Copy Name"
+msgstr "Kopieer Naam"
+
msgid "Edit..."
msgstr "Bewerken..."
msgid "Go to Method"
msgstr "Ga naar Methode"
+msgid "Change Type of \"%s\""
+msgstr "Wijzig Type van \"%s\""
+
msgid "Change"
msgstr "Wijzig"
@@ -667,6 +779,12 @@ msgstr "%s opstellen"
msgid "No results for \"%s\"."
msgstr "Geen resultaten voor \"%s\"."
+msgid "This class is marked as deprecated."
+msgstr "Deze klasse is gemarkeerd als verouderd."
+
+msgid "This class is marked as experimental."
+msgstr "Deze klasse is gemarkeerd als experimenteel."
+
msgid "No description available for %s."
msgstr "Geen beschrijving beschikbaar voor %s."
@@ -757,6 +875,18 @@ msgstr "Tijd"
msgid "Calls"
msgstr "Aanroepen"
+msgid "Linked"
+msgstr "Gekoppeld"
+
+msgid "CPU"
+msgstr "CPU"
+
+msgid "GPU"
+msgstr "GPU"
+
+msgid "Execution resumed."
+msgstr "Uitvoering hervat."
+
msgid "Bytes:"
msgstr "Bytes:"
@@ -766,30 +896,36 @@ msgstr "Waarschuwing:"
msgid "Error:"
msgstr "Fout:"
-msgid "C++ Error"
-msgstr "C++ Fout"
+msgid "%s Error"
+msgstr "%s Fout"
-msgid "C++ Error:"
-msgstr "C++ Fout:"
+msgid "Stack Trace"
+msgstr "Stack Trace"
-msgid "Source"
-msgstr "Bron"
+msgid "Stack Trace:"
+msgstr "Stack Trace:"
-msgid "C++ Source"
-msgstr "C++ Bron"
+msgid "Line %d"
+msgstr "Regel %d"
-msgid "Source:"
-msgstr "Bron:"
+msgid "Delete Breakpoint"
+msgstr "Verwijder Breekpunt"
-msgid "C++ Source:"
-msgstr "C++ Bron:"
+msgid "Delete All Breakpoints in:"
+msgstr "Verwijder Alle Breekpunten in:"
-msgid "Stack Trace"
-msgstr "Stack Trace"
+msgid "Delete All Breakpoints"
+msgstr "Verwijder Alle Breekpunten"
msgid "Copy Error"
msgstr "Kopieer Fout"
+msgid "Open C++ Source on GitHub"
+msgstr "Open C++ Bron op GitHub"
+
+msgid "C++ Source"
+msgstr "C++ Bron"
+
msgid "Video RAM"
msgstr "Videogeheugen"
@@ -811,6 +947,9 @@ msgstr "Vervolg"
msgid "Stack Frames"
msgstr "Stack Frames"
+msgid "Filter Stack Variables"
+msgstr "Filter Stack Variablen"
+
msgid "Breakpoints"
msgstr "Breekpunten"
@@ -823,6 +962,9 @@ msgstr "Alles inklappen"
msgid "Profiler"
msgstr "Profiler"
+msgid "Visual Profiler"
+msgstr "Visuele Profiler"
+
msgid "List of Video Memory Usage by Resource:"
msgstr "Lijst van videogeheugengebruik per bron:"
@@ -1746,12 +1888,12 @@ msgstr "Laat alle lokalen zien"
msgid "Show Selected Locales Only"
msgstr "Alleen geselecteerde talen tonen"
+msgid "Edit Filters"
+msgstr "Filters berwerken"
+
msgid "Language:"
msgstr "Taal:"
-msgid "Script"
-msgstr "Script"
-
msgid "Clear Output"
msgstr "Uitvoer wissen"
@@ -2270,23 +2412,6 @@ msgid "Install from file"
msgstr "Installeer Vanuit Bestand"
msgid ""
-"This will set up your project for custom Android builds by installing the "
-"source template to \"res://android/build\".\n"
-"You can then apply modifications and build your own custom APK on export "
-"(adding modules, changing the AndroidManifest.xml, etc.).\n"
-"Note that in order to make custom builds instead of using pre-built APKs, "
-"the \"Use Custom Build\" option should be enabled in the Android export "
-"preset."
-msgstr ""
-"Hiermee wordt je project ingesteld voor aangepaste Android-builds door de "
-"bronsjabloon te installeren naar \"res://android/build\".\n"
-"Je kan vervolgens wijzigingen toepassen en je eigen aangepaste APK maken bij "
-"export (modules toevoegen, de AndroidManifest.xml aanpassen, enz.).\n"
-"Houd er rekening mee dat om aangepaste builds te maken in plaats van vooraf "
-"gebouwde APK's te gebruiken, de optie \"Use Custom Build\" moet ingeschakeld "
-"zijn in de Android-export preset."
-
-msgid ""
"The Android build template is already installed in this project and it won't "
"be overwritten.\n"
"Remove the \"res://android/build\" directory manually before attempting this "
@@ -2497,9 +2622,6 @@ msgstr "Sneltoetsen"
msgid "Binding"
msgstr "Binding"
-msgid "%s Error"
-msgstr "%s Fout"
-
msgid "All Devices"
msgstr "Alle Apparaten"
@@ -3219,6 +3341,9 @@ msgstr "Selecteer en verplaats punten, maak punten aan met RMK."
msgid "Enable snap and show grid."
msgstr "Kleven inschakelen en raster weergeven."
+msgid "Blend:"
+msgstr "Mengen:"
+
msgid "Point"
msgstr "Punt"
@@ -3261,15 +3386,9 @@ msgstr "Punten en driehoeken wissen."
msgid "Generate blend triangles automatically (instead of manually)"
msgstr "Genereer geblende driehoeken automatisch (in plaats van handmatig)"
-msgid "Blend:"
-msgstr "Mengen:"
-
msgid "Parameter Changed:"
msgstr "Parameter veranderd:"
-msgid "Edit Filters"
-msgstr "Filters berwerken"
-
msgid "Output node can't be added to the blend tree."
msgstr "Uitvoerknoop kan niet worden toegevoegd aan de overgangsboom."
@@ -3387,9 +3506,6 @@ msgstr "Speel geselecteerde animatie achterwaarts vanaf huidige positie. (A)"
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "Speel geselecteerde animatie achterwaarts vanaf het einde. (Shift+A)"
-msgid "Stop animation playback. (S)"
-msgstr "Stop animatie opname. (S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "Speel geselecteerde animatie vanaf het begin. (Shift+D)"
@@ -4439,12 +4555,6 @@ msgstr "Verander Notifier AABB"
msgid "Change Particles AABB"
msgstr "Verander Particles AABB"
-msgid "Change Box Shape Extents"
-msgstr "Wijzig Box Vorm Extents"
-
-msgid "Change Probe Extents"
-msgstr "Verander Probe Extents"
-
msgid "Change Capsule Shape Radius"
msgstr "Wijzig Capsule Vorm Straal"
@@ -4484,6 +4594,9 @@ msgstr "Sleutelinvoer is uitgeschakeld (geen sleutel ingevoegd)."
msgid "Animation Key Inserted."
msgstr "Animatiesleutel Ingevoegd."
+msgid "Objects: %d\n"
+msgstr "Objecten: %d\n"
+
msgid "Top View."
msgstr "Bovenaanzicht."
@@ -5173,6 +5286,9 @@ msgstr "Standaard"
msgid "Connections to method:"
msgstr "Verbindingen aan methode:"
+msgid "Source"
+msgstr "Bron"
+
msgid "Target"
msgstr "Doel"
@@ -5396,12 +5512,6 @@ msgstr "(leeg)"
msgid "Animations:"
msgstr "Animaties:"
-msgid "Speed:"
-msgstr "Snelheid:"
-
-msgid "Loop"
-msgstr "Lus"
-
msgid "Animation Frames:"
msgstr "Animatiebeelden:"
@@ -6323,9 +6433,6 @@ msgstr "Toevoegen Input Action"
msgid "Change Action deadzone"
msgstr "Wijzig Action Deadzone"
-msgid "Add Input Action Event"
-msgstr "Toevoegen Input Action Event"
-
msgid "Erase Input Action"
msgstr "Verwijder Input Actie"
@@ -6353,9 +6460,6 @@ msgstr "Selecteer Eigenschap"
msgid "Select Virtual Method"
msgstr "Selecteer Virtuele Method"
-msgid "Select Method"
-msgstr "Selecteer Method"
-
msgid "Batch Rename"
msgstr "Bulk hernoemen"
@@ -7012,12 +7116,6 @@ msgstr "Ongeldige publieke sleutel voor APK -uitbreiding."
msgid "Invalid package name:"
msgstr "Ongeldige pakketnaam:"
-msgid "\"Use Custom Build\" must be enabled to use the plugins."
-msgstr "\"Use Custom Build\" moet geactiveerd zijn om plugins te gebruiken."
-
-msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled."
-msgstr "\"Export AAB\" is alleen geldig als \"Use Custom Build\" aan staat."
-
msgid "Invalid filename! Android App Bundle requires the *.aab extension."
msgstr ""
"Bestandsnaam niet toegestaan! Android App Bundle vereist een *.aab extensie."
@@ -7028,13 +7126,6 @@ msgstr "APK Expansion werkt niet samen met Android App Bundle."
msgid "Invalid filename! Android APK requires the *.apk extension."
msgstr "Bestandsnaam niet toegestaan! Android APK vereist een *.apk extensie."
-msgid ""
-"Trying to build from a custom built template, but no version info for it "
-"exists. Please reinstall from the 'Project' menu."
-msgstr ""
-"Geprobeerd met een eigen bouwsjabloon te bouwen, maar versie info ontbreekt. "
-"Installeer alstublieft opnieuw vanuit het 'Project' menu."
-
msgid "Building Android Project (gradle)"
msgstr "Bouwen van Android Project (gradle)"
diff --git a/editor/translations/editor/pl.po b/editor/translations/editor/pl.po
index 5e3538dca3..68805f2e2d 100644
--- a/editor/translations/editor/pl.po
+++ b/editor/translations/editor/pl.po
@@ -5,7 +5,7 @@
# 8-bit Pixel <dawdejw@gmail.com>, 2016, 2023.
# Adam Wolanski <adam.wolanski94@gmail.com>, 2017.
# Adrian Węcławski <weclawskiadrian@gmail.com>, 2016.
-# aelspire <aelspire@gmail.com>, 2017, 2019, 2020, 2021.
+# aelspire <aelspire@gmail.com>, 2017, 2019, 2020, 2021, 2023.
# Daniel Lewan <vision360.daniel@gmail.com>, 2016-2018, 2020.
# Dariusz Król <rexioweb@gmail.com>, 2018.
# heya10 <igor.gielzak@gmail.com>, 2017.
@@ -50,7 +50,7 @@
# Suchy Talerz <kacperkubis06@gmail.com>, 2021.
# Bartosz Stasiak <bs97086@amu.edu.pl>, 2021.
# Marek Malaria <to.tylko.dla.kont@gmail.com>, 2021, 2022.
-# Mateusz Żak <matisgramy@gmail.com>, 2021, 2022.
+# Mateusz Żak <matisgramy@gmail.com>, 2021, 2022, 2023.
# voltinus <voltinusmail@gmail.com>, 2021.
# Lech Migdal <lech.migdal@gmail.com>, 2022.
# Piotr <promantix@gmail.com>, 2022.
@@ -68,15 +68,16 @@
# Wodorek <Krol.w94@gmail.com>, 2022.
# Filip Gliszczyński <filipgliszczynski@gmail.com>, 2022.
# Piotr Åšlusarz <piotrekslusarz@outlook.com>, 2022.
-# Jan Kurzak <Iqaz0oki@outlook.com>, 2022.
+# Jan Kurzak <Iqaz0oki@outlook.com>, 2022, 2023.
# Wojciech Pluta <wojciech.pluta@oracle.com>, 2022.
+# mars9t <mars9t.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-01-20 10:19+0000\n"
-"Last-Translator: RM <synaptykq@gmail.com>\n"
+"PO-Revision-Date: 2023-02-10 00:54+0000\n"
+"Last-Translator: Tomek <kobewi4e@gmail.com>\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/"
"godot/pl/>\n"
"Language: pl\n"
@@ -85,26 +86,211 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 4.15.1\n"
+"X-Generator: Weblate 4.16-dev\n"
+
+msgid "Unset"
+msgstr "Wymaż"
msgid "Physical"
msgstr "Fizyczny"
+msgid "Left Mouse Button"
+msgstr "Lewy przycisk myszy"
+
+msgid "Right Mouse Button"
+msgstr "Prawy przycisk myszy"
+
+msgid "Middle Mouse Button"
+msgstr "Åšrodkowy przycisk myszy"
+
+msgid "Mouse Wheel Up"
+msgstr "Kółko myszy w górę"
+
+msgid "Mouse Wheel Down"
+msgstr "Kółko myszy w dół"
+
+msgid "Mouse Wheel Left"
+msgstr "Kółko myszy w lewo"
+
+msgid "Mouse Wheel Right"
+msgstr "Kółko myszy w prawo"
+
+msgid "Mouse Thumb Button 1"
+msgstr "Boczny przycisk myszki 1"
+
+msgid "Mouse Thumb Button 2"
+msgstr "Boczny przycisk myszki 2"
+
msgid "Button"
msgstr "Przycisk"
+msgid "Double Click"
+msgstr "Podwójne kliknięcie"
+
+msgid "Mouse motion at position (%s) with velocity (%s)"
+msgstr "Ruch myszy w pozycji (%s) z prędkością (%s)"
+
+msgid "Left Stick X-Axis, Joystick 0 X-Axis"
+msgstr "Oś X lewego drążka, oś X Joysticka 0"
+
+msgid "Left Stick Y-Axis, Joystick 0 Y-Axis"
+msgstr "Oś Y lewego drążka, oś Y Joysticka 0"
+
+msgid "Right Stick X-Axis, Joystick 1 X-Axis"
+msgstr "Oś X prawego drążka, oś X Joysticka 1"
+
+msgid "Right Stick Y-Axis, Joystick 1 Y-Axis"
+msgstr "Oś Y prawego drążka, oś Y Joysticka 1"
+
+msgid "Joystick 2 X-Axis, Left Trigger, Sony L2, Xbox LT"
+msgstr "Drążek 2 oś X, Lewy spust, Sony L2, Xbox LT"
+
+msgid "Joystick 2 Y-Axis, Right Trigger, Sony R2, Xbox RT"
+msgstr "Drążek 2 oś Y, Prawy spust, Sony R2, Xbox RT"
+
+msgid "Joystick 3 X-Axis"
+msgstr "Joystick 3 oÅ› X"
+
+msgid "Joystick 3 Y-Axis"
+msgstr "Joystick 3 oÅ› Y"
+
+msgid "Joystick 4 X-Axis"
+msgstr "OÅ› X joysticka 4"
+
+msgid "Joystick 4 Y-Axis"
+msgstr "OÅ› Y joysticka 4"
+
+msgid "Unknown Joypad Axis"
+msgstr "Nieznana oÅ› joypada"
+
+msgid "Joypad Motion on Axis %d (%s) with Value %.2f"
+msgstr "Ruch joypada na osi %d (%s) o wartości %.2f"
+
+msgid "Bottom Action, Sony Cross, Xbox A, Nintendo B"
+msgstr "Dolna akcja, Sony krzyżyk, Xbox A, Nintendo B"
+
+msgid "Right Action, Sony Circle, Xbox B, Nintendo A"
+msgstr "Prawa akcja, Sony kółko, Xbox B, Nintendo A"
+
+msgid "Left Action, Sony Square, Xbox X, Nintendo Y"
+msgstr "Lewa akcja, Sony kwadrat, Xbox X, Nintendo Y"
+
+msgid "Top Action, Sony Triangle, Xbox Y, Nintendo X"
+msgstr "Górna akcja, Sony trójkąt, Xbox Y, Nintendo X"
+
+msgid "Back, Sony Select, Xbox Back, Nintendo -"
+msgstr "Powrót, Sony wybór, Xbox powrót, Nintendo -"
+
+msgid "Guide, Sony PS, Xbox Home"
+msgstr "Przewodnik, Sony PS, Xbox Home"
+
+msgid "Start, Nintendo +"
+msgstr "Start, Nintendo +"
+
+msgid "Left Stick, Sony L3, Xbox L/LS"
+msgstr "Lewy drążek, Sony L3, Xbox L/LS"
+
+msgid "Right Stick, Sony R3, Xbox R/RS"
+msgstr "Prawy drążek, Sony R3, Xbox R/RS"
+
+msgid "Left Shoulder, Sony L1, Xbox LB"
+msgstr "Lewy bumper, Sony L1, Xbox LB"
+
+msgid "Right Shoulder, Sony R1, Xbox RB"
+msgstr "Prawy bumper, Sony R1, Xbox RB"
+
+msgid "D-pad Up"
+msgstr "D-pad w górę"
+
+msgid "D-pad Down"
+msgstr "D-pad w dół"
+
+msgid "D-pad Left"
+msgstr "D-pad w lewo"
+
+msgid "D-pad Right"
+msgstr "D-pad w prawo"
+
+msgid "Xbox Share, PS5 Microphone, Nintendo Capture"
+msgstr "Xbox udostępnij, PS5 mikrofon, Nintendo zrzut"
+
+msgid "Xbox Paddle 1"
+msgstr "Xbox paletka 1"
+
+msgid "Xbox Paddle 2"
+msgstr "Xbox paletka 2"
+
+msgid "Xbox Paddle 3"
+msgstr "Xbox paletka 3"
+
+msgid "Xbox Paddle 4"
+msgstr "Xbox paletka 4"
+
+msgid "PS4/5 Touchpad"
+msgstr "PS4/5 panel dotykowy"
+
+msgid "touched"
+msgstr "dotknięty"
+
+msgid "released"
+msgstr "puszczony"
+
+msgid "Screen %s at (%s) with %s touch points"
+msgstr "Ekran %s w (%s) z %s punktami dotyku"
+
+msgid ""
+"Screen dragged with %s touch points at position (%s) with velocity of (%s)"
+msgstr ""
+"Ekran przeciągnięty z %s punktami dotyku na pozycji (%s) z prędkością (%s)"
+
+msgid "Magnify Gesture at (%s) with factor %s"
+msgstr "Gest przybliżenia w (%s) ze współczynnikiem %s"
+
+msgid "Pan Gesture at (%s) with delta (%s)"
+msgstr "Gest przesuwania w (%s) z przesunięciem (%s)"
+
+msgid "MIDI Input on Channel=%s Message=%s"
+msgstr "Wejście MIDI na kanale=%s wiadomość=%s"
+
+msgid "Input Event with Shortcut=%s"
+msgstr "Zdarzenie wejścia ze skrótem=%s"
+
+msgid "Accept"
+msgstr "Akceptuj"
+
msgid "Select"
msgstr "Zaznacz"
msgid "Cancel"
msgstr "Anuluj"
+msgid "Focus Next"
+msgstr "Zaznacz następny"
+
+msgid "Focus Prev"
+msgstr "Zaznacz poprzedni"
+
+msgid "Left"
+msgstr "Lewo"
+
+msgid "Right"
+msgstr "Prawo"
+
msgid "Up"
msgstr "Góra"
msgid "Down"
msgstr "Dół"
+msgid "Page Up"
+msgstr "Strona w górę"
+
+msgid "Page Down"
+msgstr "Strona w dół"
+
+msgid "Home"
+msgstr "Strona główna"
+
msgid "End"
msgstr "Koniec"
@@ -123,24 +309,126 @@ msgstr "Cofnij"
msgid "Redo"
msgstr "Ponów"
+msgid "Completion Query"
+msgstr "Zapytanie uzupełnienia"
+
+msgid "New Line"
+msgstr "Nowa linia"
+
+msgid "New Blank Line"
+msgstr "Nowa pusta linia"
+
+msgid "New Line Above"
+msgstr "Nowa linia powyżej"
+
msgid "Indent"
msgstr "Wcięcie"
+msgid "Dedent"
+msgstr "Wcięcie"
+
+msgid "Backspace"
+msgstr "Backspace"
+
+msgid "Backspace Word"
+msgstr "Backspace na słowo"
+
+msgid "Backspace all to Left"
+msgstr "Backspace na wszystko po lewej"
+
msgid "Delete"
msgstr "Usuń"
+msgid "Delete Word"
+msgstr "Usuń słowo"
+
+msgid "Delete all to Right"
+msgstr "Usuń wszystko po prawej"
+
+msgid "Caret Left"
+msgstr "Kursor w lewo"
+
+msgid "Caret Word Left"
+msgstr "Kursor w lewo o słowo"
+
+msgid "Caret Right"
+msgstr "Kursor w prawo"
+
+msgid "Caret Word Right"
+msgstr "Kursor w prawo o słowo"
+
+msgid "Caret Up"
+msgstr "Kursor w górę"
+
+msgid "Caret Down"
+msgstr "Kursor w dół"
+
+msgid "Caret Line Start"
+msgstr "Kursor na poczÄ…tek linii"
+
+msgid "Caret Line End"
+msgstr "Kursor na koniec linii"
+
+msgid "Caret Page Up"
+msgstr "Kursor w górę o stronę"
+
+msgid "Caret Page Down"
+msgstr "Kursor w dół o stronę"
+
+msgid "Caret Document Start"
+msgstr "Kursor na poczÄ…tek dokumentu"
+
+msgid "Caret Document End"
+msgstr "Kursor na koniec dokumentu"
+
+msgid "Caret Add Below"
+msgstr "Dodaj kursor niżej"
+
+msgid "Caret Add Above"
+msgstr "Dodaj kursor wyżej"
+
+msgid "Scroll Up"
+msgstr "Przewiń w górę"
+
+msgid "Scroll Down"
+msgstr "Przewiń w dół"
+
msgid "Select All"
msgstr "Zaznacz wszystko"
+msgid "Select Word Under Caret"
+msgstr "Zaznacz słowo pod kursorem"
+
+msgid "Add Selection for Next Occurrence"
+msgstr "Dodaj zaznaczenie na następne wystąpienie"
+
+msgid "Clear Carets and Selection"
+msgstr "Wyczyść kursory i zaznaczenie"
+
+msgid "Toggle Insert Mode"
+msgstr "Przełącz tryb wstawiania"
+
+msgid "Text Submitted"
+msgstr "Tekst przedłożony"
+
msgid "Duplicate Nodes"
msgstr "Duplikuj węzły"
msgid "Delete Nodes"
msgstr "Usuń węzły"
+msgid "Go Up One Level"
+msgstr "Idź w górę jeden poziom"
+
msgid "Refresh"
msgstr "Odśwież"
+msgid "Show Hidden"
+msgstr "Pokaż ukryte"
+
+msgid "Swap Input Direction"
+msgstr "Zamień kierunek wejścia"
+
msgid "Invalid input %d (not passed) in expression"
msgstr "Niewłaściwe dane %d (nie przekazane) w wyrażeniu"
@@ -163,6 +451,12 @@ msgstr "Niepoprawne argumenty do utworzenia \"%s\""
msgid "On call to '%s':"
msgstr "Przy wywołaniu \"%s\":"
+msgid "Built-in script"
+msgstr "Skrypt wbudowany"
+
+msgid "Built-in"
+msgstr "Wbudowany"
+
msgid "B"
msgstr "B"
@@ -184,6 +478,9 @@ msgstr "PiB"
msgid "EiB"
msgstr "EiB"
+msgid "Example: %s"
+msgstr "Przykład: %s"
+
msgid ""
"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'"
@@ -197,9 +494,33 @@ msgstr "Akcja o nazwie \"%s\" już istnieje."
msgid "Add Event"
msgstr "Dodaj zdarzenie"
+msgid "Remove Action"
+msgstr "Usuń akcję"
+
+msgid "Cannot Remove Action"
+msgstr "Nie można usunąć akcji"
+
+msgid "Edit Event"
+msgstr "Edytuj zdarzenie"
+
+msgid "Remove Event"
+msgstr "Usuń zdarzenie"
+
+msgid "Filter by name..."
+msgstr "Filtruj po nazwie..."
+
+msgid "Clear All"
+msgstr "Wyczyść wszystko"
+
+msgid "Add New Action"
+msgstr "Dodaj nowÄ… akcjÄ™"
+
msgid "Add"
msgstr "Dodaj"
+msgid "Show Built-in Actions"
+msgstr "Pokaż wbudowane akcje"
+
msgid "Action"
msgstr "Akcja"
@@ -212,6 +533,9 @@ msgstr "Czas:"
msgid "Value:"
msgstr "Wartość:"
+msgid "Update Selected Key Handles"
+msgstr "Aktualizuj zaznaczone uchwyty klucza"
+
msgid "Insert Key Here"
msgstr "Wstaw klucz tutaj"
@@ -221,12 +545,69 @@ msgstr "Duplikuj zaznaczone klucz(e)"
msgid "Delete Selected Key(s)"
msgstr "Usuń zaznaczony klucz(e)"
+msgid "Make Handles Free"
+msgstr "Uwolnij uchwyty"
+
+msgid "Make Handles Linear"
+msgstr "Uczyń uchwyty liniowymi"
+
+msgid "Make Handles Balanced"
+msgstr "Uczyń uchwyty zrównoważonymi"
+
+msgid "Make Handles Mirrored"
+msgstr "Uczyń uchwyty odbitymi"
+
+msgid "Make Handles Balanced (Auto Tangent)"
+msgstr "Uczyń uchwyty zrównoważonymi (automatyczne styczne)"
+
+msgid "Make Handles Mirrored (Auto Tangent)"
+msgstr "Uczyń uchwyty odbitymi (automatyczne styczne)"
+
msgid "Add Bezier Point"
msgstr "Dodaj punkt krzywej Beziera"
msgid "Move Bezier Points"
msgstr "Przesuń punkty krzywej Beziera"
+msgid "Animation Duplicate Keys"
+msgstr "Animacja duplikuj klucze"
+
+msgid "Animation Delete Keys"
+msgstr "Animacja usuń klucze"
+
+msgid "Focus"
+msgstr "Zaznacz"
+
+msgid "Select All Keys"
+msgstr "Zaznacz wszystkie klucze"
+
+msgid "Deselect All Keys"
+msgstr "Odznacz wszystkie klucze"
+
+msgid "Animation Change Transition"
+msgstr "Animacja zmień przejście"
+
+msgid "Animation Change %s"
+msgstr "Animacja zmień %s"
+
+msgid "Animation Change Keyframe Value"
+msgstr "Animacja zmień wartość klatki kluczowej"
+
+msgid "Animation Change Call"
+msgstr "Animacja zmień wywołanie"
+
+msgid "Animation Multi Change Transition"
+msgstr "Animacja zmień wiele przejść"
+
+msgid "Animation Multi Change %s"
+msgstr "Animacja zmień wiele %s"
+
+msgid "Animation Multi Change Keyframe Value"
+msgstr "Animacja zmień wartości wielu klatek kluczowych"
+
+msgid "Animation Multi Change Call"
+msgstr "Animacja zmień wiele wywołań"
+
msgid "Change Animation Length"
msgstr "Zmień długość animacji"
@@ -638,6 +1019,9 @@ msgstr "Z sygnału:"
msgid "Scene does not contain any script."
msgstr "Scena nie posiada żadnego skryptu."
+msgid "Select Method"
+msgstr "Wybierz metodÄ™"
+
msgid "Remove"
msgstr "Usuń"
@@ -697,9 +1081,6 @@ msgstr "Rozłącz"
msgid "Connect a Signal to a Method"
msgstr "Połącz sygnał do metody"
-msgid "Edit Connection:"
-msgstr "Edytuj połączenie:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr "Na pewno chcesz usunąć wszystkie połączenia z sygnału \"%s\"?"
@@ -841,23 +1222,8 @@ msgstr "Ostrzeżenie:"
msgid "Error:"
msgstr "BÅ‚Ä…d:"
-msgid "C++ Error"
-msgstr "BÅ‚Ä…d C++"
-
-msgid "C++ Error:"
-msgstr "BÅ‚Ä…d C++:"
-
-msgid "Source"
-msgstr "Źródło"
-
-msgid "C++ Source"
-msgstr "Źródło C++"
-
-msgid "Source:"
-msgstr "Źródło:"
-
-msgid "C++ Source:"
-msgstr "Źródło C++:"
+msgid "%s Error"
+msgstr "BÅ‚Ä…d %s"
msgid "Stack Trace"
msgstr "Åšlad stosu"
@@ -868,6 +1234,9 @@ msgstr "Kopiuj błąd"
msgid "Open C++ Source on GitHub"
msgstr "Otwórz źródło C++ na GitHubie"
+msgid "C++ Source"
+msgstr "Źródło C++"
+
msgid "Video RAM"
msgstr "Wideo RAM"
@@ -1064,7 +1433,7 @@ msgstr "Deweloper naczelny"
msgctxt "Job Title"
msgid "Project Manager"
-msgstr "Kierownik projektu"
+msgstr "Menedżer projektu"
msgid "Developers"
msgstr "Deweloperzy"
@@ -1685,6 +2054,12 @@ msgstr "nadpisuje %s:"
msgid "default:"
msgstr "domyślne:"
+msgid "Constructors"
+msgstr "Konstruktory"
+
+msgid "Operators"
+msgstr "Operatory"
+
msgid "Theme Properties"
msgstr "Właściwości motywu"
@@ -1719,9 +2094,15 @@ msgstr ""
"Obecnie nie ma opisu dla tej właściwości. Pomóż nam, [color=$color]"
"[url=$url]wysyłając ją[/url][/color]!"
+msgid "Constructor Descriptions"
+msgstr "Opisy konstruktorów"
+
msgid "Method Descriptions"
msgstr "Opisy metod"
+msgid "Operator Descriptions"
+msgstr "Opisy operatorów"
+
msgid "%d match."
msgstr "%d dopasowanie."
@@ -1823,12 +2204,12 @@ msgstr "Pokaż wszystkie języki"
msgid "Show Selected Locales Only"
msgstr "Pokaż tylko wybrane języki"
+msgid "Edit Filters"
+msgstr "Edytuj filtry"
+
msgid "Language:"
msgstr "Język:"
-msgid "Script"
-msgstr "Skrypt"
-
msgid "Clear Output"
msgstr "Wyczyść wyjście"
@@ -1982,13 +2363,13 @@ msgid "Quick Open Script..."
msgstr "Szybkie otwieranie skryptu..."
msgid "Save & Reload"
-msgstr "Zapisz i zrestartuj"
+msgstr "Zapisz i przeładuj"
msgid "Save & Quit"
msgstr "Zapisz i wyjdź"
msgid "Save changes to '%s' before reloading?"
-msgstr "Zapisać zmiany w '%s' przed zrestartowaniem?"
+msgstr "Zapisać zmiany w \"%s\" przed przeładowaniem?"
msgid "Save changes to '%s' before closing?"
msgstr "Zapisać zmiany w \"%s\" przed zamknięciem?"
@@ -2045,7 +2426,7 @@ msgid "Quick Run Scene..."
msgstr "Szybkie uruchomienie sceny..."
msgid "Save changes to the following scene(s) before reloading?"
-msgstr "Czy zapisać zmiany w aktualnej scenie/scenach przed zrestartowaniem?"
+msgstr "Czy zapisać zmiany w następującej scenie/scenach przed przeładowaniem?"
msgid "Save changes to the following scene(s) before quitting?"
msgstr "Czy zapisać zmiany w aktualnej scenie/scenach przed wyjściem?"
@@ -2345,7 +2726,7 @@ msgid "Compatibility"
msgstr "Kompatybilność"
msgid "Update Continuously"
-msgstr "Aktualizuj ciÄ…gle"
+msgstr "Stale Aktualizuj"
msgid "Hide Update Spinner"
msgstr "Ukryj wiatraczek aktualizacji"
@@ -2378,22 +2759,6 @@ msgid "Install from file"
msgstr "Zainstaluj z pliku"
msgid ""
-"This will set up your project for custom Android builds by installing the "
-"source template to \"res://android/build\".\n"
-"You can then apply modifications and build your own custom APK on export "
-"(adding modules, changing the AndroidManifest.xml, etc.).\n"
-"Note that in order to make custom builds instead of using pre-built APKs, "
-"the \"Use Custom Build\" option should be enabled in the Android export "
-"preset."
-msgstr ""
-"Ta opcja przygotuje twój projekt dla własnych buildów Androida, instalując "
-"źródłowy szablon w \"res://android/build\".\n"
-"Możesz wtedy dodać modyfikacje i zbudować podczas eksportu własny pakiet APK "
-"(dodając moduły, zmieniając AndroidManifest.xml itp.)\n"
-"Pamiętaj, że aby stworzyć własny build zamiast używać gotowego APK, opcja "
-"\"Use Custom Build\" powinna być włączona w profilu eksportu Androida."
-
-msgid ""
"The Android build template is already installed in this project and it won't "
"be overwritten.\n"
"Remove the \"res://android/build\" directory manually before attempting this "
@@ -2616,9 +2981,6 @@ msgstr "Skróty"
msgid "Binding"
msgstr "WiÄ…zanie"
-msgid "%s Error"
-msgstr "BÅ‚Ä…d %s"
-
msgid "All Devices"
msgstr "Wszystkie urzÄ…dzenia"
@@ -2886,6 +3248,14 @@ msgstr ""
msgid "Runnable"
msgstr "Uruchamiany"
+msgid "Export the project for all the presets defined."
+msgstr "Eksportuj projekt dla wszystkich zdefiniowanych presetów."
+
+msgid "All presets must have an export path defined for Export All to work."
+msgstr ""
+"Wszystkie ustawienia wstępne muszą mieć zdefiniowaną ścieżkę eksportu, aby "
+"fukcja Eksportuj wszystko działała."
+
msgid "Delete preset '%s'?"
msgstr "Usunąć profil \"%s\"?"
@@ -2965,6 +3335,13 @@ msgid "Invalid Encryption Key (must be 64 hexadecimal characters long)"
msgstr ""
"Nieprawidłowy klucz szyfrowania (długość musi wynosić 64 znaki szesnastkowe)"
+msgid ""
+"Note: Encryption key needs to be stored in the binary,\n"
+"you need to build the export templates from source."
+msgstr ""
+"Uwaga: Klucz szyfrowania musi być przechowywany w postaci binarnej,\n"
+"musisz zbudować szablony eksportu ze źródła."
+
msgid "Export All"
msgstr "Eksportuj wszystko"
@@ -3516,6 +3893,9 @@ msgstr "Wybierz i przesuń punkty, utwórz punkty używając PPM."
msgid "Enable snap and show grid."
msgstr "Włącz przyciąganie i pokaż siatkę."
+msgid "Blend:"
+msgstr "Mieszanie:"
+
msgid "Point"
msgstr "Punkt"
@@ -3558,15 +3938,9 @@ msgstr "Usuń punkty i trójkąty."
msgid "Generate blend triangles automatically (instead of manually)"
msgstr "Wygeneruj trójkąty mieszania automatycznie (zamiast ręcznie)"
-msgid "Blend:"
-msgstr "Mieszanie:"
-
msgid "Parameter Changed:"
msgstr "Parametr zmieniony:"
-msgid "Edit Filters"
-msgstr "Edytuj filtry"
-
msgid "Output node can't be added to the blend tree."
msgstr "Węzeł wyjściowy nie może być dodany do drzewa mieszania."
@@ -3689,9 +4063,6 @@ msgstr "Odtwórz zaznaczoną animację od tyłu z aktualnej pozycji. (A)"
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "Odtwórz zaznaczoną animację od tyłu z końca. (Shift+A)"
-msgid "Stop animation playback. (S)"
-msgstr "Zatrzymaj animacjÄ™. (S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "Uruchom animacjÄ™ od poczÄ…tku. (Shift+D)"
@@ -4343,10 +4714,10 @@ msgid "Clear Pose"
msgstr "Wyczyść pozę"
msgid "Multiply grid step by 2"
-msgstr "Powiększ siatkę x2"
+msgstr "Zwiększ rozdzielczość siatki 2 razy"
msgid "Divide grid step by 2"
-msgstr "Pomniejsz siatkÄ™ x2"
+msgstr "Zmniejsz rozdzielczość siatki 2 razy"
msgid "Adding %s..."
msgstr "Dodawanie %s..."
@@ -4651,7 +5022,7 @@ msgid "Bake Lightmaps"
msgstr "Stwórz Lightmaps"
msgid "LightMap Bake"
-msgstr "Wypal mapę światła"
+msgstr "Stwórz mapę światła"
msgid "Select lightmap bake file:"
msgstr "Wybierz plik wypalenia mapy światła:"
@@ -4916,14 +5287,8 @@ msgstr "Zmień AABB powiadamiacza"
msgid "Change Particles AABB"
msgstr "Zmień AABB cząsteczek"
-msgid "Change Box Shape Extents"
-msgstr "Zmień rozmiar Box Shape"
-
-msgid "Change Probe Extents"
-msgstr "Zmień rozmiar Probe"
-
msgid "Change Capsule Shape Radius"
-msgstr "Zmień średnicę Capsule Shape"
+msgstr "Zmień promień Capsule Shape"
msgid "Change Capsule Shape Height"
msgstr "Zmień wysokość kształtu kapsuły"
@@ -5174,7 +5539,7 @@ msgid "Orbit View Up"
msgstr "Widok Orbitalny z Góry"
msgid "Orbit View 180"
-msgstr "Orbituj widok o 180"
+msgstr "Orbitalny Widok 180"
msgid "Switch Perspective/Orthogonal View"
msgstr "Przełącz widok perspektywiczny/ortogonalny"
@@ -5727,6 +6092,9 @@ msgstr "Standardowy"
msgid "Connections to method:"
msgstr "Połączenia do metody:"
+msgid "Source"
+msgstr "Źródło"
+
msgid "Target"
msgstr "Cel"
@@ -5972,12 +6340,6 @@ msgstr "(pusty)"
msgid "Animations:"
msgstr "Animacje:"
-msgid "Speed:"
-msgstr "Szybkość:"
-
-msgid "Loop"
-msgstr "Zapętl"
-
msgid "Animation Frames:"
msgstr "Klatki animacji:"
@@ -7360,9 +7722,6 @@ msgstr "Dodawanie akcji Wejścia"
msgid "Change Action deadzone"
msgstr "Zmień martwą strefę akcji"
-msgid "Add Input Action Event"
-msgstr "Dodaj zdarzenie akcji wejścia"
-
msgid "Erase Input Action"
msgstr "Wyczyść akcję wejścia"
@@ -7390,9 +7749,6 @@ msgstr "Wybierz właściwość"
msgid "Select Virtual Method"
msgstr "Wybierz metoda wirtualnÄ…"
-msgid "Select Method"
-msgstr "Wybierz metodÄ™"
-
msgid "Batch Rename"
msgstr "Grupowa zmiana nazwy"
@@ -8147,13 +8503,6 @@ msgstr "Niepoprawny klucz publiczny dla ekspansji APK."
msgid "Invalid package name:"
msgstr "Niepoprawna nazwa paczki:"
-msgid "\"Use Custom Build\" must be enabled to use the plugins."
-msgstr "\"Use Custom Build\" musi być włączone, by używać wtyczek."
-
-msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled."
-msgstr ""
-"\"Eksportuj AAB\" jest ważne tylko gdy \"Use Custom Build\" jest włączone."
-
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."
@@ -8196,13 +8545,6 @@ msgid "Unsupported export format!"
msgstr "Nieobsługiwany format eksportu!"
msgid ""
-"Trying to build from a custom built template, but no version info for it "
-"exists. Please reinstall from the 'Project' menu."
-msgstr ""
-"Próbowano zbudować z własnego szablonu, ale nie istnieje dla niego "
-"informacja o wersji. Zainstaluj ponownie z menu \"Projekt\"."
-
-msgid ""
"Android build version mismatch: Template installed: %s, Godot version: %s. "
"Please reinstall Android build template from 'Project' menu."
msgstr ""
diff --git a/editor/translations/editor/pt.po b/editor/translations/editor/pt.po
index 52ca5759dc..b9cf75e6c7 100644
--- a/editor/translations/editor/pt.po
+++ b/editor/translations/editor/pt.po
@@ -605,6 +605,9 @@ msgstr "Do Sinal:"
msgid "Scene does not contain any script."
msgstr "A cena não contém qualquer script."
+msgid "Select Method"
+msgstr "Selecione Método"
+
msgid "Remove"
msgstr "Remover"
@@ -662,9 +665,6 @@ msgstr "Desligar"
msgid "Connect a Signal to a Method"
msgstr "Conectar Sinal a Método"
-msgid "Edit Connection:"
-msgstr "Editar Conexão:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr "Deseja remover todas as conexões do sinal \"%s\"?"
@@ -809,23 +809,8 @@ msgstr "Aviso:"
msgid "Error:"
msgstr "Erro:"
-msgid "C++ Error"
-msgstr "Erro C++"
-
-msgid "C++ Error:"
-msgstr "Erro C++:"
-
-msgid "Source"
-msgstr "Fonte"
-
-msgid "C++ Source"
-msgstr "Código-fonte C++"
-
-msgid "Source:"
-msgstr "Código-fonte:"
-
-msgid "C++ Source:"
-msgstr "Código-fonte C++:"
+msgid "%s Error"
+msgstr "%s Erro"
msgid "Stack Trace"
msgstr "Rastreamento de Pilha"
@@ -836,6 +821,9 @@ msgstr "Copiar Erro"
msgid "Open C++ Source on GitHub"
msgstr "Abrir Código C++ no GitHub"
+msgid "C++ Source"
+msgstr "Código-fonte C++"
+
msgid "Video RAM"
msgstr "Memória Vídeo"
@@ -1796,12 +1784,12 @@ msgstr "Mostrar Todos os Idiomas"
msgid "Show Selected Locales Only"
msgstr "Mostrar Apenas Idiomas Selecionados"
+msgid "Edit Filters"
+msgstr "Editar filtros"
+
msgid "Language:"
msgstr "Linguagem:"
-msgid "Script"
-msgstr "Script"
-
msgid "Variant"
msgstr "Variante"
@@ -2356,23 +2344,6 @@ msgid "Install from file"
msgstr "Instalar do ficheiro"
msgid ""
-"This will set up your project for custom Android builds by installing the "
-"source template to \"res://android/build\".\n"
-"You can then apply modifications and build your own custom APK on export "
-"(adding modules, changing the AndroidManifest.xml, etc.).\n"
-"Note that in order to make custom builds instead of using pre-built APKs, "
-"the \"Use Custom Build\" option should be enabled in the Android export "
-"preset."
-msgstr ""
-"O projeto será preparado para compilações personalizadas Android com a "
-"instalação do modelo fonte em \"res://android/build\".\n"
-"Poderá depois aplicar modificações e compilar o seu APK personalizado a "
-"exportar (com adição de módulos, a alterar AndroidManifest.xml, etc.).\n"
-"Repare que de forma a criar compilações personalizadas em vez de usar APKs "
-"pré-compilados, a opção \"Use Custom Build\" deve ser ativada na "
-"predefinição da exportação Android."
-
-msgid ""
"The Android build template is already installed in this project and it won't "
"be overwritten.\n"
"Remove the \"res://android/build\" directory manually before attempting this "
@@ -2599,9 +2570,6 @@ msgstr "Atalhos"
msgid "Binding"
msgstr "Ligação"
-msgid "%s Error"
-msgstr "%s Erro"
-
msgid "All Devices"
msgstr "Todos os Aparelhos"
@@ -3538,6 +3506,9 @@ msgstr "Selecionar e mover pontos, criar pontos com RMB."
msgid "Enable snap and show grid."
msgstr "Ativar ajuste e mostrar a grelha."
+msgid "Blend:"
+msgstr "Mistura:"
+
msgid "Point"
msgstr "Ponto"
@@ -3580,15 +3551,9 @@ msgstr "Apagar pontos e triângulos."
msgid "Generate blend triangles automatically (instead of manually)"
msgstr "Gera triângulos automaticamente (em vez de manual)"
-msgid "Blend:"
-msgstr "Mistura:"
-
msgid "Parameter Changed:"
msgstr "Parâmetro Alterado:"
-msgid "Edit Filters"
-msgstr "Editar filtros"
-
msgid "Output node can't be added to the blend tree."
msgstr "Saída do nó não pode ser adicionada à árvore de mistura."
@@ -3712,9 +3677,6 @@ msgstr ""
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "Reproduzir a Animação selecionada para trás a partir do fim. (Shift+A)"
-msgid "Stop animation playback. (S)"
-msgstr "Parar reprodução da Animação. (S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "Reproduzir a Animação selecionada a partir do início. (Shift+D)"
@@ -4938,12 +4900,6 @@ msgstr "Mudar Notificador AABB"
msgid "Change Particles AABB"
msgstr "Mudar partículas AABB"
-msgid "Change Box Shape Extents"
-msgstr "Mudar medidas da forma caixa"
-
-msgid "Change Probe Extents"
-msgstr "Mudar Extensões de Sonda"
-
msgid "Change Capsule Shape Radius"
msgstr "Mudar raio da forma cápsula"
@@ -5758,6 +5714,9 @@ msgstr "Padrão"
msgid "Connections to method:"
msgstr "Conexões ao método:"
+msgid "Source"
+msgstr "Fonte"
+
msgid "Target"
msgstr "Alvo"
@@ -5999,12 +5958,6 @@ msgstr "(vazio)"
msgid "Animations:"
msgstr "Animações:"
-msgid "Speed:"
-msgstr "Velocidade:"
-
-msgid "Loop"
-msgstr "Ciclo"
-
msgid "Animation Frames:"
msgstr "Frames da Animação:"
@@ -7430,9 +7383,6 @@ msgstr "Adicionar ação de entrada"
msgid "Change Action deadzone"
msgstr "Mudar a zona morta da Ação"
-msgid "Add Input Action Event"
-msgstr "Adicionar evento ação de entrada"
-
msgid "Erase Input Action"
msgstr "Apagar Ação de Entrada"
@@ -7460,9 +7410,6 @@ msgstr "Selecionar Propriedade"
msgid "Select Virtual Method"
msgstr "Selecione Método virtual"
-msgid "Select Method"
-msgstr "Selecione Método"
-
msgid "Batch Rename"
msgstr "Renomear em Massa"
@@ -8249,21 +8196,9 @@ msgstr "Chave pública inválida para expansão APK."
msgid "Invalid package name:"
msgstr "Nome de pacote inválido:"
-msgid "\"Use Custom Build\" must be enabled to use the plugins."
-msgstr "\"Use Custom Build\" têm de estar ativa para usar os plugins."
-
msgid "\"Passthrough\" is only valid when \"XR Mode\" is \"OpenXR\"."
msgstr "\"Passthrough\" só é válido quando o \"XR Mode\" é \"OpenXR\"."
-msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled."
-msgstr "\"Exportar AAB\" só é válido quando \"Use Custom Build\" está ativa."
-
-msgid ""
-"\"Min SDK\" can only be overridden when \"Use Custom Build\" is enabled."
-msgstr ""
-"\"Min SDK\" só pode ser substituído quando \"Usar Compilação Customizada\" "
-"está ativado."
-
msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid."
msgstr ""
"\"Min SDK\" deve ser um número inteiro válido, mas obteve \"%s\" que é "
@@ -8277,12 +8212,6 @@ msgstr ""
"biblioteca Godot."
msgid ""
-"\"Target SDK\" can only be overridden when \"Use Custom Build\" is enabled."
-msgstr ""
-"\"Target SDK\" só pode ser substituído quando \"Usar Compilação "
-"Customizada\" está ativado."
-
-msgid ""
"\"Target SDK\" should be a valid integer, but got \"%s\" which is invalid."
msgstr ""
"\"Target SDK\" deve ser um número inteiro válido, mas obteve \"%s\", que é "
@@ -8348,13 +8277,6 @@ msgid "Unsupported export format!"
msgstr "Formato de exportação não suportado!"
msgid ""
-"Trying to build from a custom built template, but no version info for it "
-"exists. Please reinstall from the 'Project' menu."
-msgstr ""
-"A tentar compilar a partir de um modelo personalizado, mas sem informação de "
-"versão. Reinstale no menu 'Projeto'."
-
-msgid ""
"Android build version mismatch: Template installed: %s, Godot version: %s. "
"Please reinstall Android build template from 'Project' menu."
msgstr ""
diff --git a/editor/translations/editor/pt_BR.po b/editor/translations/editor/pt_BR.po
index 16d1667b1f..8c0eb9e29b 100644
--- a/editor/translations/editor/pt_BR.po
+++ b/editor/translations/editor/pt_BR.po
@@ -157,13 +157,14 @@
# Kauã Azevedo <Kazevic@pm.me>, 2022.
# Zer0-Zer0 <dankmemerson@tutanota.com>, 2022.
# Levi Ferreira <leviferreiramorais@gmail.com>, 2023.
+# Leonardo <leotada523@gmail.com>, 2023.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor interface\n"
"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n"
"POT-Creation-Date: 2016-05-30\n"
-"PO-Revision-Date: 2023-01-14 00:01+0000\n"
-"Last-Translator: Levi Ferreira <leviferreiramorais@gmail.com>\n"
+"PO-Revision-Date: 2023-02-08 18:01+0000\n"
+"Last-Translator: Leonardo <leotada523@gmail.com>\n"
"Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/"
"godot-engine/godot/pt_BR/>\n"
"Language: pt_BR\n"
@@ -171,14 +172,29 @@ 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.15.1-dev\n"
+"X-Generator: Weblate 4.16-dev\n"
msgid "Physical"
msgstr "Físico"
+msgid "Left Mouse Button"
+msgstr "Botão Esquerdo do Mouse"
+
+msgid "Right Mouse Button"
+msgstr "Botão Direito do Mouse"
+
+msgid "Mouse Wheel Down"
+msgstr "Roda do mouse para baixo"
+
msgid "Button"
msgstr "Botão"
+msgid "Double Click"
+msgstr "Clique Duplo"
+
+msgid "Mouse motion at position (%s) with velocity (%s)"
+msgstr "Movimento do mouse na posição (%s) com velocidade (%s)"
+
msgid "Select"
msgstr "Selecionar"
@@ -730,6 +746,9 @@ msgstr "Sinal Origem:"
msgid "Scene does not contain any script."
msgstr "A cena não contém nenhum script."
+msgid "Select Method"
+msgstr "Selecionar Mtéodo"
+
msgid "Remove"
msgstr "Remover"
@@ -786,9 +805,6 @@ msgstr "Desconectar"
msgid "Connect a Signal to a Method"
msgstr "Conectar um Sinal a um Método"
-msgid "Edit Connection:"
-msgstr "Editar Conexão:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr "Tem certeza que quer remover todas as conexões do sinal \"%s\"?"
@@ -933,23 +949,8 @@ msgstr "Aviso:"
msgid "Error:"
msgstr "Erro:"
-msgid "C++ Error"
-msgstr "Erro C++"
-
-msgid "C++ Error:"
-msgstr "Erro C++:"
-
-msgid "Source"
-msgstr "Origem"
-
-msgid "C++ Source"
-msgstr "Origem C++"
-
-msgid "Source:"
-msgstr "Origem:"
-
-msgid "C++ Source:"
-msgstr "Origem C++:"
+msgid "%s Error"
+msgstr "Erro %s"
msgid "Stack Trace"
msgstr "Rastreamento de pilha"
@@ -960,6 +961,9 @@ msgstr "Copiar Erro"
msgid "Open C++ Source on GitHub"
msgstr "Abrir código C++ no GitHub"
+msgid "C++ Source"
+msgstr "Origem C++"
+
msgid "Video RAM"
msgstr "Memória de Vídeo"
@@ -1783,6 +1787,9 @@ msgstr "substitui %s:"
msgid "default:"
msgstr "padrão:"
+msgid "Constructors"
+msgstr "Construtores"
+
msgid "Theme Properties"
msgstr "Propriedades do Tema"
@@ -1920,12 +1927,12 @@ msgstr "Mostrar todos os Locales"
msgid "Show Selected Locales Only"
msgstr "Mostrar apenas os Locales selecionados"
+msgid "Edit Filters"
+msgstr "Editar Filtros"
+
msgid "Language:"
msgstr "Idioma:"
-msgid "Script"
-msgstr "Script"
-
msgid "Variant"
msgstr "Variante"
@@ -2486,23 +2493,6 @@ msgid "Install from file"
msgstr "Instalar do arquivo"
msgid ""
-"This will set up your project for custom Android builds by installing the "
-"source template to \"res://android/build\".\n"
-"You can then apply modifications and build your own custom APK on export "
-"(adding modules, changing the AndroidManifest.xml, etc.).\n"
-"Note that in order to make custom builds instead of using pre-built APKs, "
-"the \"Use Custom Build\" option should be enabled in the Android export "
-"preset."
-msgstr ""
-"Isso irá configurar o projeto para usar uma build do Android customizada "
-"instalando a template raiz para \"res://android/build\".\n"
-"Você poderá aplicar modificações e construir um APK customizado em exportar "
-"(adicionando módulos, changing the AndroidManifest.xml, etc.).\n"
-"Note que para fazer builds customizadas ao invés de usar APKs pré-"
-"construídas, a opção \"Usar Build Customizada\" deve sestar habilitada na "
-"pré-configuração de exportação Android."
-
-msgid ""
"The Android build template is already installed in this project and it won't "
"be overwritten.\n"
"Remove the \"res://android/build\" directory manually before attempting this "
@@ -2729,9 +2719,6 @@ msgstr "Atalhos"
msgid "Binding"
msgstr "VInculamento"
-msgid "%s Error"
-msgstr "Erro %s"
-
msgid "All Devices"
msgstr "Todos os dispositivos"
@@ -3676,6 +3663,9 @@ msgstr "Selecionar e mover pontos, criar pontos com o botão direito do mouse."
msgid "Enable snap and show grid."
msgstr "Habilitar snap e mostrar a grade."
+msgid "Blend:"
+msgstr "Misturar:"
+
msgid "Point"
msgstr "Ponto"
@@ -3718,15 +3708,9 @@ msgstr "Apagar pontos e triângulos."
msgid "Generate blend triangles automatically (instead of manually)"
msgstr "Gerar triângulos de mistura automaticamente (em vez de manualmente)"
-msgid "Blend:"
-msgstr "Misturar:"
-
msgid "Parameter Changed:"
msgstr "Parâmetro Modificado:"
-msgid "Edit Filters"
-msgstr "Editar Filtros"
-
msgid "Output node can't be added to the blend tree."
msgstr "Nó de Saída não pode ser adicionado à árvore de mistura."
@@ -3853,9 +3837,6 @@ msgid "Play selected animation backwards from end. (Shift+A)"
msgstr ""
"Iniciar animação selecionada de trás pra frente a partir do fim. (Shift+A)"
-msgid "Stop animation playback. (S)"
-msgstr "Parar reprodução da animação. (S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "Reproduzir animação selecionada do início. (Shift +D)"
@@ -5084,12 +5065,6 @@ msgstr "Alterar o AABB do Notificador"
msgid "Change Particles AABB"
msgstr "Alterar o AABB das Partículas"
-msgid "Change Box Shape Extents"
-msgstr "Alterar Dimensões da Forma da Caixa"
-
-msgid "Change Probe Extents"
-msgstr "Alterar a Extensão da Sonda"
-
msgid "Change Capsule Shape Radius"
msgstr "Alterar o Raio da Forma da Cápsula"
@@ -5907,6 +5882,9 @@ msgstr "Padrão"
msgid "Connections to method:"
msgstr "Conexões com o método:"
+msgid "Source"
+msgstr "Origem"
+
msgid "Target"
msgstr "Destino"
@@ -6150,12 +6128,6 @@ msgstr "(vazio)"
msgid "Animations:"
msgstr "Animações:"
-msgid "Speed:"
-msgstr "Velocidade:"
-
-msgid "Loop"
-msgstr "Repetir"
-
msgid "Animation Frames:"
msgstr "Frames da Animação:"
@@ -7582,9 +7554,6 @@ msgstr "Adicionar Ação de Entrada"
msgid "Change Action deadzone"
msgstr "Alterar zona morta de ação"
-msgid "Add Input Action Event"
-msgstr "Adicionar Evento de Ação de Entrada"
-
msgid "Erase Input Action"
msgstr "Apagar Ação de Entrada"
@@ -7612,9 +7581,6 @@ msgstr "Selecionar Propriedade"
msgid "Select Virtual Method"
msgstr "Selecionar Método Virtual"
-msgid "Select Method"
-msgstr "Selecionar Mtéodo"
-
msgid "Batch Rename"
msgstr "Renomear em lote"
@@ -8406,25 +8372,9 @@ msgstr "Chave pública inválida para expansão do APK."
msgid "Invalid package name:"
msgstr "Nome de pacote inválido:"
-msgid "\"Use Custom Build\" must be enabled to use the plugins."
-msgstr ""
-"\"Usar Compilação Customizada\" precisa estar ativo para ser possível "
-"utilizar plugins."
-
msgid "\"Passthrough\" is only valid when \"XR Mode\" is \"OpenXR\"."
msgstr "\"Passthrough\" só é válido quando o \"XR Mode\" é \"OpenXR\"."
-msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled."
-msgstr ""
-"\"Exportar AAB\" só é válido quando \"Usar Compilação Customizada\" está "
-"habilitado."
-
-msgid ""
-"\"Min SDK\" can only be overridden when \"Use Custom Build\" is enabled."
-msgstr ""
-"\"Min SDK\" só pode ser substituído quando \"Usar Compilação Customizada\" "
-"está habilitado."
-
msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid."
msgstr ""
"\"Min SDK\" deve ser um número inteiro válido, mas obteve \"%s\" que é "
@@ -8438,12 +8388,6 @@ msgstr ""
"biblioteca Godot."
msgid ""
-"\"Target SDK\" can only be overridden when \"Use Custom Build\" is enabled."
-msgstr ""
-"\"Target SDK\" só pode ser substituído quando \"Usar Compilação "
-"Customizada\" está habilitado."
-
-msgid ""
"\"Target SDK\" should be a valid integer, but got \"%s\" which is invalid."
msgstr ""
"\"Target SDK\" deve ser um número inteiro válido, mas obteve \"%s\", que é "
@@ -8510,14 +8454,6 @@ msgid "Unsupported export format!"
msgstr "Formato de exportação não suportado!"
msgid ""
-"Trying to build from a custom built template, but no version info for it "
-"exists. Please reinstall from the 'Project' menu."
-msgstr ""
-"Tentando construir a partir de um modelo compilado personalizado, mas "
-"nenhuma informação de versão para ele existe. Por favor, reinstale pelo menu "
-"'Projeto'."
-
-msgid ""
"Android build version mismatch: Template installed: %s, Godot version: %s. "
"Please reinstall Android build template from 'Project' menu."
msgstr ""
diff --git a/editor/translations/editor/ro.po b/editor/translations/editor/ro.po
index 9ce1876a95..a39d4983a7 100644
--- a/editor/translations/editor/ro.po
+++ b/editor/translations/editor/ro.po
@@ -569,9 +569,6 @@ msgstr "Deconectați"
msgid "Connect a Signal to a Method"
msgstr "Conectați Semnal la o Metodă"
-msgid "Edit Connection:"
-msgstr "Modifică Conexiunea:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr "Ești sigur că vrei să ștergi toate conexiunile de la semnalul \"%s\"?"
@@ -662,18 +659,6 @@ msgstr "Apeluri"
msgid "Error:"
msgstr "Eroare:"
-msgid "C++ Error"
-msgstr "Eroare C++"
-
-msgid "C++ Error:"
-msgstr "Eroare C++:"
-
-msgid "Source:"
-msgstr "Sursă:"
-
-msgid "C++ Source:"
-msgstr "Sursă C++:"
-
msgid "Expand All"
msgstr "Extinde Toate"
@@ -1478,6 +1463,9 @@ msgstr "Redimensionați Array-ul"
msgid "Set Multiple:"
msgstr "Seteaza Multiple:"
+msgid "Edit Filters"
+msgstr "Editează Filtrele"
+
msgid "Clear Output"
msgstr "Curăță Afișarea"
@@ -2418,18 +2406,15 @@ msgstr "Mută punct nod"
msgid "Change BlendSpace1D Labels"
msgstr "Modifică etichetele BlendSpace1D"
-msgid "Triangle already exists."
-msgstr "Triunghiul există deja."
-
msgid "Blend:"
msgstr "Amestec:"
+msgid "Triangle already exists."
+msgstr "Triunghiul există deja."
+
msgid "Parameter Changed:"
msgstr "Parametru modificat:"
-msgid "Edit Filters"
-msgstr "Editează Filtrele"
-
msgid "Toggle Filter On/Off"
msgstr "Comutare filtru activat/dezactivat"
@@ -2487,9 +2472,6 @@ msgstr "Rulează animația selectată în sens invers de la poziția curentă. (
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "Rulează animația selectată în sens invers de la sfârșit. (Shift+A)"
-msgid "Stop animation playback. (S)"
-msgstr "Oprește rularea animației. (S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "Rulează animația selectată de la început. (Shift+D)"
diff --git a/editor/translations/editor/ru.po b/editor/translations/editor/ru.po
index 190146f1c8..ab221f26a4 100644
--- a/editor/translations/editor/ru.po
+++ b/editor/translations/editor/ru.po
@@ -9,7 +9,7 @@
# DimOkGamer <dimokgamer@gmail.com>, 2016-2017.
# Forest Swamp <sample1989@mail.ru>, 2018.
# Igor S <scorched@bk.ru>, 2017.
-# ijet <my-ijet@mail.ru>, 2017-2018, 2020.
+# ijet <my-ijet@mail.ru>, 2017-2018, 2020, 2023.
# Maxim Kim <habamax@gmail.com>, 2016.
# Maxim toby3d Lebedev <mail@toby3d.ru>, 2016.
# outbools <drag4e@yandex.ru>, 2017.
@@ -56,7 +56,7 @@
# КонÑтантин Рин <email.to.rean@gmail.com>, 2019, 2020.
# Maxim Samburskiy <alpacones@outlook.com>, 2019.
# Dima Koshel <form.eater@gmail.com>, 2019.
-# Danil Alexeev <danil@alexeev.xyz>, 2019, 2020, 2021, 2022.
+# Danil Alexeev <danil@alexeev.xyz>, 2019, 2020, 2021, 2022, 2023.
# Ravager <al.porkhunov@gmail.com>, 2019.
# ÐлекÑандр <akonn7@mail.ru>, 2019.
# Rei <clxgamer12@gmail.com>, 2019.
@@ -69,7 +69,7 @@
# TMF <themysticalfox@mail.ru>, 2020.
# Ivan Kuzmenko <kuzmenko.ivan2002@yandex.com>, 2020.
# Super Pracion <superpracion2@gmail.com>, 2020.
-# PizzArt <7o7goo7o7@gmail.com>, 2020.
+# PizzArt <7o7goo7o7@gmail.com>, 2020, 2023.
# TheGracekale <mrsmailbot.lg@gmail.com>, 2020, 2021.
# Климентий Титов <titoffklim@cclc.tech>, 2020.
# Richard Urban <redasuio1@gmail.com>, 2020.
@@ -124,16 +124,19 @@
# Gulpy <yak.aryslan.1999@gmail.com>, 2022.
# Sergey Karmanov <ppoocpel8888@gmail.com>, 2022.
# Дмитрий <Dimega@inbox.ru>, 2022.
-# Vladimir Kirillovskiy <vladimir.kirillovskiy@gmail.com>, 2022.
+# Vladimir Kirillovskiy <vladimir.kirillovskiy@gmail.com>, 2022, 2023.
# Evgeniy Khramov <thejenjagamertjg@gmail.com>, 2022.
-# kirill blaze <kirillblaze2@gmail.com>, 2022.
+# kirill blaze <kirillblaze2@gmail.com>, 2022, 2023.
+# Alexander Alexeev <dergluck@gmail.com>, 2023.
+# Playmore Dev <playmoredevelop@gmail.com>, 2023.
+# Ð’ÑчеÑлав Шароваров <frfnmtd272710@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: 2022-11-25 12:13+0000\n"
-"Last-Translator: Vladimir Kirillovskiy <vladimir.kirillovskiy@gmail.com>\n"
+"PO-Revision-Date: 2023-02-10 14:12+0000\n"
+"Last-Translator: Danil Alexeev <danil@alexeev.xyz>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/"
"godot/ru/>\n"
"Language: ru\n"
@@ -142,25 +145,145 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 4.15-dev\n"
+"X-Generator: Weblate 4.16-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 "Mouse Wheel Left"
+msgstr "КолёÑико мыши влево"
+
+msgid "Mouse Wheel Right"
+msgstr "КолеÑико мыши вправо"
+
+msgid "Mouse Thumb Button 1"
+msgstr "Кнопка большого пальца мыши 1"
+
+msgid "Mouse Thumb Button 2"
+msgstr "Кнопка большого пальца мыши 2"
+
msgid "Button"
msgstr "Кнопка"
+msgid "Double Click"
+msgstr "Двойной щелчок"
+
+msgid "Mouse motion at position (%s) with velocity (%s)"
+msgstr "Движение мыши в меÑтоположении (%s) Ñо ÑкороÑтью Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ (%s)"
+
+msgid "Left Stick X-Axis, Joystick 0 X-Axis"
+msgstr "Левый Ñтик по оÑи X, ДжойÑтик 0 по оÑи X"
+
+msgid "Left Stick Y-Axis, Joystick 0 Y-Axis"
+msgstr "Левый Ñтик по оÑи Y, ДжойÑтик 0 по оÑи Y"
+
+msgid "Right Stick X-Axis, Joystick 1 X-Axis"
+msgstr "Правый Ñтик по оÑи X, ДжойÑтик 1 по оÑи X"
+
+msgid "Right Stick Y-Axis, Joystick 1 Y-Axis"
+msgstr "Правый Ñтик по оÑи Y, ДжойÑтик 1 по оÑи Y"
+
+msgid "Joystick 2 X-Axis, Left Trigger, Sony L2, Xbox LT"
+msgstr "ДжойÑтик 2 по оÑи X, Левый триггер, Sony L2, Xbox LT"
+
+msgid "Joystick 2 Y-Axis, Right Trigger, Sony R2, Xbox RT"
+msgstr "ДжойÑтик 2 по оÑи Y, Правый триггер, Sony R2, Xbox RT"
+
+msgid "Joystick 3 X-Axis"
+msgstr "ДжойÑтик 3 по оÑи X"
+
+msgid "Joystick 3 Y-Axis"
+msgstr "ДжойÑтик 3 по оÑи Y"
+
+msgid "Joystick 4 X-Axis"
+msgstr "ДжойÑтик 4 по оÑи X"
+
+msgid "Joystick 4 Y-Axis"
+msgstr "ДжойÑтик 4 по оÑи Y"
+
+msgid "Unknown Joypad Axis"
+msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑÑŒ джойÑтика"
+
+msgid "Joypad Motion on Axis %d (%s) with Value %.2f"
+msgstr "Движение джойпада по оÑи %d (%s) Ñо значением %.2f"
+
+msgid "Bottom Action, Sony Cross, Xbox A, Nintendo B"
+msgstr "Ðижнее дейÑтвие, Sony Cross, Xbox A, Nintendo B"
+
+msgid "Right Action, Sony Circle, Xbox B, Nintendo A"
+msgstr "Правое дейÑтвие, Sony Circle, Xbox B, Nintendo A"
+
+msgid "Left Action, Sony Square, Xbox X, Nintendo Y"
+msgstr "Левое дейÑтвие, Sony Square, Xbox X, Nintendo Y"
+
+msgid "Top Action, Sony Triangle, Xbox Y, Nintendo X"
+msgstr "Верхнее дейÑтвие, Sony Triangle, Xbox Y, Nintendo X"
+
+msgid "D-pad Up"
+msgstr "D-pad Вверх"
+
+msgid "D-pad Down"
+msgstr "D-pad Вниз"
+
+msgid "D-pad Left"
+msgstr "D-pad Влево"
+
+msgid "D-pad Right"
+msgstr "D-pad Вправо"
+
+msgid "PS4/5 Touchpad"
+msgstr "PS4/5 Тачпад"
+
+msgid "touched"
+msgstr "коÑнулÑÑ"
+
+msgid "released"
+msgstr "отпуÑтил"
+
+msgid "MIDI Input on Channel=%s Message=%s"
+msgstr "MIDI Вход на канале=%s Сообщение=%s"
+
+msgid "Input Event with Shortcut=%s"
+msgstr "Событие ввода Ñ Shortcut=%s"
+
+msgid "Accept"
+msgstr "Подтвердить"
+
msgid "Select"
msgstr "Выделение"
msgid "Cancel"
msgstr "Отмена"
+msgid "Focus Next"
+msgstr "Следующий фокуÑ"
+
+msgid "Focus Prev"
+msgstr "Предыдущий фокуÑ"
+
msgid "Left"
-msgstr "Лево"
+msgstr "Влево"
msgid "Right"
-msgstr "Право"
+msgstr "Вправо"
msgid "Up"
msgstr "Вверх"
@@ -168,6 +291,15 @@ msgstr "Вверх"
msgid "Down"
msgstr "Вниз"
+msgid "Page Up"
+msgstr "Ðа Ñтраницу вверх"
+
+msgid "Page Down"
+msgstr "Ðа Ñтраницу вниз"
+
+msgid "Home"
+msgstr "Домой"
+
msgid "End"
msgstr "Конец"
@@ -186,15 +318,66 @@ msgstr "Отменить"
msgid "Redo"
msgstr "Повторить"
+msgid "New Line"
+msgstr "ÐÐ¾Ð²Ð°Ñ Ñтрока"
+
+msgid "New Blank Line"
+msgstr "ÐÐ¾Ð²Ð°Ñ Ð¿ÑƒÑÑ‚Ð°Ñ Ñтрока"
+
+msgid "New Line Above"
+msgstr "ÐÐ¾Ð²Ð°Ñ Ñтрока выше"
+
msgid "Indent"
msgstr "ОтÑтуп"
+msgid "Dedent"
+msgstr "Ð’Ñ‹Ñтуп"
+
+msgid "Backspace"
+msgstr "Стереть"
+
+msgid "Backspace Word"
+msgstr "Стереть Ñлово"
+
+msgid "Backspace all to Left"
+msgstr "Стереть вÑÑ‘ Ñлева"
+
msgid "Delete"
msgstr "Удалить"
+msgid "Delete Word"
+msgstr "Удалить Ñлово"
+
+msgid "Delete all to Right"
+msgstr "Удалить вÑÑ‘ Ñправа"
+
+msgid "Caret Left"
+msgstr "КурÑор влево"
+
+msgid "Caret Word Left"
+msgstr "КурÑор влево на Ñлово"
+
+msgid "Caret Right"
+msgstr "КурÑор вправо"
+
+msgid "Caret Word Right"
+msgstr "КурÑор вправо на Ñлово"
+
+msgid "Scroll Up"
+msgstr "Прокрутка вверх"
+
+msgid "Scroll Down"
+msgstr "Прокрутка вниз"
+
msgid "Select All"
msgstr "Выделить вÑÑ‘"
+msgid "Select Word Under Caret"
+msgstr "Выделить Ñлово под курÑором"
+
+msgid "Toggle Insert Mode"
+msgstr "Переключить режим вÑтавки"
+
msgid "Duplicate Nodes"
msgstr "Дублировать узлы"
@@ -204,6 +387,9 @@ msgstr "Удалить узлы"
msgid "Refresh"
msgstr "Обновить"
+msgid "Show Hidden"
+msgstr "Показывать Ñкрытые"
+
msgid "Invalid input %d (not passed) in expression"
msgstr "Ðекорректный ввод %d (не подходит) в выражении"
@@ -226,6 +412,12 @@ msgstr "ÐедопуÑтимые аргументы Ð´Ð»Ñ Ð¿Ð¾ÑтроениÑ
msgid "On call to '%s':"
msgstr "При вызове «%s»:"
+msgid "Built-in script"
+msgstr "Ð’Ñтроенный Ñкрипт"
+
+msgid "Built-in"
+msgstr "Ð’Ñтроенный"
+
msgid "B"
msgstr "Б"
@@ -247,6 +439,15 @@ msgstr "ПиБ"
msgid "EiB"
msgstr "ЭиБ"
+msgid "Example: %s"
+msgstr "Пример: %s"
+
+msgid "%d item"
+msgid_plural "%d items"
+msgstr[0] "%d Ñлемент"
+msgstr[1] "%d Ñлемента"
+msgstr[2] "%d Ñлементов"
+
msgid ""
"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'"
@@ -260,9 +461,30 @@ msgstr "ДейÑтвие Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ «%s» уже ÑущеÑтвует."
msgid "Add Event"
msgstr "Добавить Ñобытие"
+msgid "Remove Action"
+msgstr "Удалить Ñобытие"
+
+msgid "Cannot Remove Action"
+msgstr "ÐÐµÐ»ÑŒÐ·Ñ Ð£Ð´Ð°Ð»Ð¸Ñ‚ÑŒ ДейÑтвие"
+
+msgid "Edit Event"
+msgstr "Изменить Ñобытие"
+
+msgid "Remove Event"
+msgstr "Удалить Ñобытие"
+
+msgid "Filter by name..."
+msgstr "Фильтр по имени..."
+
+msgid "Clear All"
+msgstr "ОчиÑтить"
+
msgid "Add"
msgstr "Добавить"
+msgid "Show Built-in Actions"
+msgstr "Показать вÑтроенные дейÑтвиÑ"
+
msgid "Action"
msgstr "ДейÑтвие"
@@ -275,6 +497,9 @@ msgstr "ВремÑ:"
msgid "Value:"
msgstr "Значение:"
+msgid "Update Selected Key Handles"
+msgstr "Обновить ручки выделенных ключей"
+
msgid "Insert Key Here"
msgstr "Ð’Ñтавить ключ здеÑÑŒ"
@@ -293,6 +518,18 @@ msgstr "Передвинуть точки Безье"
msgid "Focus"
msgstr "ФокуÑ"
+msgid "Select All Keys"
+msgstr "Выделить вÑе ключи"
+
+msgid "Deselect All Keys"
+msgstr "СнÑÑ‚ÑŒ выделение Ñ ÐºÐ»ÑŽÑ‡ÐµÐ¹"
+
+msgid "Animation Change %s"
+msgstr "ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ %s"
+
+msgid "Animation Change Keyframe Value"
+msgstr "Изменить значение ключевого кадра"
+
msgid "Change Animation Length"
msgstr "Изменить длину анимации"
@@ -440,6 +677,12 @@ msgstr "Изменить режим цикла анимации"
msgid "Remove Anim Track"
msgstr "Удалить дорожку"
+msgid "Create new track for %s and insert key?"
+msgstr "Создать новый трек Ð´Ð»Ñ %s и вÑтавить ключ?"
+
+msgid "Create %d new tracks and insert keys?"
+msgstr "Создать %d новые треки и вÑтавить ключи?"
+
msgid "Create"
msgstr "Создать"
@@ -586,6 +829,9 @@ msgstr "Перейти к предыдущему шагу"
msgid "Apply Reset"
msgstr "Применить ÑброÑ"
+msgid "Bake Animation"
+msgstr "Запечь анимацию"
+
msgid "Use Bezier Curves"
msgstr "ИÑпользовать кривые Безье"
@@ -643,6 +889,18 @@ msgstr "Ðомер Ñтроки:"
msgid "%d replaced."
msgstr "%d заменено."
+msgid "%d match"
+msgid_plural "%d matches"
+msgstr[0] "%d Ñовпадает"
+msgstr[1] "%d Ñовпадают"
+msgstr[2] "%d Ñовпадают"
+
+msgid "%d of %d match"
+msgid_plural "%d of %d matches"
+msgstr[0] "%d из %d ÑовпадениÑ"
+msgstr[1] "%d из %d Ñовпадений"
+msgstr[2] "%d из %d Ñовпадений"
+
msgid "Match Case"
msgstr "Учитывать региÑÑ‚Ñ€"
@@ -701,9 +959,15 @@ msgstr "ПриÑоединить к Ñкрипту:"
msgid "From Signal:"
msgstr "От Ñигнала:"
+msgid "Filter Nodes"
+msgstr "Фильтр узлов"
+
msgid "Scene does not contain any script."
msgstr "Сцена не Ñодержит каких-либо Ñкриптов."
+msgid "Select Method"
+msgstr "Выбрать метод"
+
msgid "Remove"
msgstr "Удалить"
@@ -713,6 +977,12 @@ msgstr "Добавить дополнительный аргумент вызоÐ
msgid "Extra Call Arguments:"
msgstr "Дополнительные параметры вызова:"
+msgid "Allows to drop arguments sent by signal emitter."
+msgstr "Разрешить отбраÑывать аргументы, отправленные Ñмиттером."
+
+msgid "Unbind Signal Arguments:"
+msgstr "Отключить аргументы Ñигнала:"
+
msgid "Receiver Method:"
msgstr "Метод-приёмник:"
@@ -746,6 +1016,9 @@ msgstr "ПриÑоединить"
msgid "Signal:"
msgstr "Сигнал:"
+msgid "No description."
+msgstr "Ðет опиÑаниÑ."
+
msgid "Connect '%s' to '%s'"
msgstr "ПриÑоединить «%s» к «%s»"
@@ -764,15 +1037,15 @@ msgstr "ОтÑоединить"
msgid "Connect a Signal to a Method"
msgstr "ПриÑоединить Ñигнал к методу"
-msgid "Edit Connection:"
-msgstr "Редактировать Ñоединение:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr "Ð’Ñ‹ уверены, что хотите удалить вÑе ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¾Ñ‚ Ñигнала «%s»?"
msgid "Signals"
msgstr "Сигналы"
+msgid "Filter Signals"
+msgstr "Фильтр Ñигналов"
+
msgid "Are you sure you want to remove all connections from this signal?"
msgstr "Ð’Ñ‹ уверены, что хотите удалить вÑе ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¾Ñ‚ Ñтого Ñигнала?"
@@ -794,6 +1067,12 @@ msgstr "Создать %s"
msgid "No results for \"%s\"."
msgstr "Ðет результатов Ð´Ð»Ñ Â«%s»."
+msgid "This class is marked as deprecated."
+msgstr "Этот клаÑÑ Ð¿Ð¾Ð¼ÐµÑ‡ÐµÐ½ как уÑтаревший."
+
+msgid "This class is marked as experimental."
+msgstr "Этот клаÑÑ Ð¿Ð¾Ð¼ÐµÑ‡ÐµÐ½ как ÑкÑпериментальный."
+
msgid "No description available for %s."
msgstr "Ðет опиÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Â«%s»."
@@ -803,6 +1082,9 @@ msgstr "Избранное:"
msgid "Recent:"
msgstr "Ðедавнее:"
+msgid "(Un)favorite selected item."
+msgstr "Добавить/убрать выделенные в избранное."
+
msgid "Search:"
msgstr "ПоиÑк:"
@@ -830,9 +1112,21 @@ msgstr "Копировать путь узла"
msgid "Instance:"
msgstr "ЭкземплÑÑ€:"
+msgid ""
+"This node has been instantiated from a PackedScene file:\n"
+"%s\n"
+"Click to open the original file in the Editor."
+msgstr ""
+"Этот узел был Ñоздан из файла PackedScene:\n"
+"%s\n"
+"Ðажмите, чтобы открыть иÑходный файл в редакторе."
+
msgid "Toggle Visibility"
msgstr "Переключить видимоÑÑ‚ÑŒ"
+msgid "ms"
+msgstr "мÑ"
+
msgid "Monitors"
msgstr "Мониторинг"
@@ -912,26 +1206,32 @@ msgstr "Предупреждение:"
msgid "Error:"
msgstr "Ошибка:"
-msgid "C++ Error"
-msgstr "Ошибка C++"
+msgid "%s Error"
+msgstr "Ошибка %s"
-msgid "C++ Error:"
-msgstr "Ошибка C++:"
+msgid "Stack Trace"
+msgstr "ТраÑÑировка Ñтека"
-msgid "Source"
-msgstr "ИÑточник"
+msgid "Stack Trace:"
+msgstr "ТраÑÑировка Ñтека:"
-msgid "C++ Source"
-msgstr "ИÑходный код C++"
+msgid "Debug session started."
+msgstr "Ðачало ÑеанÑа отладки."
-msgid "Source:"
-msgstr "ИÑходный код:"
+msgid "Debug session closed."
+msgstr "Конец ÑеанÑа отладки."
-msgid "C++ Source:"
-msgstr "ИÑходный код C++:"
+msgid "Line %d"
+msgstr "Строка %d"
-msgid "Stack Trace"
-msgstr "ТраÑÑировка Ñтека"
+msgid "Delete Breakpoint"
+msgstr "Удалить точку оÑтанова"
+
+msgid "Delete All Breakpoints in:"
+msgstr "Удалить вÑе точки оÑтанова в:"
+
+msgid "Delete All Breakpoints"
+msgstr "Удалить вÑе точки оÑтанова"
msgid "Copy Error"
msgstr "Копировать ошибку"
@@ -939,6 +1239,9 @@ msgstr "Копировать ошибку"
msgid "Open C++ Source on GitHub"
msgstr "Открытый иÑходный код C++ на GitHub"
+msgid "C++ Source"
+msgstr "ИÑходный код C++"
+
msgid "Video RAM"
msgstr "ВидеопамÑÑ‚ÑŒ"
@@ -1239,7 +1542,7 @@ msgid "Rename Audio Bus"
msgstr "Переименовать аудио шину"
msgid "Change Audio Bus Volume"
-msgstr "Изменить громкоÑÑ‚ÑŒ звуковой шины"
+msgstr "Изменить громкоÑÑ‚ÑŒ шины"
msgid "Toggle Audio Bus Solo"
msgstr "Переключить аудио шину - Ñоло"
@@ -1388,6 +1691,9 @@ msgstr "Включить"
msgid "Rearrange Autoloads"
msgstr "ПереÑтановка автозагрузок"
+msgid "Can't add Autoload:"
+msgstr "Ðе удаётÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ автозагрузку:"
+
msgid "%s is an invalid path. File does not exist."
msgstr "Ðеверный путь «%s». Файл не ÑущеÑтвует."
@@ -1415,6 +1721,28 @@ msgstr "ÐавигациÑ"
msgid "OpenGL"
msgstr "OpenGL"
+msgid "Vulkan"
+msgstr "Vulkan"
+
+msgid "TTF, OTF, Type 1, WOFF1 Fonts"
+msgstr "Шрифты TTF, OTF, Type 1, WOFF1"
+
+msgid "WOFF2 Fonts"
+msgstr "Шрифты WOFF2"
+
+msgid "Navigation, both 2D and 3D."
+msgstr "ÐÐ°Ð²Ð¸Ð³Ð°Ñ†Ð¸Ñ (2D и 3D)."
+
+msgid ""
+"TrueType, OpenType, Type 1, and WOFF1 font format support using FreeType "
+"library (if disabled, WOFF2 support is also disabled)."
+msgstr ""
+"Поддержка форматов шрифтов TrueType, OpenType, Type 1 и WOFF1 иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ "
+"библиотеку FreeType (еÑли отключено, поддержка WOFF2 тоже будет отключена)."
+
+msgid "File saving failed."
+msgstr "Ðе удалоÑÑŒ Ñохранить файл."
+
msgid "Nodes and Classes:"
msgstr "Узлы и клаÑÑÑ‹:"
@@ -1430,12 +1758,21 @@ msgstr "Ðовый"
msgid "Save"
msgstr "Сохранить"
+msgid "Profile:"
+msgstr "Профиль:"
+
msgid "Reset to Defaults"
msgstr "СброÑить наÑтройки"
+msgid "Please Confirm:"
+msgstr "Подтвердите:"
+
msgid "Export Profile"
msgstr "ЭкÑпортировать профиль"
+msgid "Edit Build Configuration Profile"
+msgstr "Изменить профиль конфигурации Ñборки"
+
msgid "Paste Params"
msgstr "Ð’Ñтавить параметры"
@@ -1523,6 +1860,9 @@ msgstr ""
"ПозволÑет наÑтраивать параметры импорта Ð´Ð»Ñ Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ñ‹Ñ… реÑурÑов. Ð”Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ "
"требуетÑÑ Ð¿Ð°Ð½ÐµÐ»ÑŒ Â«Ð¤Ð°Ð¹Ð»Ð¾Ð²Ð°Ñ ÑиÑтема»."
+msgid "Provides an overview of the editor's and each scene's undo history."
+msgstr "ПредоÑтавлÑет обзор иÑтории отмены дейÑтвий редактора и каждой Ñцены."
+
msgid "(current)"
msgstr "(текущий)"
@@ -1741,6 +2081,55 @@ msgstr ""
msgid "(Re)Importing Assets"
msgstr "(Ре)Импортировать"
+msgid "Import resources of type: %s"
+msgstr "Импорт реÑурÑов типа: %s"
+
+msgid "No return value."
+msgstr "Возвращаемое значение отÑутÑтвует."
+
+msgid "Deprecated"
+msgstr "УÑтаревший"
+
+msgid "Experimental"
+msgstr "ЭкÑпериментальный"
+
+msgid "This method supports a variable number of arguments."
+msgstr "Данный метод поддерживает переменное количеÑтво аргументов."
+
+msgid ""
+"This method is called by the engine.\n"
+"It can be overridden to customize built-in behavior."
+msgstr ""
+"Данный метод вызываетÑÑ Ð´Ð²Ð¸Ð¶ÐºÐ¾Ð¼.\n"
+"Его можно переопределить, чтобы изменить поведение по умолчанию."
+
+msgid ""
+"This method has no side effects.\n"
+"It does not modify the object in any way."
+msgstr ""
+"Данный метод не имеет побочных Ñффектов.\n"
+"Он никоим образом не изменÑет объект."
+
+msgid ""
+"This method does not need an instance to be called.\n"
+"It can be called directly using the class name."
+msgstr ""
+"Ð”Ð»Ñ Ð²Ñ‹Ð·Ð¾Ð²Ð° данного метода не требуетÑÑ ÑкземплÑÑ€.\n"
+"Его можно вызвать напрÑмую, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¸Ð¼Ñ ÐºÐ»Ð°ÑÑа."
+
+msgid "Error codes returned:"
+msgstr "Возвращённые коды ошибок:"
+
+msgid "There is currently no description for this %s."
+msgstr "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¿Ð¸Ñание Ñтого %s отÑутÑтвует."
+
+msgid ""
+"There is currently no description for this %s. Please help us by "
+"[color=$color][url=$url]contributing one[/url][/color]!"
+msgstr ""
+"Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¿Ð¸Ñание Ñтого %s отÑутÑтвует. ПожалуйÑта помогите нам, "
+"[color=$color][url=$url]внеÑите Ñвой вклад[/url][/color]!"
+
msgid "Top"
msgstr "Верх"
@@ -1753,11 +2142,33 @@ msgstr "ÐаÑледует:"
msgid "Inherited by:"
msgstr "УнаÑледован:"
+msgid ""
+"This class is marked as deprecated. It will be removed in future versions."
+msgstr ""
+"Данный клаÑÑ Ð¿Ð¾Ð¼ÐµÑ‡ÐµÐ½ как уÑтаревший. Он будет удалён в будущих верÑиÑÑ…."
+
+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 ""
+"Данный клаÑÑ Ð¿Ð¾Ð¼ÐµÑ‡ÐµÐ½ как ÑкÑпериментальный. Он может быть изменён или удалён "
+"в будущих верÑиÑÑ…. ИÑпользуйте по Ñвоему уÑмотрению."
+
msgid "Description"
msgstr "ОпиÑание"
+msgid "There is currently no description for this class."
+msgstr "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¿Ð¸Ñание Ñтого клаÑÑа отÑутÑтвует."
+
+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 "СвойÑтва"
@@ -1766,7 +2177,16 @@ msgid "overrides %s:"
msgstr "переопределÑет %s:"
msgid "default:"
-msgstr "По умолчанию:"
+msgstr "по умолчанию:"
+
+msgid "property:"
+msgstr "ÑвойÑтво:"
+
+msgid "Constructors"
+msgstr "КонÑтрукторы"
+
+msgid "Operators"
+msgstr "Операторы"
msgid "Theme Properties"
msgstr "СвойÑтва темы"
@@ -1780,6 +2200,9 @@ msgstr "КонÑтанты"
msgid "Fonts"
msgstr "Шрифты"
+msgid "Font Sizes"
+msgstr "Размеры шрифта"
+
msgid "Icons"
msgstr "Иконки"
@@ -1789,22 +2212,44 @@ msgstr "Стили"
msgid "Enumerations"
msgstr "ПеречиÑлениÑ"
+msgid "Annotations"
+msgstr "Ðннотации"
+
+msgid "There is currently no description for this annotation."
+msgstr "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¿Ð¸Ñание Ñтой аннотации отÑутÑтвует."
+
+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"
msgstr "ОпиÑÐ°Ð½Ð¸Ñ ÑвойÑтв"
msgid "(value)"
msgstr "(значение)"
+msgid "There is currently no description for this property."
+msgstr "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¿Ð¸Ñание Ñтого ÑвойÑтва отÑутÑтвует."
+
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]!"
+"Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¿Ð¸Ñание Ñтого ÑвойÑтва отÑутÑтвует. ПожалуйÑта помогите "
+"нам, [color=$color][url=$url]внеÑите Ñвой вклад[/url][/color]!"
+
+msgid "Constructor Descriptions"
+msgstr "ОпиÑÐ°Ð½Ð¸Ñ ÐºÐ¾Ð½Ñтрукторов"
msgid "Method Descriptions"
msgstr "ОпиÑÐ°Ð½Ð¸Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð¾Ð²"
+msgid "Operator Descriptions"
+msgstr "ОпиÑÐ°Ð½Ð¸Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð²"
+
msgid "%d match."
msgstr "%d Ñовпадение."
@@ -1826,12 +2271,21 @@ msgstr "Отображать вÑÑ‘"
msgid "Classes Only"
msgstr "Только клаÑÑÑ‹"
+msgid "Constructors Only"
+msgstr "Только конÑтрукторы"
+
msgid "Methods Only"
msgstr "Только методы"
+msgid "Operators Only"
+msgstr "Только операторы"
+
msgid "Signals Only"
msgstr "Только Ñигналы"
+msgid "Annotations Only"
+msgstr "Только аннотации"
+
msgid "Constants Only"
msgstr "Только конÑтанты"
@@ -1844,6 +2298,9 @@ msgstr "Только ÑвойÑтва темы"
msgid "Member Type"
msgstr "Тип члена"
+msgid "(constructors)"
+msgstr "(конÑтрукторы)"
+
msgid "Class"
msgstr "КлаÑÑ"
@@ -1853,6 +2310,9 @@ msgstr "Метод"
msgid "Signal"
msgstr "Сигнал"
+msgid "Annotation"
+msgstr "ÐннотациÑ"
+
msgid "Constant"
msgstr "КонÑтанта"
@@ -1862,9 +2322,22 @@ msgstr "Параметр"
msgid "Theme Property"
msgstr "СвойÑтво темы"
+msgid "This member is marked as deprecated."
+msgstr "Этот член клаÑÑа помечен как уÑтаревший."
+
+msgid "This member is marked as experimental."
+msgstr "Этот член клаÑÑа помечен как ÑкÑпериментальный."
+
msgid "Property:"
msgstr "Параметр:"
+msgid "Pin Value"
+msgstr "Закрепить значение"
+
+msgid "Pin Value [Disabled because '%s' is editor-only]"
+msgstr ""
+"Закрепить значение [Отключено, так как «%s» доÑтупно только Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¾Ñ€Ð°]"
+
msgid ""
"Pinning a value forces it to be saved even if it's equal to the default."
msgstr ""
@@ -1874,32 +2347,105 @@ msgstr ""
msgid "Open Documentation"
msgstr "Открыть документацию"
+msgid "Element %d: %s%d*"
+msgstr "Элемент %d: %s%d*"
+
msgid "Move Up"
msgstr "ПеремеÑтить вверх"
msgid "Move Down"
msgstr "ПеремеÑтить вниз"
+msgid "Insert New Before"
+msgstr "Ð’Ñтавить новый до"
+
+msgid "Insert New After"
+msgstr "Ð’Ñтавить новый поÑле"
+
+msgid "Clear Array"
+msgstr "ОчиÑтить маÑÑив"
+
+msgid "Resize Array..."
+msgstr "Изменить размер маÑÑива..."
+
+msgid "Add Element"
+msgstr "Добавить Ñлемент"
+
msgid "Resize Array"
msgstr "Изменить размер маÑÑива"
+msgid "New Size:"
+msgstr "Ðовый размер:"
+
+msgid "Element %s"
+msgstr "Элемент %s"
+
+msgid "Add Metadata"
+msgstr "Добавить метаданные"
+
msgid "Set %s"
msgstr "Задать %s"
msgid "Set Multiple:"
msgstr "Задать неÑколько:"
+msgid "Remove metadata %s"
+msgstr "Удалить метаданные %s"
+
msgid "Pinned %s"
msgstr "Закреплено %s"
msgid "Unpinned %s"
msgstr "Откреплено %s"
+msgid "Add metadata %s"
+msgstr "Добавить метаданные %s"
+
+msgid "Metadata name can't be empty."
+msgstr "Ð˜Ð¼Ñ Ð¼ÐµÑ‚Ð°Ð´Ð°Ð½Ð½Ñ‹Ñ… не может быть пуÑтым."
+
+msgid "Metadata name must be a valid identifier."
+msgstr "Ð˜Ð¼Ñ Ð¼ÐµÑ‚Ð°Ð´Ð°Ð½Ð½Ñ‹Ñ… должно быть допуÑтимым идентификатором."
+
+msgid "Metadata with name \"%s\" already exists."
+msgstr "Метаданные Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ «%s» уже ÑущеÑтвуют."
+
+msgid "Names starting with _ are reserved for editor-only metadata."
+msgstr ""
+"Имена, начинающиеÑÑ Ñ _, зарезервированы только Ð´Ð»Ñ Ð¼ÐµÑ‚Ð°Ð´Ð°Ð½Ð½Ñ‹Ñ… редактора."
+
+msgid "Metadata name is valid."
+msgstr "Ð˜Ð¼Ñ Ð¼ÐµÑ‚Ð°Ð´Ð°Ð½Ð½Ñ‹Ñ… ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым."
+
+msgid "Add Metadata Property for \"%s\""
+msgstr "Добавить ÑвойÑтво метаданных Ð´Ð»Ñ Â«%s»"
+
+msgid "Copy Value"
+msgstr "Копировать значение"
+
+msgid "Paste Value"
+msgstr "Ð’Ñтавить значение"
+
msgid "Copy Property Path"
-msgstr "Копировать путь к ÑвойÑтву"
+msgstr "Копировать путь ÑвойÑтва"
+
+msgid "Select existing layout:"
+msgstr "Выберите ÑущеÑтвующий макет:"
+
+msgid "Changed Locale Language Filter"
+msgstr "Изменён фильтр локали по Ñзыкам"
+
+msgid "Changed Locale Script Filter"
+msgstr "Изменён фильтр локали по пиÑьменноÑÑ‚Ñм"
+
+msgid "Changed Locale Country Filter"
+msgstr "Изменён фильтр локали по Ñтранам"
msgid "Changed Locale Filter Mode"
-msgstr "Изменен режим фильтрации Ñзыков"
+msgstr "Изменён режим фильтра локали"
+
+msgid "Select a Locale"
+msgstr "Выбрать локаль"
msgid "Show All Locales"
msgstr "Показать вÑе локали"
@@ -1907,11 +2453,26 @@ msgstr "Показать вÑе локали"
msgid "Show Selected Locales Only"
msgstr "Показать только выбранные локали"
+msgid "Edit Filters"
+msgstr "Редактировать фильтры"
+
msgid "Language:"
msgstr "Язык:"
-msgid "Script"
-msgstr "Скрипт"
+msgid "Country:"
+msgstr "Страна:"
+
+msgid "Language"
+msgstr "Язык"
+
+msgid "Country"
+msgstr "Страна"
+
+msgid "Variant"
+msgstr "Вариант"
+
+msgid "Filter Messages"
+msgstr "Фильтр Ñообщений"
msgid "Clear Output"
msgstr "ОчиÑтить вывод"
@@ -1919,6 +2480,24 @@ msgstr "ОчиÑтить вывод"
msgid "Copy Selection"
msgstr "Копировать выделенное"
+msgid ""
+"Collapse duplicate messages into one log entry. Shows number of occurrences."
+msgstr ""
+"Свернуть повторÑющиеÑÑ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² одну запиÑÑŒ журнала. КоличеÑтво "
+"повторений отображаетÑÑ."
+
+msgid "Toggle visibility of standard output messages."
+msgstr "Переключить видимоÑÑ‚ÑŒ Ñтандартных Ñообщений вывода."
+
+msgid "Toggle visibility of errors."
+msgstr "Переключить видимоÑÑ‚ÑŒ ошибок."
+
+msgid "Toggle visibility of warnings."
+msgstr "Переключить видимоÑÑ‚ÑŒ предупреждений."
+
+msgid "Toggle visibility of editor messages."
+msgstr "Переключить видимоÑÑ‚ÑŒ Ñообщений редактора."
+
msgid "New Window"
msgstr "Ðовое окно"
@@ -1965,6 +2544,9 @@ msgstr "ÐеизвеÑтный формат запрашиваемого файÐ
msgid "Error while saving."
msgstr "Ошибка при Ñохранении."
+msgid "Scene file '%s' appears to be invalid/corrupt."
+msgstr "Файл Ñцены «%s» ÑвлÑетÑÑ Ð½ÐµÐ´ÐµÐ¹Ñтвительным/повреждённым."
+
msgid "Saving Scene"
msgstr "Сохранение Ñцены"
@@ -2021,6 +2603,10 @@ msgstr "Ðазвание макета не найдено!"
msgid "Restored the Default layout to its base settings."
msgstr "Макет по умолчанию воÑÑтановлен к его базовым наÑтройкам."
+msgid "This object is marked as read-only, so it's not editable."
+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 "
@@ -2041,18 +2627,44 @@ msgstr ""
msgid "Changes may be lost!"
msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ быть потерÑны!"
+msgid "This object is read-only."
+msgstr "Этот объект доÑтупен только Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ."
+
+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 ""
+"Режим Movie Maker включён, но путь к видеофайлу не указан.\n"
+"Путь к видеофайлу по умолчанию можно указать в наÑтройках проекта в "
+"категории Editor > Movie Writer.\n"
+"Ð’ качеÑтве альтернативы, Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка отдельных Ñцен в корневой узел можно "
+"добавить метаданные `movie_file` типа String,\n"
+"указывающие пути к видеофайлу, который будет иÑпользоватьÑÑ Ð¿Ñ€Ð¸ запиÑи Ñтой "
+"Ñцены."
+
msgid "There is no defined scene to run."
msgstr "Ðет открытой Ñцены Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка."
msgid "Save scene before running..."
msgstr "Сохранение Ñцены перед запуÑком..."
+msgid "Reload the played scene."
+msgstr "ПерезапуÑтить воÑпроизводимую Ñцену."
+
msgid "Play the project."
msgstr "ЗапуÑтить проект."
msgid "Play the edited scene."
msgstr "ЗапуÑтить текущую Ñцену."
+msgid "Play a custom scene."
+msgstr "ЗапуÑтить произвольную Ñцену."
+
msgid "Open Base Scene"
msgstr "Открыть оÑновную Ñцену"
@@ -2107,12 +2719,18 @@ msgstr "Ðевозможно отменить пока кнопки мыши нÐ
msgid "Nothing to undo."
msgstr "Ðечего отменить."
+msgid "Remote Undo: %s"
+msgstr "Отменить удалённо: %s"
+
msgid "Can't redo while mouse buttons are pressed."
msgstr "Ðевозможно повторить пока кнопки мыши нажаты."
msgid "Nothing to redo."
msgstr "Ðечего повторить."
+msgid "Remote Redo: %s"
+msgstr "Повторить удалённо: %s"
+
msgid "Can't reload a scene that was never saved."
msgstr "Ðе возможно загрузить Ñцену, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð½Ðµ была Ñохранена."
@@ -2340,6 +2958,9 @@ msgstr "Проект"
msgid "Project Settings..."
msgstr "ÐаÑтройки проекта..."
+msgid "Project Settings"
+msgstr "ÐаÑтройки проекта"
+
msgid "Version Control"
msgstr "Контроль верÑий"
@@ -2370,6 +2991,9 @@ msgstr "Редактор"
msgid "Editor Settings..."
msgstr "ÐаÑтройки редактора..."
+msgid "Command Palette..."
+msgstr "Палитра команд..."
+
msgid "Editor Layout"
msgstr "Макет редактора"
@@ -2424,15 +3048,66 @@ msgstr "О Godot"
msgid "Support Godot Development"
msgstr "Поддержать разработку Godot"
+msgid "Run the project's default scene."
+msgstr "ЗапуÑтить Ñцену проекта по умолчанию."
+
msgid "Run Project"
msgstr "ЗапуÑтить проект"
+msgid "Pause the running project's execution for debugging."
+msgstr "ПриоÑтановить выполнение запущенного проекта Ð´Ð»Ñ Ð¾Ñ‚Ð»Ð°Ð´ÐºÐ¸."
+
+msgid "Pause Running Project"
+msgstr "ПриоÑтановить запущенный проект"
+
+msgid "Stop the currently running project."
+msgstr "ОÑтановить текущий запущенный проект."
+
+msgid "Stop Running Project"
+msgstr "ОÑтановить запущенный проект"
+
+msgid "Run the currently edited scene."
+msgstr "ЗапуÑтить текущую редактируемую Ñцену."
+
+msgid "Run Current Scene"
+msgstr "ЗапуÑтить текущую Ñцену"
+
+msgid "Run a specific scene."
+msgstr "ЗапуÑтить конкретную Ñцену."
+
+msgid "Run Specific Scene"
+msgstr "ЗапуÑтить конкретную Ñцену"
+
+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 ""
+"Включить режим Movie Maker.\n"
+"Проект будет запущен Ñо Ñтабильным FPS, а изображение и звук будут запиÑаны "
+"в видеофайл."
+
+msgid "Choose a renderer."
+msgstr "Выберите отриÑовщик."
+
+msgid "Forward+"
+msgstr "Forward+"
+
+msgid "Mobile"
+msgstr "Мобильные уÑтройÑтва"
+
msgid "Compatibility"
msgstr "СовмеÑтимоÑÑ‚ÑŒ"
+msgid "Changing the renderer requires restarting the editor."
+msgstr "Изменение отриÑовщика требует перезапуÑка редактора."
+
msgid "Update Continuously"
msgstr "Ðепрерывное обновление"
+msgid "Update When Changed"
+msgstr "ОбновлÑÑ‚ÑŒ при изменениÑÑ…"
+
msgid "Hide Update Spinner"
msgstr "Скрыть индикатор обновлений"
@@ -2466,24 +3141,6 @@ msgid "Install from file"
msgstr "УÑтановить из файла"
msgid ""
-"This will set up your project for custom Android builds by installing the "
-"source template to \"res://android/build\".\n"
-"You can then apply modifications and build your own custom APK on export "
-"(adding modules, changing the AndroidManifest.xml, etc.).\n"
-"Note that in order to make custom builds instead of using pre-built APKs, "
-"the \"Use Custom Build\" option should be enabled in the Android export "
-"preset."
-msgstr ""
-"Это наÑтроит ваш проект Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑких Ñборок Android путём уÑтановки "
-"иÑходного шаблона в «res://android/build».\n"
-"Затем вы можете модифицировать его (добавить модули, изменить "
-"AndroidManifest.xml и Ñ‚. д.) и Ñоздать Ñвой ÑобÑтвенный пользовательÑкий APK "
-"Ð´Ð»Ñ ÑкÑпорта.\n"
-"Обратите внимание, что Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑких Ñборок вмеÑто "
-"иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð³Ð¾Ñ‚Ð¾Ð²Ñ‹Ñ… APK-файлов при ÑкÑпорте на Android должна быть "
-"включена Ð¾Ð¿Ñ†Ð¸Ñ Â«Ð˜Ñпользовать пользовательÑкую Ñборку»."
-
-msgid ""
"The Android build template is already installed in this project and it won't "
"be overwritten.\n"
"Remove the \"res://android/build\" directory manually before attempting this "
@@ -2551,6 +3208,9 @@ msgstr "Открыть Ñледующий редактор"
msgid "Open the previous Editor"
msgstr "Открыть предыдущий редактор"
+msgid "Ok"
+msgstr "Ok"
+
msgid "Warning!"
msgstr "Предупреждение!"
@@ -2608,6 +3268,9 @@ msgstr "УÑтанавливать.."
msgid "Invalid RID"
msgstr "Ðеверный RID"
+msgid "Recursion detected, unable to assign resource to property."
+msgstr "Обнаружена рекурÑиÑ, невозможно назначить реÑÑƒÑ€Ñ ÑвойÑтву."
+
msgid ""
"Can't create a ViewportTexture on resources saved as a file.\n"
"Resource needs to belong to a scene."
@@ -2632,12 +3295,21 @@ msgstr "Выберите Viewport"
msgid "Selected node is not a Viewport!"
msgstr "Выбранный узел не Viewport!"
+msgid "(Nil) %s"
+msgstr "(Nil) %s"
+
+msgid "%s (size %s)"
+msgstr "%s (размер %s)"
+
msgid "Size:"
msgstr "Размер:"
msgid "Remove Item"
msgstr "Удалить Ñлемент"
+msgid "Dictionary (size %d)"
+msgstr "Словарь (размер %d)"
+
msgid "New Key:"
msgstr "Ðовый ключ:"
@@ -2672,6 +3344,9 @@ msgstr "Ðовый Ñкрипт"
msgid "Extend Script"
msgstr "РаÑширить Ñкрипт"
+msgid "No Remote Debug export presets configured."
+msgstr "Ðет наÑтроенных преÑетов ÑкÑпорта Ð´Ð»Ñ ÑƒÐ´Ð°Ð»Ñ‘Ð½Ð½Ð¾Ð¹ отладки."
+
msgid ""
"No runnable export preset found for this platform.\n"
"Please add a runnable preset in the Export menu or define an existing preset "
@@ -2690,6 +3365,9 @@ msgstr "Пишите ваш код в методе _run()."
msgid "There is an edited scene already."
msgstr "Уже ÑущеÑтвует Ð¾Ñ‚Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ñцена."
+msgid "Edit Built-in Action"
+msgstr "Изменить вÑтроенное дейÑтвие"
+
msgid "Common"
msgstr "Общий"
@@ -2708,8 +3386,33 @@ msgstr "ГорÑчие клавиши"
msgid "Binding"
msgstr "ПривÑзка"
-msgid "%s Error"
-msgstr "Ошибка %s"
+msgid ""
+"Hold %s to round to integers.\n"
+"Hold Shift for more precise changes."
+msgstr ""
+"Зажмите %s, чтобы округлить до целых.\n"
+" Зажмите Shift Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ точных изменений."
+
+msgid "No notifications."
+msgstr "Ðет уведомлений."
+
+msgid "Show notifications."
+msgstr "Показать уведомлениÑ."
+
+msgid "Silence the notifications."
+msgstr "Заглушить уведомлениÑ."
+
+msgid "Left Stick Left, Joystick 0 Left"
+msgstr "Левый Ñтик влево, ДжойÑтик 0 влево"
+
+msgid "Left Stick Right, Joystick 0 Right"
+msgstr "Левый Ñтик вправо, ДжойÑтик 0 вправо"
+
+msgid "Left Stick Up, Joystick 0 Up"
+msgstr "Левый Ñтик вверх, Стик 0 вверх"
+
+msgid "Left Stick Down, Joystick 0 Down"
+msgstr "Левый Ñтик вниз, Стик 0 вниз"
msgid "All Devices"
msgstr "Ð’Ñе уÑтройÑтва"
@@ -2717,11 +3420,14 @@ msgstr "Ð’Ñе уÑтройÑтва"
msgid "Device"
msgstr "УÑтройÑтво"
+msgid "Listening for input..."
+msgstr "Ожидание ввода..."
+
msgid "Project export for platform:"
msgstr "ЭкÑпорт проекта Ð´Ð»Ñ Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼Ñ‹:"
msgid "Completed with warnings."
-msgstr "Завершено Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°Ð¼Ð¸."
+msgstr "Завершено Ñ Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñми."
msgid "Completed successfully."
msgstr "Завершено без ошибок."
@@ -2756,6 +3462,15 @@ msgstr "Ðе удалоÑÑŒ ÑкÑпортировать файлы проект
msgid "Can't open file to read from path \"%s\"."
msgstr "Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¸Ð· пути \"%s\"."
+msgid "Can't open executable file from path \"%s\"."
+msgstr "Ðе удалоÑÑŒ открыть иÑполнÑемый файл по пути «%s»."
+
+msgid "Can't create encrypted file."
+msgstr "Ðе удалоÑÑŒ Ñоздать зашифрованный файл."
+
+msgid "Can't open encrypted file to write."
+msgstr "Ðе удалоÑÑŒ открыть зашифрованный файл Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи."
+
msgid "Save ZIP"
msgstr "Сохранить ZIP"
@@ -3035,12 +3750,22 @@ msgstr "ЭкÑпортировать выбранные Ñцены (включа
msgid "Export selected resources (and dependencies)"
msgstr "ЭкÑпортировать выбранные реÑурÑÑ‹ (Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð·Ð°Ð²Ð¸ÑимоÑти)"
+msgid "Export as dedicated server"
+msgstr "Экпортировать как выделенный Ñервер"
+
msgid "Export Mode:"
msgstr "Режим ÑкÑпортированиÑ:"
msgid "Resources to export:"
msgstr "РеÑурÑÑ‹ Ð´Ð»Ñ ÑкÑпорта:"
+msgid ""
+"\"Strip Visuals\" will replace the following resources with placeholders:"
+msgstr "\"Убрать визуал\" заменит Ñледующие реÑурÑÑ‹ на заполнители:"
+
+msgid "Strip Visuals"
+msgstr "Убрать визуал"
+
msgid "Keep"
msgstr "ОÑтавить оригинал"
@@ -3067,6 +3792,9 @@ msgstr "ПользовательÑкие (через запÑтую):"
msgid "Feature List:"
msgstr "СпиÑок ÑвойÑтв:"
+msgid "Encrypt Exported PCK"
+msgstr "Шифровать Ñкпортированный PCK"
+
msgid "Invalid Encryption Key (must be 64 hexadecimal characters long)"
msgstr ""
"Ðеверный ключ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ (должен ÑоÑтоÑÑ‚ÑŒ из 64 шеÑтнадцатеричных Ñимволов)"
@@ -3096,6 +3824,9 @@ msgstr "ЭкÑпортировать вÑÑ‘..."
msgid "ZIP File"
msgstr "ZIP-файл"
+msgid "Godot Project Pack"
+msgstr "Пакет Godot проекта"
+
msgid "Export templates for this platform are missing:"
msgstr "Шаблоны ÑкÑпорта Ð´Ð»Ñ Ñтой платформы отÑутÑтвуют:"
@@ -3108,6 +3839,25 @@ msgstr "Управление шаблонами ÑкÑпорта"
msgid "Export With Debug"
msgstr "ЭкÑпорт в режиме отладки"
+msgid "Path to FBX2glTF executable is empty."
+msgstr "Путь к иÑполнителю FBX2glTF пуÑÑ‚."
+
+msgid "Path to FBX2glTF executable is invalid."
+msgstr "Путь к иÑполнÑемому файлу FBX2glTF недейÑтвителен."
+
+msgid "Error executing this file (wrong version or architecture)."
+msgstr "Ошибка при запуÑке данного файла (Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð¸Ð»Ð¸ архитектура)."
+
+msgid ""
+"FBX2glTF is required for importing FBX files.\n"
+"Please download it and provide a valid path to the binary:"
+msgstr ""
+"FBX2glTF необходим Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² FBX.\n"
+"ПожалуйÑта, Ñкачайте его и укажите верный путь к иÑполнителю:"
+
+msgid "Click this link to download FBX2glTF"
+msgstr "Ðажмите на Ñту ÑÑылку Ð´Ð»Ñ ÑÐºÐ°Ñ‡Ð¸Ð²Ð°Ð½Ð¸Ñ FBX2glTF"
+
msgid "Browse"
msgstr "Обзор"
@@ -3137,8 +3887,14 @@ msgstr "Ошибка перемещениÑ:"
msgid "Error duplicating:"
msgstr "Ошибка дублированиÑ:"
+msgid "Failed to save resource at %s: %s"
+msgstr "Ðе удалоÑÑŒ Ñохранить реÑÑƒÑ€Ñ Ð² %s: %s"
+
+msgid "Failed to load resource at %s: %s"
+msgstr "Ðе удалоÑÑŒ загрузить реÑÑƒÑ€Ñ Ð¸Ð· %s: %s"
+
msgid "Unable to update dependencies:"
-msgstr "Ðе удаётÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð¸Ñ‚ÑŒ завиÑимоÑти:"
+msgstr "Ðе удалоÑÑŒ обновить завиÑимоÑти:"
msgid "Provided name contains invalid characters."
msgstr "Ð˜Ð¼Ñ Ñодержит недопуÑтимые Ñимволы."
@@ -3292,9 +4048,21 @@ msgstr "Заменить..."
msgid "Replace in Files"
msgstr "Заменить в файлах"
+msgid "Replace all (no undo)"
+msgstr "Заменить вÑÑ‘ (ÐЕЛЬЗЯ ОТМЕÐИТЬ)"
+
msgid "Searching..."
msgstr "ПоиÑк..."
+msgid "%d match in %d file"
+msgstr "%d Ñовпадение в %d файле"
+
+msgid "%d matches in %d file"
+msgstr "%d Ñовпадений в %d файле"
+
+msgid "%d matches in %d files"
+msgstr "%d Ñовпадений в %d файлах"
+
msgid "Add to Group"
msgstr "Добавить в группу"
@@ -3331,12 +4099,122 @@ msgstr "Редактор групп"
msgid "Manage Groups"
msgstr "Управление группами"
+msgid "The Beginning"
+msgstr "Ðачало"
+
+msgid "Audio Stream Importer: %s"
+msgstr "Импортер потока аудио: %s"
+
msgid "Reimport"
-msgstr "Переимпортировать"
+msgstr "Повторить импорт"
+
+msgid "Enable looping."
+msgstr "Зациклить."
msgid "Offset:"
msgstr "ОтÑтуп:"
+msgid ""
+"Loop offset (from beginning). Note that if BPM is set, this setting will be "
+"ignored."
+msgstr ""
+"Сдвиг цикла (от начала). Обратите внимание, еÑли уÑтановлен темп (BPM), Ñтот "
+"параметр будет игнорироватьÑÑ."
+
+msgid "Loop:"
+msgstr "Зациклить:"
+
+msgid "BPM:"
+msgstr "Темп:"
+
+msgid ""
+"Configure the Beats Per Measure (tempo) used for the interactive streams.\n"
+"This is required in order to configure beat information."
+msgstr ""
+"КоличеÑтво ударов на такт (темп), иÑпользуемое интерактивными потоками.\n"
+"Это нужно Ð´Ð»Ñ Ð½Ð°Ñтройки ритма."
+
+msgid "Beat Count:"
+msgstr "Кол-во ударов:"
+
+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 ""
+"Параметр количеÑтва битов, иÑпользуемых Ð´Ð»Ñ Ð·Ð°Ñ†Ð¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¼ÑƒÐ·Ñ‹ÐºÐ¸. ЕÑли ноль, "
+"он будет автоматичеÑки определен по длине.\n"
+"РекомендуетÑÑ ÑƒÑтановить Ñто значение (вручную, либо щелкнув номер доли в "
+"превью), чтобы обеÑпечить правильную работу цикла."
+
+msgid "Bar Beats:"
+msgstr "Ударов в такте:"
+
+msgid ""
+"Configure the Beats Per Bar. This used for music-aware transitions between "
+"AudioStreams."
+msgstr ""
+"Параметр количеÑтва ударов в такте. Это иÑпользуетÑÑ Ð´Ð»Ñ Ð¼ÑƒÐ·Ñ‹ÐºÐ°Ð»ÑŒÐ½Ð¾ "
+"оÑнованных переходов между звуковыми потоками AudioStream."
+
+msgid "Music Playback:"
+msgstr "ВоÑпроизведение:"
+
+msgid "New Configuration"
+msgstr "ÐÐ¾Ð²Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ"
+
+msgid "Remove Variation"
+msgstr "Удалить вариант"
+
+msgid ""
+"Warning: Multiple configurations have identical settings. Duplicates will be "
+"ignored."
+msgstr ""
+"Предупреждение: ÐеÑколько конфигураций имеют идентичные наÑтройки. Дубликаты "
+"игнорируютÑÑ."
+
+msgid ""
+"Note: LCD Subpixel antialiasing is selected, each of the glyphs will be pre-"
+"rendered for all supported subpixel layouts (5x)."
+msgstr ""
+"Примечание: ЕÑли Ñглаживание ÑубпикÑелей LCD выбрано, каждый глиф будет "
+"предварительно отрендерен Ð´Ð»Ñ Ð²Ñех поддерживаемых Ñлоев ÑубпикÑелей (5x)."
+
+msgid "Advanced Import Settings for '%s'"
+msgstr "РаÑширенные наÑтройки импорта Ð´Ð»Ñ '%s'"
+
+msgid "Rendering Options"
+msgstr "Параметры рендеринга"
+
+msgid "Select font rendering options, fallback font, and metadata override:"
+msgstr ""
+"Выберите параметры рендеринга шрифта, запаÑной шрифт и замененную метадату:"
+
+msgid "Pre-render Configurations"
+msgstr "Конфигурации предварительного рендера"
+
+msgid ""
+"Add font size, and variation coordinates, and select glyphs to pre-render:"
+msgstr ""
+"Добавьте размер шрифта и координаты вариантов, и выберите глифы Ð´Ð»Ñ "
+"предварительного рендеринга:"
+
+msgid "Configuration:"
+msgstr "КонфигурациÑ:"
+
+msgid "Add configuration"
+msgstr "Добавить конфигурацию"
+
+msgid "Dynamically rendered TrueType/OpenType font"
+msgstr "ДинамичеÑки отображаемый шрифт TrueType/OpenType"
+
+msgid "Can't load font texture:"
+msgstr "Ðе удаетÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¸Ñ‚ÑŒ текÑтуру шрифта:"
+
+msgid "Image margin too big."
+msgstr "ÐŸÐ¾Ð»Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñлишком большие."
+
msgid "Importing Scene..."
msgstr "Импортирование Ñцены..."
@@ -3362,22 +4240,67 @@ msgid ""
"%s: Texture detected as used as a normal map in 3D. Enabling red-green "
"texture compression to reduce memory usage (blue channel is discarded)."
msgstr ""
-"%s: Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ñ‚ÐµÐºÑтура иÑпользуетÑÑ ÐºÐ°Ðº карта нормалей в 3D. Включено краÑно-"
-"зелёное Ñжатие текÑтуры Ð´Ð»Ñ ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð°Ð¼Ñти (Ñиний канал "
+"%s: ТекÑтура иÑпользуетÑÑ ÐºÐ°Ðº карта нормалей в 3D. Включено краÑно-зелёное "
+"Ñжатие текÑтуры Ð´Ð»Ñ ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð°Ð¼Ñти (Ñиний канал "
"отбраÑываетÑÑ)."
+msgid "2D/3D (Auto-Detect)"
+msgstr "2D/3D (Ðвтоопределение)"
+
msgid "2D"
msgstr "2D"
msgid "3D"
msgstr "3D"
+msgid "<Unnamed Material>"
+msgstr "<БезымÑнный материал>"
+
+msgid "Import ID: %s"
+msgstr "ID импорта: %s"
+
+msgid ""
+"Type: %s\n"
+"Import ID: %s"
+msgstr ""
+"Тип: %s\n"
+"ID импорта: %s"
+
+msgid "Error opening scene"
+msgstr "Ошибка при открытии Ñцены"
+
+msgid "Advanced Import Settings for AnimationLibrary '%s'"
+msgstr "РаÑширенные наÑтройки импорта Ð´Ð»Ñ AnimationLibrary '%s'"
+
+msgid "Advanced Import Settings for Scene '%s'"
+msgstr "РаÑширенные наÑтройки импорта Ð´Ð»Ñ Ñцены '%s'"
+
+msgid "Select folder to extract material resources"
+msgstr "Выбрать папку Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ Ð¼Ð°Ñ‚ÐµÑ€Ð¸Ð°Ð»Ð¾Ð²"
+
+msgid "Extract Materials to Resource Files"
+msgstr "Извлечь материалы в файлы реÑурÑов"
+
+msgid "Set paths to save animations as resource files on Reimport"
+msgstr ""
+"Задать пути Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ð¹ в виде файлов реÑурÑов при повторном "
+"импорте"
+
+msgid "Actions..."
+msgstr "ДейÑтвиÑ..."
+
+msgid "Extract Materials"
+msgstr "Извлечь материалы"
+
msgid "Meshes"
msgstr "Сетка"
msgid "Materials"
msgstr "Материалы"
+msgid "Save Extension:"
+msgstr "РаÑширение:"
+
msgid "Select Importer"
msgstr "Выберите импортёр"
@@ -3414,6 +4337,9 @@ msgstr "Импортировать как:"
msgid "Preset"
msgstr "ПреÑет"
+msgid "Advanced..."
+msgstr "Дополнительно..."
+
msgid "Save Scenes, Re-Import, and Restart"
msgstr "Сохранить Ñцены, переимпортировать и перезапуÑтить"
@@ -3433,12 +4359,64 @@ msgstr ""
"Выберите файл реÑурÑа в файловой ÑиÑтеме или в инÑпекторе, чтобы наÑтроить "
"параметры импорта."
+msgid "No Event Configured"
+msgstr "Событие не наÑтроено"
+
+msgid "Keyboard Keys"
+msgstr "Клавиши клавиатуры"
+
+msgid "Mouse Buttons"
+msgstr "Кнопки мыши"
+
+msgid "Joypad Buttons"
+msgstr "Кнопки джойÑтика"
+
+msgid "Joypad Axes"
+msgstr "ОÑи джойÑтика"
+
+msgid "Event Configuration"
+msgstr "ÐаÑтройки ÑобытиÑ"
+
+msgid "Manual Selection"
+msgstr "Ручной выбор"
+
+msgid "Filter Inputs"
+msgstr "Фильтр ввода"
+
+msgid "Additional Options"
+msgstr "Дополнительные опции"
+
msgid "Device:"
msgstr "УÑтройÑтво:"
+msgid "Command / Control (auto)"
+msgstr "Command / Control (авто)"
+
+msgid ""
+"Automatically remaps between 'Meta' ('Command') and 'Control' depending on "
+"current platform."
+msgstr ""
+"ÐвтоматичеÑкое переключение между «Meta» («Command») и «Control» в "
+"завиÑимоÑти от текущей платформы."
+
+msgid ""
+"The following resources will be duplicated and embedded within this resource/"
+"object."
+msgstr ""
+"Следующие реÑурÑÑ‹ будут продублированы и вÑтроены в Ñтот реÑурÑ/объект."
+
+msgid "This object has no resources."
+msgstr "Этот объект не имеет реÑурÑов."
+
msgid "Failed to load resource."
msgstr "Ðе удалоÑÑŒ загрузить реÑурÑ."
+msgid "(Current)"
+msgstr "(Текущий)"
+
+msgid "Expand Non-Default"
+msgstr "Развернуть изменённые"
+
msgid "Property Name Style"
msgstr "Стиль имени ÑвойÑтва"
@@ -3535,20 +4513,48 @@ msgstr "Переназначить в локали:"
msgid "Locale"
msgstr "Локаль"
+msgid "POT Generation"
+msgstr "Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ POT"
+
+msgid "Files with translation strings:"
+msgstr "Файлы Ñо Ñтроками перевода:"
+
+msgid "Generate POT"
+msgstr "Сгенерировать POT"
+
+msgid "Set %s on %d nodes"
+msgstr "Задать %s на %d узлах"
+
+msgid "%s (%d Selected)"
+msgstr "%s (%d выбрано)"
+
msgid "Select a single node to edit its signals and groups."
-msgstr "Выберите один узел Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñигналов и групп."
+msgstr "Выберите один узел Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐµÐ³Ð¾ Ñигналов и групп."
+
+msgid "Plugin name cannot be blank."
+msgstr "Ð˜Ð¼Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð° не может быть пуÑтым."
+
+msgid "Script extension must match chosen language extension (.%s)."
+msgstr ""
+"РаÑширение Ñкрипта должно ÑоответÑтвовать раÑширению выбранного Ñзыка (.%s)."
+
+msgid "Subfolder name is not a valid folder name."
+msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð´Ð¿Ð°Ð¿ÐºÐ¸ не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым именем папки."
+
+msgid "Subfolder cannot be one which already exists."
+msgstr "Подпапка Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼ именем уже ÑущеÑтвует."
msgid "Edit a Plugin"
msgstr "Редактировать плагин"
msgid "Create a Plugin"
-msgstr "Создать дополнение"
+msgstr "Создать плагин"
msgid "Update"
-msgstr "Обновление"
+msgstr "Обновить"
msgid "Plugin Name:"
-msgstr "Ð˜Ð¼Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ:"
+msgstr "Ð˜Ð¼Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð°:"
msgid "Subfolder:"
msgstr "Подпапка:"
@@ -3643,6 +4649,12 @@ msgstr "Выбирайте, перемещайте и Ñоздавайте тоÑ
msgid "Enable snap and show grid."
msgstr "Включить привÑзку и отображение Ñетки."
+msgid "Sync:"
+msgstr "Синхронизировать:"
+
+msgid "Blend:"
+msgstr "Смешивание:"
+
msgid "Point"
msgstr "Точка"
@@ -3685,15 +4697,9 @@ msgstr "Удалить точки и треугольники."
msgid "Generate blend triangles automatically (instead of manually)"
msgstr "Создать ÑмеÑÑŒ треугольники автоматичеÑки (а не вручную)"
-msgid "Blend:"
-msgstr "Смешивание:"
-
msgid "Parameter Changed:"
msgstr "Параметр изменён:"
-msgid "Edit Filters"
-msgstr "Редактировать фильтры"
-
msgid "Output node can't be added to the blend tree."
msgstr "Узел вывода не может быть добавлен в дерево ÑмешиваниÑ."
@@ -3762,9 +4768,21 @@ msgstr "Добавить узел..."
msgid "Enable Filtering"
msgstr "Включить фильтрацию"
+msgid "Library Name:"
+msgstr "Ð˜Ð¼Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ¸:"
+
+msgid "Animation name can't be empty."
+msgstr "Ð˜Ð¼Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ð¸ не может быть пуÑтым."
+
msgid "Load Animation"
msgstr "Загрузить анимацию"
+msgid "Invalid AnimationLibrary file."
+msgstr "ÐедопуÑтимый файл AnimationLibrary."
+
+msgid "Invalid Animation file."
+msgstr "ÐедопуÑтимый файл анимации."
+
msgid "Animation Name:"
msgstr "Ðазвание анимации:"
@@ -3774,6 +4792,21 @@ msgstr "Ð’ÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ"
msgid "Open in Inspector"
msgstr "Открыть в инÑпекторе"
+msgid "Paste Animation to Library from clipboard"
+msgstr "Ð’Ñтавить анимацию в библиотеку из буфера обмена"
+
+msgid "Save animation library to resource on disk"
+msgstr "Сохранить библиотеку анимаций в реÑÑƒÑ€Ñ Ð½Ð° диÑке"
+
+msgid "Copy animation to clipboard"
+msgstr "Копировать анимацию в буфер обмена"
+
+msgid "Save animation to resource on disk"
+msgstr "Сохранить анимацию в реÑÑƒÑ€Ñ Ð½Ð° диÑке"
+
+msgid "Edit Animation Libraries"
+msgstr "Редактировать библиотеки анимаций"
+
msgid "Storage"
msgstr "Хранилище"
@@ -3807,6 +4840,9 @@ msgstr "Изменена поÑÐ»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ"
msgid "Change Blend Time"
msgstr "Изменить Ð²Ñ€ÐµÐ¼Ñ ÑмешиваниÑ"
+msgid "Duplicated Animation Name:"
+msgstr "ПовторÑющееÑÑ Ð¸Ð¼Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ð¸:"
+
msgid "Play selected animation backwards from current pos. (A)"
msgstr ""
"ВоÑпроизвеÑти выбранную анимацию в обратном направлении Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ позиции. "
@@ -3816,9 +4852,6 @@ msgid "Play selected animation backwards from end. (Shift+A)"
msgstr ""
"ВоÑпроизвеÑти выбранную анимацию в обратном направлении Ñ ÐºÐ¾Ð½Ñ†Ð°. (Shift+A)"
-msgid "Stop animation playback. (S)"
-msgstr "ОÑтановить воÑпроизведение анимации. (S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "ВоÑпроизвеÑти выбранную анимацию Ñначала. (Shift+D)"
@@ -3837,6 +4870,9 @@ msgstr "ИнÑтрументы анимации"
msgid "Animation"
msgstr "ÐнимациÑ"
+msgid "Manage Animations..."
+msgstr "Управление анимациÑми..."
+
msgid "Edit Transitions..."
msgstr "Редактировать переходы..."
@@ -4026,6 +5062,9 @@ msgstr "Ðе удалоÑÑŒ проверить хеш SHA-256"
msgid "Asset Download Error:"
msgstr "Ошибка загрузки шаблона:"
+msgid "Ready to install!"
+msgstr "Готово к уÑтановке!"
+
msgid "Downloading (%s / %s)..."
msgstr "Загрузка (%s / %s)..."
@@ -4210,8 +5249,29 @@ msgstr "Сгруппирован"
msgid "Add Node Here"
msgstr "Добавить узел Ñюда"
+msgid "Instantiate Scene Here"
+msgstr "ИнÑтанцировать Ñцену здеÑÑŒ"
+
+msgid "Paste Node(s) Here"
+msgstr "Ð’Ñтавить узел(узлы) здеÑÑŒ"
+
+msgid "Move Node(s) Here"
+msgstr "ПеремеÑтить узел(узлы) Ñюда"
+
+msgid "px"
+msgstr "пикÑ"
+
+msgid "units"
+msgstr "ед"
+
+msgid "Moving:"
+msgstr "Перемещение:"
+
+msgid "Rotating:"
+msgstr "Вращение:"
+
msgid "Scaling:"
-msgstr "МаÑштаб:"
+msgstr "МаÑштабирование:"
msgid ""
"Project Camera Override\n"
@@ -4713,6 +5773,9 @@ msgstr ""
"При удалённом иÑпользовании на уÑтройÑтве, Ñто работает Ñффективнее еÑли "
"ÑÐµÑ‚ÐµÐ²Ð°Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²Ð°Ñ ÑиÑтема включена."
+msgid " - Variation"
+msgstr " - ВариациÑ"
+
msgid "Convert to CPUParticles2D"
msgstr "Преобразовать в CPUParticles2D"
@@ -4755,12 +5818,60 @@ msgstr "Объём"
msgid "Emission Source:"
msgstr "ИÑточник излучениÑ:"
+msgid "A processor material of type 'ParticleProcessMaterial' is required."
+msgstr "ТребуетÑÑ Ð¼Ð°Ñ‚ÐµÑ€Ð¸Ð°Ð» типа «ParticleProcessMaterial»."
+
+msgid "Convert to CPUParticles3D"
+msgstr "Преобразовать в CPUParticles3D"
+
+msgid "Generating Visibility AABB (Waiting for Particle Simulation)"
+msgstr "Создание видимого AABB (ожидание ÑимулÑции чаÑтиц)"
+
msgid "Generate Visibility AABB"
-msgstr "Генерировать AABB"
+msgstr "Генерировать видимый AABB"
+
+msgid "Generate AABB"
+msgstr "Сгенерировать AABB"
+
+msgid "Low"
+msgstr "Ðизкий"
+
+msgid "Moderate"
+msgstr "Умеренный"
+
+msgid "High"
+msgstr "Ð’Ñ‹Ñокий"
+
+msgid "Subdivisions: %s"
+msgstr "Подразделы: %s"
+
+msgid "Cell size: %s"
+msgstr "Размер Ñчейки: %s"
+
+msgid "Video RAM size: %s MB (%s)"
+msgstr "ВидеопамÑти RAM: %s MB (%s)"
+
+msgid "Bake SDF"
+msgstr "Запечь SDF"
+
+msgid ""
+"No faces detected during GPUParticlesCollisionSDF3D bake.\n"
+"Check whether there are visible meshes matching the bake mask within its "
+"extents."
+msgstr ""
+"При запекании GPUParticlesCollisionSDF3D лицевые чаÑти не обнаружены.\n"
+"Проверьте, еÑÑ‚ÑŒ ли видимые меши, ÑоответÑтвующие маÑке Ð·Ð°Ð¿ÐµÐºÐ°Ð½Ð¸Ñ Ð² пределах "
+"ее границ."
+
+msgid "Select path for SDF Texture"
+msgstr "Выбрать путь к SDF текÑтуре"
msgid "Gradient Edited"
msgstr "Градиент отредактирован"
+msgid "Reverse/mirror gradient."
+msgstr "Развернуть/отразить градиент."
+
msgid "Swap GradientTexture2D Fill Points"
msgstr "ПоменÑÑ‚ÑŒ меÑтами точки заливки GradientTexture2D"
@@ -4770,6 +5881,9 @@ msgstr "ПоменÑÑ‚ÑŒ меÑтами точки градиентной зал
msgid "Toggle Grid Snap"
msgstr "Переключить Ñетку привÑзки"
+msgid "Configure"
+msgstr "КонфигурациÑ"
+
msgid "Create Occluder Polygon"
msgstr "Создан затенÑющий полигон"
@@ -4784,6 +5898,9 @@ msgid "Failed creating lightmap images, make sure path is writable."
msgstr ""
"Сбой ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ°Ñ€Ñ‚Ñ‹ оÑвещенноÑти, убедитеÑÑŒ, что путь доÑтупен Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи."
+msgid "No editor scene root found."
+msgstr "ÐšÐ¾Ñ€Ð½ÐµÐ²Ð°Ñ Ñцена редактора не найдена."
+
msgid "Bake Lightmaps"
msgstr "Запекать карты оÑвещениÑ"
@@ -4845,6 +5962,18 @@ msgstr "Ðет полиÑетки Ð´Ð»Ñ Ð¾Ñ‚Ð»Ð°Ð´ÐºÐ¸."
msgid "Mesh has no UV in layer %d."
msgstr "ПолиÑетка не имеет UV в Ñлое %d."
+msgid "MeshInstance3D lacks a Mesh."
+msgstr "Ð’ MeshInstance3D отÑутÑтвует Mesh."
+
+msgid "Mesh has no surface to create outlines from."
+msgstr "Mesh не имеет поверхноÑти Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÑƒÑ€Ð¾Ð²."
+
+msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES."
+msgstr "Тип примитива Mesh не ÑвлÑетÑÑ PRIMITIVE_TRIANGLES."
+
+msgid "Could not create outline."
+msgstr "Ðе удалоÑÑŒ Ñоздать контур."
+
msgid "Create Outline"
msgstr "Создать контур"
@@ -5049,12 +6178,6 @@ msgstr "Изменить уведомитель AABB"
msgid "Change Particles AABB"
msgstr "Изменить AABB чаÑтиц"
-msgid "Change Box Shape Extents"
-msgstr "Изменить границы прÑмоугольника"
-
-msgid "Change Probe Extents"
-msgstr "Изменить Probe Extents"
-
msgid "Change Capsule Shape Radius"
msgstr "Изменить Ñ€Ð°Ð´Ð¸ÑƒÑ ÐºÐ°Ð¿Ñулы"
@@ -5133,6 +6256,12 @@ msgstr "МанипулÑÑ†Ð¸Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð° (без вÑтавленног
msgid "Animation Key Inserted."
msgstr "Ключ анимации вÑтавлен."
+msgid "Objects: %d\n"
+msgstr "Объекты: %d\n"
+
+msgid "Draw Calls: %d"
+msgstr "Вызовы отриÑовки: %d"
+
msgid "Top View."
msgstr "Вид Ñверху."
@@ -5193,6 +6322,9 @@ msgstr "Режим без теней"
msgid "Shadow Atlas"
msgstr "ÐÑ‚Ð»Ð°Ñ Ñ‚ÐµÐ½ÐµÐ¹"
+msgid "Display Advanced..."
+msgstr "Показать дополнительные..."
+
msgid "View Environment"
msgstr "Окружение"
@@ -5273,6 +6405,9 @@ msgstr "ПривÑзать узлы к полу"
msgid "Couldn't find a solid floor to snap the selection to."
msgstr "Ðе удалоÑÑŒ найти Ñплошной пол, к которому можно привÑзать выделение."
+msgid "Preview disabled."
+msgstr "Превью отключено."
+
msgid "Use Local Space"
msgstr "ИÑпользовать локальное проÑтранÑтво"
@@ -5873,6 +7008,9 @@ msgstr "Стандартный"
msgid "Connections to method:"
msgstr "ÐŸÐ¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº методу:"
+msgid "Source"
+msgstr "ИÑточник"
+
msgid "Target"
msgstr "Цель"
@@ -5995,6 +7133,9 @@ msgstr "Переход к Ñледующей точке оÑтанова"
msgid "Go to Previous Breakpoint"
msgstr "Перейти к предыдущей точке оÑтанова"
+msgid "Save File As"
+msgstr "Сохранить файл как"
+
msgid "This skeleton has no bones, create some children Bone2D nodes."
msgstr "У Ñтого Ñкелета нет коÑтей, Ñоздайте дочерние Bone2D узлы."
@@ -6016,6 +7157,9 @@ msgstr "ПерезапиÑать позу покоÑ"
msgid "Create physical bones"
msgstr "Создать физичеÑкие коÑти"
+msgid "Export Skeleton Profile As..."
+msgstr "ЭкÑпортировать профиль Ñкелета как..."
+
msgid "Play IK"
msgstr "ВоÑпроизвеÑти IK"
@@ -6037,6 +7181,9 @@ msgstr "Создать LightOccluder2D"
msgid "LightOccluder2D Preview"
msgstr "ПредпроÑмотр LightOccluder2D"
+msgid "Can't convert a Sprite2D from a foreign scene."
+msgstr "Ðевозможно конвертировать Sprite2D из другой Ñцены."
+
msgid "Can't convert a sprite using animation frames to mesh."
msgstr ""
"Ðе удаетÑÑ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ñ‚ÑŒ Ñпрайт иÑпользующий анимационные кадры в Ñетку."
@@ -6097,7 +7244,7 @@ msgid "ERROR: Couldn't load frame resource!"
msgstr "ОШИБКÐ: Ðевозможно загрузить кадр!"
msgid "Resource clipboard is empty or not a texture!"
-msgstr "Буфер обмена чиÑÑ‚ или не Ñодержит текÑтуру!"
+msgstr "Буфер обмена пуÑÑ‚ или не Ñодержит текÑтуру!"
msgid "Paste Frame"
msgstr "Ð’Ñтавить кадр"
@@ -6120,15 +7267,15 @@ msgstr "(пуÑто)"
msgid "Animations:"
msgstr "Ðнимации:"
-msgid "Speed:"
-msgstr "СкороÑÑ‚ÑŒ:"
-
-msgid "Loop"
-msgstr "Зациклить"
+msgid "Delete Animation"
+msgstr "Удалить анимацию"
msgid "Animation Frames:"
msgstr "Кадры анимации:"
+msgid "Frame Duration:"
+msgstr "ДлительноÑÑ‚ÑŒ кадра:"
+
msgid "Zoom Reset"
msgstr "СброÑить маÑштабирование"
@@ -6177,21 +7324,51 @@ msgstr "Шаг:"
msgid "Styleboxes"
msgstr "Стили"
+msgid "1 color"
+msgid_plural "{num} colors"
+msgstr[0] "{num} цвет"
+msgstr[1] "{num} цвета"
+msgstr[2] "{num} цветов"
+
msgid "No colors found."
msgstr "Цвета не найдены."
+msgid "1 constant"
+msgid_plural "{num} constants"
+msgstr[0] "{num} конÑтанта"
+msgstr[1] "{num} конÑтанты"
+msgstr[2] "{num} конÑтант"
+
msgid "No constants found."
msgstr "КонÑтанты не найдены."
msgid "No fonts found."
msgstr "Шрифты не найдены."
+msgid "1 font size"
+msgid_plural "{num} font sizes"
+msgstr[0] "{num} размер шрифта"
+msgstr[1] "{num} размера шрифта"
+msgstr[2] "{num} размеров шрифта"
+
msgid "No icons found."
msgstr "Иконки не найдены."
+msgid "1 stylebox"
+msgid_plural "{num} styleboxes"
+msgstr[0] "{num} Ñтиль"
+msgstr[1] "{num} ÑтилÑ"
+msgstr[2] "{num} Ñтилей"
+
msgid "No styleboxes found."
msgstr "Стили не найдены."
+msgid "{num} currently selected"
+msgid_plural "{num} currently selected"
+msgstr[0] "{num} выбрано в данный момент"
+msgstr[1] "{num} выбрано в данный момент"
+msgstr[2] "{num} выбрано в данный момент"
+
msgid "Nothing was selected for the import."
msgstr "Ð”Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð° ничего не выбрано."
@@ -6340,6 +7517,9 @@ msgstr "Добавить тип Темы"
msgid "Remove Theme Type"
msgstr "Удалить тип Темы"
+msgid "Remove Data Type Items From Theme"
+msgstr "Удалить Ñлементы типа данных из темы"
+
msgid "Add Color Item"
msgstr "Добавить цвет"
@@ -6468,12 +7648,18 @@ msgstr "Добавить тип Ñлемента"
msgid "Add Type"
msgstr "Добавить тип"
+msgid "Override All Default Theme Items"
+msgstr "Переопределить вÑе Ñлементы темы по умолчанию"
+
msgid "Set Variation Base Type"
msgstr "Задать базовый тип вариации"
msgid "Set Base Type"
msgstr "Задать базовый тип"
+msgid "Add a type from a list of available types or create a new one."
+msgstr "Добавить тип из ÑпиÑка доÑтупных типов или Ñоздать новый."
+
msgid "Show Default"
msgstr "Показать по умолчанию"
@@ -6615,15 +7801,66 @@ msgstr "Перевернуть по горизонтали"
msgid "Flip Vertically"
msgstr "Перевернуть по вертикали"
+msgid "Painting:"
+msgstr "РиÑование:"
+
+msgid "Shift+Ctrl: Draw rectangle."
+msgstr "Shift+Ctrl: РиÑовать прÑмоугольник."
+
+msgid "Place Random Tile"
+msgstr "РазмеÑтить Ñлучайный тайл"
+
msgid "Tiles"
msgstr "Тайлы"
+msgid "Toggle grid visibility."
+msgstr "Переключить видимоÑÑ‚ÑŒ Ñетки."
+
+msgid "Delete All Tile Proxies"
+msgstr "Удалить вÑе прокÑи тайлов"
+
+msgid "Global actions:"
+msgstr "Глобальные дейÑтвиÑ:"
+
msgid "Atlas"
msgstr "ÐтлаÑ"
+msgid "Setup"
+msgstr "ÐаÑтройка"
+
+msgid "Select tiles."
+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 "Yes"
msgstr "Да"
+msgid "No"
+msgstr "Ðет"
+
+msgid "Add a new atlas source"
+msgstr "Добавить новый иÑходник атлаÑа"
+
+msgid "Add a Scene Tile"
+msgstr "Добавить тайл-Ñцену"
+
+msgid "Scenes collection properties:"
+msgstr "СвойÑтва коллекции Ñцен:"
+
+msgid "Tile properties:"
+msgstr "СвойÑтва тайла:"
+
msgid "TileSet"
msgstr "Ðабор тайлов"
@@ -6659,9 +7896,15 @@ msgstr "Вы хотите удалить ветку %s?"
msgid "Do you want to remove the %s remote?"
msgstr "Ð’Ñ‹ хотите удалить отÑлеживаемую ветку %s?"
+msgid "Create VCS metadata files for:"
+msgstr "Создать файлы метаданных VCS длÑ:"
+
msgid "Apply"
msgstr "Применить"
+msgid "Connect to VCS"
+msgstr "ПодключитьÑÑ Ðº VCS"
+
msgid "Remote Login"
msgstr "Удалённый вход"
@@ -6810,6 +8053,9 @@ msgstr "ЛогичеÑкое"
msgid "Sampler"
msgstr "СÑмплер"
+msgid "[default]"
+msgstr "[по умолчанию]"
+
msgid "Add Input Port"
msgstr "Добавить входной порт"
@@ -6822,6 +8068,9 @@ msgstr "Удалить входной порт"
msgid "Remove Output Port"
msgstr "Удалить выходной порт"
+msgid "Set Parameter Name"
+msgstr "Задать Ð¸Ð¼Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°"
+
msgid "Set Input Default Port"
msgstr "Задать входной порт по умолчанию"
@@ -6834,6 +8083,12 @@ msgstr "Узел(узлы) перемещён(ны)"
msgid "Visual Shader Input Type Changed"
msgstr "Изменен тип ввода визуального шейдера"
+msgid "ParameterRef Name Changed"
+msgstr "Изменено Ð¸Ð¼Ñ ParameterRef"
+
+msgid "Varying Name Changed"
+msgstr "Изменено Ð¸Ð¼Ñ Varying"
+
msgid "Vertex"
msgstr "Вершины"
@@ -7138,12 +8393,18 @@ msgstr "Возвращает гиперболичеÑкий Ñ‚Ð°Ð½Ð³ÐµÐ½Ñ Ð¿Ð°Ñ
msgid "Finds the truncated value of the parameter."
msgstr "Ðаходит уÑечённое до целого значение параметра."
+msgid "Converts screen UV to a SDF."
+msgstr "Конвертировать UV Ñкрана в SDF."
+
msgid "Perform the cubic texture lookup."
msgstr "ВыполнÑет поиÑк кубичеÑкой текÑтуры."
msgid "Transform function."
msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ."
+msgid "Transform operator."
+msgstr "Оператор преобразованиÑ."
+
msgid ""
"Calculate the outer product of a pair of vectors.\n"
"\n"
@@ -7177,6 +8438,12 @@ msgstr "ВычиÑлÑет обратную транÑформацию."
msgid "Calculates the transpose of a transform."
msgstr "ВычиÑлÑет транÑпонирование преобразованиÑ."
+msgid "Sums two transforms."
+msgstr "Суммирует два преобразованиÑ."
+
+msgid "Subtracts two transforms."
+msgstr "Вычитает два преобразованиÑ."
+
msgid "Multiplies vector by transform."
msgstr "Умножает вектор на преобразование."
@@ -7343,6 +8610,12 @@ msgstr "ПожалуйÑта, выберите файл «project.godot» или
msgid "This directory already contains a Godot project."
msgstr "Этот каталог уже Ñодержит проект Godot."
+msgid ""
+"The selected path is not empty. Choosing an empty folder is highly "
+"recommended."
+msgstr ""
+"Выбранный путь не пуÑÑ‚. ÐаÑтоÑтельно рекомендуетÑÑ Ð²Ñ‹Ð±Ñ€Ð°Ñ‚ÑŒ пуÑтую папку."
+
msgid "New Game Project"
msgstr "Ðовый игровой проект"
@@ -7361,12 +8634,80 @@ msgstr "По Ñтому пути уже ÑущеÑтвует папка Ñ ÑƒÐºÐ
msgid "It would be a good idea to name your project."
msgstr "Было бы неплохо назвать ваш проект."
+msgid "Supports desktop platforms only."
+msgstr "Поддерживает только наÑтольные платформы."
+
+msgid "Advanced 3D graphics available."
+msgstr "ДоÑтупна раÑÑˆÐ¸Ñ€ÐµÐ½Ð½Ð°Ñ 3D-графика."
+
+msgid "Can scale to large complex scenes."
+msgstr "Может маÑштабироватьÑÑ Ð´Ð¾ больших Ñложных Ñцен."
+
+msgid "Uses RenderingDevice backend."
+msgstr "ИÑпользует бÑкенд RenderingDevice."
+
+msgid "Slower rendering of simple scenes."
+msgstr "Более медленный рендеринг проÑÑ‚Ñ‹Ñ… Ñцен."
+
+msgid "Supports desktop + mobile platforms."
+msgstr "Поддерживает наÑтольные и мобильные платформы."
+
+msgid "Less advanced 3D graphics."
+msgstr "Менее Ð¿Ñ€Ð¾Ð´Ð²Ð¸Ð½ÑƒÑ‚Ð°Ñ 3D-графика."
+
+msgid "Less scalable for complex scenes."
+msgstr "Менее маÑштабируемый Ð´Ð»Ñ Ñложных Ñцен."
+
+msgid "Fast rendering of simple scenes."
+msgstr "БыÑтрый рендеринг проÑÑ‚Ñ‹Ñ… Ñцен."
+
+msgid "Supports desktop, mobile + web platforms."
+msgstr "Поддерживает наÑтольные, мобильные и веб-платформы."
+
+msgid "Least advanced 3D graphics (currently work-in-progress)."
+msgstr "Ðаименее Ð¿Ñ€Ð¾Ð´Ð²Ð¸Ð½ÑƒÑ‚Ð°Ñ 3D-графика (в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð² разработке)."
+
+msgid "Intended for low-end/older devices."
+msgstr "Предназначен Ð´Ð»Ñ Ð±ÑŽÐ´Ð¶ÐµÑ‚Ð½Ñ‹Ñ…/Ñтарых уÑтройÑтв."
+
+msgid "Uses OpenGL 3 backend (OpenGL 3.3/ES 3.0/WebGL2)."
+msgstr "ИÑпользует бÑкенд OpenGL 3 (OpenGL 3.3/ES 3.0/WebGL2)."
+
+msgid "Fastest rendering of simple scenes."
+msgstr "Самый быÑтрый рендеринг проÑÑ‚Ñ‹Ñ… Ñцен."
+
msgid "Invalid project path (changed anything?)."
msgstr "Ðеверный путь к проекту (Что-то изменили?)."
+msgid ""
+"Couldn't load project at '%s' (error %d). It may be missing or corrupted."
+msgstr ""
+"Ðе удалоÑÑŒ загрузить проект в «%s» (ошибка %d). Он может отÑутÑтвовать или "
+"быть повреждён."
+
+msgid "Couldn't save project at '%s' (error %d)."
+msgstr "Ðе удалоÑÑŒ Ñохранить проект в «%s» (ошибка %d)."
+
+msgid "Warning: This folder is not empty"
+msgstr "Предупреждение: Эта папка не пуÑта"
+
+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"
+"\n"
+"Are you sure you wish to continue?"
+msgstr ""
+"Ð’Ñ‹ ÑобираетеÑÑŒ Ñоздать проект Godot в непуÑтой папке.\n"
+"Ð’ÑÑ‘ Ñодержимое Ñтой папки будет импортировано как реÑурÑÑ‹ проекта!\n"
+"\n"
+"Вы уверены, что хотите продолжить?"
+
msgid "Couldn't create project.godot in project path."
msgstr "Ðе удалоÑÑŒ Ñоздать project.godot в папке проекта."
+msgid "Couldn't create icon.svg in project path."
+msgstr "Ðе удалоÑÑŒ Ñоздать icon.svg в папке проекта."
+
msgid "Error opening package file, not in ZIP format."
msgstr "Ошибка при открытии файла пакета, не в формате zip."
@@ -7409,6 +8750,14 @@ msgstr "Путь уÑтановки проекта:"
msgid "Renderer:"
msgstr "ОтриÑовщик:"
+msgid "The renderer can be changed later, but scenes may need to be adjusted."
+msgstr ""
+"ОтриÑовщик может быть изменён позже, но Ñцены могут потребовать "
+"корректировки."
+
+msgid "Version Control Metadata:"
+msgstr "Метаданные ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ Ð²ÐµÑ€Ñий:"
+
msgid "Missing Project"
msgstr "ОтÑутÑтвующий проект"
@@ -7428,13 +8777,164 @@ msgid "Can't open project at '%s'."
msgstr "Ðе удаётÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ проект в «%s»."
msgid ""
+"You requested to open %d projects in parallel. Do you confirm?\n"
+"Note that usual checks for engine version compatibility will be bypassed."
+msgstr ""
+"Ð’Ñ‹ запроÑили параллельное открытие %d проектов. Ð’Ñ‹ уверены?\n"
+"Обратите внимание, что обычные проверки ÑовмеÑтимоÑти верÑий движка будут "
+"пропущены."
+
+msgid ""
+"The selected project \"%s\" does not specify its supported Godot version in "
+"its configuration file (\"project.godot\").\n"
+"\n"
+"Project path: %s\n"
+"\n"
+"If you proceed with opening it, it will be converted to Godot's current "
+"configuration file format.\n"
+"\n"
+"Warning: You won't be able to open the project with previous versions of the "
+"engine anymore."
+msgstr ""
+"В файле конфигурации («project.godot») выбранного проекта «%s» не указана "
+"Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Godot.\n"
+"\n"
+"Путь проекта: %s\n"
+"\n"
+"ЕÑли вы продолжите открытие проекта, то файл конфигурации будет преобразован "
+"в формат текущей верÑии Godot.\n"
+"\n"
+"Предупреждение: Ð’Ñ‹ больше не Ñможете открыть проект в предыдущих верÑиÑÑ… "
+"движка."
+
+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» был Ñоздан в Godot 3.x, и должен быть конвертирован "
+"Ð´Ð»Ñ Godot 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 double precision floats, but this version of\n"
+"Godot uses single precision floats. Opening this project may cause data "
+"loss.\n"
+"\n"
+msgstr ""
+"Предупреждение: Ð’ Ñтом проекте иÑпользуютÑÑ Ð¿Ð»Ð°Ð²Ð°ÑŽÑ‰Ð¸Ðµ чиÑла двойной "
+"точноÑти, но Ñта верÑиÑ\n"
+"Godot иÑпользует плавающие чиÑла одинарной точноÑти. Открытие Ñтого проекта "
+"может привеÑти к потере данных.\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 ""
+"Предупреждение: Данный проект иÑпользует C#, но Ñта Ñборка Godot не имеет\n"
+"Ð¼Ð¾Ð´ÑƒÐ»Ñ Mono. ЕÑли продолжить, вы не Ñможете иÑпользовать Ñкрипты 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 ""
+"Предупреждение: Этот проект был Ñоздан в Godot %s.\n"
+"Открытие приведет к повышению или понижению верÑии проекта до Godot %s.\n"
+"\n"
+
+msgid ""
+"Warning: This project uses the following features not supported by this "
+"build of Godot:\n"
+"\n"
+"%s\n"
+"\n"
+msgstr ""
+"Предупреждение: Этот проект иÑпользует Ñледующие возможноÑти, не "
+"поддерживаемые данной Ñборкой Godot:\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"
"ПожалуйÑта, отредактируйте проект и уÑтановите главную Ñцену в ÐаÑтройках "
-"проекта в категории Application."
+"проекта в категории «Application»."
msgid ""
"Can't run project: Assets need to be imported.\n"
@@ -7478,6 +8978,9 @@ 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 "
@@ -7490,6 +8993,9 @@ msgstr ""
msgid "Loading, please wait..."
msgstr "Загрузка, пожалуйÑта, ждите..."
+msgid "Last Edited"
+msgstr "ПоÑледнее изменение"
+
msgid "New Project"
msgstr "Ðовый проект"
@@ -7526,8 +9032,30 @@ msgstr "Удалить вÑе"
msgid "Also delete project contents (no undo!)"
msgstr "Также удалить Ñодержимое проекта (Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ!)"
+msgid ""
+"This option will perform full project conversion, updating scenes, resources "
+"and scripts from Godot 3.x to work in Godot 4.0.\n"
+"\n"
+"Note that this is a best-effort conversion, i.e. it makes upgrading the "
+"project easier, but it will not open out-of-the-box and will still require "
+"manual adjustments.\n"
+"\n"
+"IMPORTANT: Make sure to backup your project before converting, as this "
+"operation makes it impossible to open it in older versions of Godot."
+msgstr ""
+"Эта Ð¾Ð¿Ñ†Ð¸Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ полное конвертирование проекта, обновив Ñцены, реÑурÑÑ‹ и "
+"Ñкрипты из Godot 3.x Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ в Godot 4.0.\n"
+"\n"
+"Обратите внимание, что Ñто конвертирование упрощает обновление проекта, но "
+"не гарантирует его работу «из коробки», ручные корректировки вÑÑ‘ ещё "
+"необходимы.\n"
+"\n"
+"Ð’ÐЖÐО: ОбÑзательно Ñделайте резервную копию вашего проекта перед "
+"конвертированием, так как Ñта Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð´ÐµÐ»Ð°ÐµÑ‚ невозможным его открытие в "
+"Ñтарых верÑиÑÑ… Godot."
+
msgid "Can't run project"
-msgstr "Ðе удаётÑÑ Ð·Ð°Ð¿ÑƒÑтить проект"
+msgstr "Ðе удалоÑÑŒ запуÑтить проект"
msgid ""
"You currently don't have any projects.\n"
@@ -7536,33 +9064,51 @@ msgstr ""
"Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ñƒ Ð²Ð°Ñ Ð½ÐµÑ‚ никаких проектов.\n"
"Хотите изучить официальные примеры в Библиотеке реÑурÑов?"
+msgid "Add Project Setting"
+msgstr "Добавить наÑтройку проекта"
+
msgid "Delete Item"
msgstr "Удалить Ñлемент"
+msgid "(All)"
+msgstr "(Ð’Ñе)"
+
msgid "Add Input Action"
-msgstr "Добавить дейÑтвие"
+msgstr "Добавить дейÑтвие ввода"
msgid "Change Action deadzone"
msgstr "Изменить мёртвую зону дейÑтвиÑ"
-msgid "Add Input Action Event"
-msgstr "Добавить дейÑтвие"
-
msgid "Erase Input Action"
-msgstr "Удалить дейÑтвие"
+msgstr "Удалить дейÑтвие ввода"
msgid "Rename Input Action Event"
-msgstr "Переименовать дейÑтвие"
+msgstr "Переименовать дейÑтвие ввода"
+
+msgid "Update Input Action Order"
+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 "СпиÑок дейÑтвий"
msgid "Localization"
msgstr "ЛокализациÑ"
+msgid "Autoload"
+msgstr "Ðвтозагрузка"
+
msgid "Plugins"
msgstr "Плагины"
@@ -7575,9 +9121,6 @@ msgstr "Выбрать ÑвойÑтво"
msgid "Select Virtual Method"
msgstr "Выбрать виртуальный метод"
-msgid "Select Method"
-msgstr "Выбрать метод"
-
msgid "Batch Rename"
msgstr "Групповое переименование"
@@ -7596,6 +9139,21 @@ msgstr "Дополнительные параметры"
msgid "Substitute"
msgstr "Заменить"
+msgid "Node name."
+msgstr "Ð˜Ð¼Ñ ÑƒÐ·Ð»Ð°."
+
+msgid "Node's parent name, if available."
+msgstr "Ð˜Ð¼Ñ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÑкого узла, еÑли оно доÑтупно."
+
+msgid "Node type."
+msgstr "Тип узла."
+
+msgid "Current scene name."
+msgstr "Ð˜Ð¼Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ Ñцены."
+
+msgid "Root node name."
+msgstr "Ð˜Ð¼Ñ ÐºÐ¾Ñ€Ð½ÐµÐ²Ð¾Ð³Ð¾ узла."
+
msgid ""
"Sequential integer counter.\n"
"Compare counter options."
@@ -7610,9 +9168,15 @@ msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
"ЕÑли уÑтановлено, Ñчетчик перезапуÑкаетÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ группы дочерних узлов."
+msgid "Initial value for the counter."
+msgstr "Ðачальное значение Ð´Ð»Ñ Ñчётчика."
+
msgid "Step"
msgstr "Шаг"
+msgid "Amount by which counter is incremented for each node."
+msgstr "Значение, на которое увеличиваетÑÑ Ñчётчик Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ узла."
+
msgid "Padding"
msgstr "ОтÑтуп"
@@ -7656,12 +9220,21 @@ msgstr "Ðа Ñимволе %s"
msgid "Reparent Node"
msgstr "Переподчинить узел"
+msgid "Select new parent:"
+msgstr "Выберите нового родителÑ:"
+
msgid "Keep Global Transform"
msgstr "Сохранить глобальные преобразованиÑ"
msgid "Reparent"
msgstr "Переподчинить"
+msgid "File name invalid."
+msgstr "ÐедопуÑтимое Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°."
+
+msgid "Root Type:"
+msgstr "Тип корнÑ:"
+
msgid "2D Scene"
msgstr "2D Ñцена"
@@ -7671,6 +9244,12 @@ msgstr "3D Ñцена"
msgid "User Interface"
msgstr "ПользовательÑкий интерфейÑ"
+msgid "Scene Name:"
+msgstr "Ð˜Ð¼Ñ Ñцены:"
+
+msgid "Root Name:"
+msgstr "Ð˜Ð¼Ñ ÐºÐ¾Ñ€Ð½Ñ:"
+
msgid "Error loading scene from %s"
msgstr "Ошибка при загрузке Ñцены из %s"
@@ -7776,9 +9355,15 @@ msgstr ""
msgid "Make Local"
msgstr "Сделать локальным"
+msgid "Enable Scene Unique Name(s)"
+msgstr "Включить уникальные имена Ñцен"
+
msgid "Unique names already used by another node in the scene:"
msgstr "Данное уникальное Ð¸Ð¼Ñ ÑƒÐ¶Ðµ иÑпользовано у другого узла в Ñцене:"
+msgid "Disable Scene Unique Name(s)"
+msgstr "Отключить уникальные имена Ñцен"
+
msgid "New Scene Root"
msgstr "Ðовый корень Ñцены"
@@ -7915,8 +9500,24 @@ msgid ""
"with the '%s' prefix in a node path.\n"
"Click to disable this."
msgstr ""
-"ДоÑтуп к узлу можно получить из любой точки Ñцены, предшеÑтвовав ему Ñ "
-"префикÑом «%s» на пути узла. Ðажмите, чтобы отключить"
+"ДоÑтуп к Ñтому узлу можно получить из любого меÑта Ñцены, предварÑÑ ÐµÐ³Ð¾ "
+"префикÑом «%s» в пути к узлу.\n"
+"Ðажмите, чтобы отключить Ñто."
+
+msgid "Node has one connection."
+msgid_plural "Node has {num} connections."
+msgstr[0] "Узел имеет {num} Ñоединение."
+msgstr[1] "Узел имеет {num} ÑоединениÑ."
+msgstr[2] "Узел имеет {num} Ñоединений."
+
+msgid "Node is in this group:"
+msgid_plural "Node is in the following groups:"
+msgstr[0] "Узел в Ñтой группе:"
+msgstr[1] "Узел в Ñледующих группах:"
+msgstr[2] "Узел в Ñледующих группах:"
+
+msgid "Click to show signals dock."
+msgstr "Ðажмите, чтобы показать панель Ñигналов."
msgid "Open Script:"
msgstr "Открыть Ñкрипт:"
@@ -7986,6 +9587,12 @@ msgstr "Открыть Ñкрипт / Выбрать меÑто"
msgid "Open Script"
msgstr "Открыть Ñкрипт"
+msgid "Inherit %s"
+msgstr "ÐаÑледует %s"
+
+msgid "Inherit"
+msgstr "ÐаÑледует"
+
msgid "File exists, it will be reused."
msgstr "Файл ÑущеÑтвует, будет иÑпользован повторно."
@@ -8048,6 +9655,12 @@ msgstr "ÐедопуÑтимый базовый путь."
msgid "Wrong extension chosen."
msgstr "Выбрано неверное раÑширение."
+msgid "Mode:"
+msgstr "Режим:"
+
+msgid "Global shader parameter '%s' already exists'"
+msgstr "Глобальный параметр шейдера «%s» уже ÑущеÑтвует"
+
msgid "Change Cylinder Radius"
msgstr "Изменить Ñ€Ð°Ð´Ð¸ÑƒÑ Ñ†Ð¸Ð»Ð¸Ð½Ð´Ñ€Ð°"
@@ -8090,6 +9703,9 @@ msgstr "ÐедопуÑтимый формат ÑкземплÑра ÑловарÑ
msgid "Invalid instance dictionary (invalid subclasses)"
msgstr "ÐедопуÑтимый ÑкземплÑÑ€ ÑÐ»Ð¾Ð²Ð°Ñ€Ñ (неверные подклаÑÑÑ‹)"
+msgid "Path to Blender installation is valid."
+msgstr "Путь к уÑтановке Blender ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым."
+
msgid "Next Plane"
msgstr "Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð¿Ð¾ÑкоÑÑ‚ÑŒ"
@@ -8211,6 +9827,15 @@ msgstr "Размер"
msgid "Network Profiler"
msgstr "Сетевой профайлер"
+msgid "Not possible to add a new property to synchronize without a root."
+msgstr "Ðевозможно добавить новое ÑвойÑтво Ð´Ð»Ñ Ñинхронизации без корнÑ."
+
+msgid "Spawn"
+msgstr "РазмеÑтить"
+
+msgid "Delete Property?"
+msgstr "Удалить ÑвойÑтво?"
+
msgid "A NavigationMesh resource must be set or created for this node to work."
msgstr ""
"РеÑÑƒÑ€Ñ NavigationMesh должен быть уÑтановлен или Ñоздан Ð´Ð»Ñ Ñтого узла."
@@ -8260,6 +9885,12 @@ msgstr "Ðнализ геометрии..."
msgid "Done!"
msgstr "Сделано!"
+msgid "Error loading %s: %s."
+msgstr "Ошибка загрузки %s: %s."
+
+msgid "Add an action set."
+msgstr "Добавить набор дейÑтвий."
+
msgid "Pose"
msgstr "Поза"
@@ -8363,25 +9994,16 @@ msgstr "ÐедейÑтвительный публичный ключ Ð´Ð»Ñ Ñ€Ð°
msgid "Invalid package name:"
msgstr "ÐедопуÑтимое Ð¸Ð¼Ñ Ð¿Ð°ÐºÐµÑ‚Ð°:"
-msgid "\"Use Custom Build\" must be enabled to use the plugins."
-msgstr "«Use Custom Build» должен быть включен Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð²."
-
-msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled."
-msgstr ""
-"«Export AAB» дейÑтвителен только при включённой опции «ИÑпользовать "
-"пользовательÑкую Ñборку»."
-
msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid."
msgstr ""
-"\"Min SDK\" должно быть валидным целым чиÑлом, полученное \"%s\" - не "
-"валидно."
+"«Min SDK» должен быть значением целого типа, но получено «%s», что "
+"недопуÑтимо."
msgid ""
"\"Min SDK\" cannot be lower than %d, which is the version needed by the "
"Godot library."
msgstr ""
-"\"Min SDK\" не может быть меньше чем %d - Ñто верÑÐ¸Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÐ¼Ð°Ñ Godot "
-"библиотекой."
+"\"Min SDK\" не может быть меньше %d верÑии, требуемой библиотекой Godot."
msgid ""
"\"Target SDK\" should be a valid integer, but got \"%s\" which is invalid."
@@ -8393,8 +10015,8 @@ 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 "Code Signing"
msgstr "ПодпиÑÑŒ кода"
@@ -8421,6 +10043,13 @@ msgstr "Ðе удаётÑÑ Ð·Ð°Ð¿ÑƒÑтить иÑполнÑемый файл a
msgid "'apksigner' returned with error #%d"
msgstr "«apksigner» завершилÑÑ Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹ #%d"
+msgid ""
+"output: \n"
+"%s"
+msgstr ""
+"вывод: \n"
+"%s"
+
msgid "Verifying %s..."
msgstr "Проверка %s..."
@@ -8443,13 +10072,6 @@ msgid "Unsupported export format!"
msgstr "Ðеподдерживаемый формат ÑкÑпорта!"
msgid ""
-"Trying to build from a custom built template, but no version info for it "
-"exists. Please reinstall from the 'Project' menu."
-msgstr ""
-"Попытка Ñборки из пользовательÑкого шаблона, но информации о верÑии Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ "
-"не ÑущеÑтвует. ПожалуйÑта, переуÑтановите из меню «Проект»."
-
-msgid ""
"Android build version mismatch: Template installed: %s, Godot version: %s. "
"Please reinstall Android build template from 'Project' menu."
msgstr ""
@@ -8539,6 +10161,19 @@ msgstr "Символ «%s» в идентификаторе не допуÑкаÐ
msgid "Failed to open executable file \"%s\"."
msgstr "Ðе удалоÑÑŒ открыть иÑполнÑемый файл \"%s\"."
+msgid "Executable file header corrupted."
+msgstr "Заголовок иÑполнÑемого файла поврежден."
+
+msgid "32-bit executables cannot have embedded data >= 4 GiB."
+msgstr ""
+"32-разрÑдные иÑполнÑемые файлы не могут иметь вÑтроенных данных >= 4 ГБ."
+
+msgid "Executable \"pck\" section not found."
+msgstr "ИÑполнÑемый раздел \"pck\" не найден."
+
+msgid "Could not create temp directory:"
+msgstr "Ðе удалоÑÑŒ Ñоздать временный каталог:"
+
msgid "Can't get filesystem access."
msgstr "Ðе удаётÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ доÑтуп к файловой ÑиÑтеме."
@@ -8616,6 +10251,12 @@ msgstr ""
msgid "Could not start xcrun executable."
msgstr "Ðе удаётÑÑ Ð·Ð°Ð¿ÑƒÑтить иÑполнÑемый файл xcrun."
+msgid "Built-in CodeSign failed with error \"%s\"."
+msgstr "Ð’Ñтроенный CodeSign завершилÑÑ Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹ \"%s\"."
+
+msgid "Built-in CodeSign require regex module."
+msgstr "Ð”Ð»Ñ Ð²Ñтроенного CodeSign требуетÑÑ Ð¼Ð¾Ð´ÑƒÐ»ÑŒ регулÑрных выражений."
+
msgid ""
"Could not start codesign executable, make sure Xcode command line tools are "
"installed."
@@ -8711,6 +10352,13 @@ msgstr ""
"Apple Silicon."
msgid ""
+"Code signing: Using ad-hoc signature. The exported project will be blocked "
+"by Gatekeeper"
+msgstr ""
+"ПодпиÑание кода: ИÑпользование ad-hoc подпиÑи. ЭкÑпортированный проект будет "
+"заблокирован Gatekeeper"
+
+msgid ""
"Privacy: Microphone access is enabled, but usage description is not "
"specified."
msgstr ""
@@ -8801,6 +10449,9 @@ msgstr "Ðе удалоÑÑŒ запиÑать файл: \"%s\"."
msgid "Could not read file: \"%s\"."
msgstr "Ðе удалоÑÑŒ прочитать файл: \"%s\"."
+msgid "PWA"
+msgstr "ПрогреÑÑивное веб-приложение"
+
msgid "Could not read HTML shell: \"%s\"."
msgstr "Ðе удалоÑÑŒ прочитать HTML-оболочку: \"%s\"."
@@ -8852,6 +10503,9 @@ msgstr "ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ñ„Ð°Ð¹Ð»Ð°:"
msgid "Invalid product version:"
msgstr "ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ð°:"
+msgid "Windows executables cannot be >= 4 GiB."
+msgstr "ИÑполнÑемые файлы Windows не могут иметь размер >= 4 ГБ."
+
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 "
@@ -8874,6 +10528,12 @@ msgstr ""
"ÐедопуÑтимый полигон. Ð’ режиме «Segments» необходимо по крайней мере 2 точки."
msgid ""
+"The One Way Collision property will be ignored when the parent is an Area2D."
+msgstr ""
+"СвойÑтво One Way Collision будет игнорироватьÑÑ, еÑли родителем ÑвлÑетÑÑ "
+"Area2D."
+
+msgid ""
"A shape must be provided for CollisionShape2D to function. Please create a "
"shape resource for it!"
msgstr ""
@@ -8959,6 +10619,13 @@ msgstr ""
"PathFollow2D работает только при уÑтановке его в качеÑтве дочернего узла "
"Path2D."
+msgid ""
+"A PhysicalBone2D only works with a Skeleton2D or another PhysicalBone2D as a "
+"parent node!"
+msgstr ""
+"PhysicalBone2D работает только Ñо Skeleton2D или другим PhysicalBone2D в "
+"качеÑтве родительÑкого узла!"
+
msgid "Path property must point to a valid Node2D node to work."
msgstr ""
"Ð”Ð»Ñ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾Ð¹ работы ÑвойÑтво Path должно указывать на дейÑтвующий узел "
@@ -8978,6 +10645,17 @@ msgstr ""
"У Ñтой коÑти отÑутÑтвует Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ REST-позициÑ. Перейдите к узлу "
"Skeleton2D и уÑтановите её."
+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, "
+"CharacterBody3D, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon3D Ñлужит формой ÑÑ‚Ð¾Ð»ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ узлам унаÑледованным от "
+"CollisionObject3D.\n"
+"ПожалуйÑта иÑпользуйте его только в качеÑтве дочернего Ð´Ð»Ñ Area3D, "
+"StaticBody3D, RigidBody3D, CharacterBody3D и др. чтобы придать им форму."
+
msgid "Nothing is visible because no mesh has been assigned."
msgstr "Ðичто не видно, потому что не назначена Ñетка."
@@ -9037,6 +10715,13 @@ msgstr ""
"ЛКМ: Применить цвет\n"
"ПКМ: Удалить преÑет"
+msgid ""
+"Color: #%s\n"
+"LMB: Apply color"
+msgstr ""
+"Цвет: #%s\n"
+"ЛКМ: Применить цвет"
+
msgid "Pick a color from the editor window."
msgstr "Выберите цвет в Ñкране редактора."
@@ -9118,6 +10803,16 @@ msgstr ""
"Размер облаÑти проÑмотра должен быть больше или равен 2 пикÑелÑм в обоих "
"измерениÑÑ…, чтобы отобразить что-либо."
+msgid "Unsupported BMFont texture format."
+msgstr "Ðеподдерживаемый формат текÑтуры BMFont."
+
+msgid ""
+"Shader keywords cannot be used as parameter names.\n"
+"Choose another name."
+msgstr ""
+"Ключевые Ñлова шейдера Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать в качеÑтве имен параметров.\n"
+"Выберите другое имÑ."
+
msgid ""
"The sampler port is connected but not used. Consider changing the source to "
"'SamplerPort'."
@@ -9143,6 +10838,12 @@ msgstr "Повторить"
msgid "Invalid comparison function for that type."
msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñтого типа."
+msgid "Invalid arguments for the built-in function: \"%s(%s)\"."
+msgstr "ÐедопуÑтимые аргументы Ð´Ð»Ñ Ð²Ñтроенной функции: «%s(%s)»."
+
+msgid "Invalid assignment of '%s' to '%s'."
+msgstr "ÐедопуÑтимое приÑвоение «%s» в «%s»."
+
msgid "Varying may not be assigned in the '%s' function."
msgstr "Varying не может быть задано в функции «%s»."
@@ -9154,3 +10855,79 @@ msgstr "Ðазначить форму."
msgid "Constants cannot be modified."
msgstr "КонÑтанты не могут быть изменены."
+
+msgid "Cannot convert from '%s' to '%s'."
+msgstr "Ðевозможно преобразовать «%s» в «%s»."
+
+msgid "Expected ')' in expression."
+msgstr "ОжидаетÑÑ Â«)» в выражении."
+
+msgid "No matching constructor found for: '%s'."
+msgstr "Ðе найден подходÑщий конÑтруктор длÑ: «%s»."
+
+msgid "No matching function found for: '%s'."
+msgstr "Ðе найдена подходÑÑ‰Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð´Ð»Ñ: «%s»."
+
+msgid "Invalid arguments to unary operator '%s': %s."
+msgstr "ÐедопуÑтимые аргументы Ð´Ð»Ñ ÑƒÐ½Ð°Ñ€Ð½Ð¾Ð³Ð¾ оператора «%s»: %s."
+
+msgid "Invalid argument to ternary operator: '%s'."
+msgstr "ÐедопуÑтимый аргумент Ð´Ð»Ñ Ñ‚ÐµÑ€Ð½Ð°Ñ€Ð½Ð¾Ð³Ð¾ оператора: «%s»."
+
+msgid "Invalid arguments to operator '%s': '%s'."
+msgstr "ÐедопуÑтимые аргументы Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° «%s»: «%s»."
+
+msgid "Invalid shader type. Valid types are: %s"
+msgstr "Ðеверный тип шейдера. ДопуÑтимые типы: %s"
+
+msgid "Expected an identifier for render mode."
+msgstr "ОжидаетÑÑ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ‚Ð¾Ñ€ режима рендеринга."
+
+msgid "Nested structs are not allowed."
+msgstr "Вложенные Ñтруктуры не допуÑкаютÑÑ."
+
+msgid "Expected data type."
+msgstr "ОжидаетÑÑ Ñ‚Ð¸Ð¿ данных."
+
+msgid "Expected an identifier or '['."
+msgstr "ОжидалÑÑ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ‚Ð¾Ñ€ или '['."
+
+msgid "Empty structs are not allowed."
+msgstr "ПуÑтые Ñтруктуры не допуÑкаютÑÑ."
+
+msgid "The '%s' data type is not supported for uniforms."
+msgstr "Тип данных '%s' не поддерживаетÑÑ ÑƒÐ½Ð¸Ñ„Ð¾Ñ€Ð¼Ð°Ð¼Ð¸."
+
+msgid "Duplicated hint: '%s'."
+msgstr "ДублируетÑÑ Ð¿Ð¾Ð´Ñказка: «%s»."
+
+msgid "Invalid argument name."
+msgstr "ÐедопуÑтимое Ð¸Ð¼Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð°."
+
+msgid "Missing condition."
+msgstr "Пропущено уÑловие."
+
+msgid "Condition evaluation error."
+msgstr "Ошибка вычиÑÐ»ÐµÐ½Ð¸Ñ ÑƒÑловиÑ."
+
+msgid "The const '%s' is declared but never used."
+msgstr "КонÑтанта '%s' объÑвлена, но не иÑпользуетÑÑ."
+
+msgid "The function '%s' is declared but never used."
+msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ '%s' объÑвлена, но не иÑпользуетÑÑ."
+
+msgid "The struct '%s' is declared but never used."
+msgstr "Структура '%s' объÑвлена, но не иÑпользуетÑÑ."
+
+msgid "The uniform '%s' is declared but never used."
+msgstr "Юниформа '%s' объÑвлена, но не иÑпользуетÑÑ."
+
+msgid "The local variable '%s' is declared but never used."
+msgstr "Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ '%s' объÑвлена, но не иÑпользуетÑÑ."
+
+msgid ""
+"The total size of the %s for this shader on this device has been exceeded "
+"(%d/%d). The shader may not work correctly."
+msgstr ""
+"Полный размер %s Ð´Ð»Ñ Ñтого шейдера на Ñтом уÑтройÑтве превышает (%d/%d). "
+"Шейдер может работать некорректно."
diff --git a/editor/translations/editor/sk.po b/editor/translations/editor/sk.po
index cbe2cbaade..5d70b699e1 100644
--- a/editor/translations/editor/sk.po
+++ b/editor/translations/editor/sk.po
@@ -517,9 +517,6 @@ msgstr "Odpojiť"
msgid "Connect a Signal to a Method"
msgstr "Pripojiť Signál k Metóde"
-msgid "Edit Connection:"
-msgstr "Upraviť Pripojenie:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr "Naozaj chcete odstrániť všetky pripojenia z \"%s\" signálu?"
@@ -1289,6 +1286,9 @@ msgstr "Zmeniť veľkosť Array-u"
msgid "Set Multiple:"
msgstr "Nastaviť Viac:"
+msgid "Edit Filters"
+msgstr "Upraviť Filtre"
+
msgid "Language:"
msgstr "Jazyk:"
@@ -1753,23 +1753,6 @@ msgid "Manage Templates"
msgstr "Spravovať Šablóny"
msgid ""
-"This will set up your project for custom Android builds by installing the "
-"source template to \"res://android/build\".\n"
-"You can then apply modifications and build your own custom APK on export "
-"(adding modules, changing the AndroidManifest.xml, etc.).\n"
-"Note that in order to make custom builds instead of using pre-built APKs, "
-"the \"Use Custom Build\" option should be enabled in the Android export "
-"preset."
-msgstr ""
-"Toto pripraví vás projekt pre vlastný Android builds keÄ inÅ¡talujete source "
-"template do \"res://android/build\".\n"
-"Teraz môžete pridať modifikácie a tak vytvoriť vlastné APK na export "
-"(pridávanie modulov, zmeniÅ¥ AndroidManifest.xml, atÄ.).\n"
-"Poznámka že v záujme vytvorenia vlastných zostavení namiesto použitia vopred "
-"vytvorených súborov APK by mala byť v predvoľbe exportu systému Android "
-"povolená možnosť \"Use Costom Build\"."
-
-msgid ""
"The Android build template is already installed in this project and it won't "
"be overwritten.\n"
"Remove the \"res://android/build\" directory manually before attempting this "
@@ -2430,6 +2413,9 @@ msgstr "Vyberte a premiestnite body, vytvorte body z RMB."
msgid "Enable snap and show grid."
msgstr "Povoliť prichytenie a zobraziť mriežku."
+msgid "Blend:"
+msgstr "Blend:"
+
msgid "Point"
msgstr "Bod"
@@ -2474,12 +2460,6 @@ msgstr "Vymazať body a trojuholníky."
msgid "Generate blend triangles automatically (instead of manually)"
msgstr "Vygenerovať blend trojuholníky Automaticky (nie manuálne)"
-msgid "Blend:"
-msgstr "Blend:"
-
-msgid "Edit Filters"
-msgstr "Upraviť Filtre"
-
msgid "Output node can't be added to the blend tree."
msgstr "Nemôžete pridať output node do blend tree."
@@ -2596,9 +2576,6 @@ msgstr "Spusťiť vybranú animáciu odzadu z aktuálnej pozície. (A)"
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "Spustiť vybranú animáciu odzadu z konca. (Shift+A)"
-msgid "Stop animation playback. (S)"
-msgstr "Zastaviť playback animácie. (S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "SpustiÅ¥ vybranú animáciu od zaÄiatku. (Shift+D)"
diff --git a/editor/translations/editor/sv.po b/editor/translations/editor/sv.po
index e75414e9bd..bb8c623dec 100644
--- a/editor/translations/editor/sv.po
+++ b/editor/translations/editor/sv.po
@@ -3,12 +3,12 @@
# Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur.
# This file is distributed under the same license as the Godot source code.
# bergmarklund <davemcgroin@gmail.com>, 2017, 2018.
-# Christoffer Sundbom <christoffer_karlsson@live.se>, 2017, 2021.
+# Christoffer Sundbom <christoffer_karlsson@live.se>, 2017, 2021, 2023.
# Jakob Sinclair <sinclair.jakob@mailbox.org>, 2018.
# . <grenoscar@gmail.com>, 2018, 2020.
# Kristoffer Grundström <kristoffer.grundstrom1983@gmail.com>, 2018.
# Magnus Helander <helander@fastmail.net>, 2018.
-# Daniel K <danielkimblad@hotmail.com>, 2018.
+# Daniel K <danielkimblad@hotmail.com>, 2018, 2023.
# Toiya <elviraa98@gmail.com>, 2019.
# Fredrik Welin <figgemail@gmail.com>, 2019.
# Mattias Münster <mattiasmun@gmail.com>, 2019.
@@ -33,8 +33,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-01-20 11:20+0000\n"
-"Last-Translator: Ludvig Svenonius <ludvig.svenonius@protonmail.com>\n"
+"PO-Revision-Date: 2023-02-09 18:26+0000\n"
+"Last-Translator: Daniel K <danielkimblad@hotmail.com>\n"
"Language-Team: Swedish <https://hosted.weblate.org/projects/godot-engine/"
"godot/sv/>\n"
"Language: sv\n"
@@ -42,11 +42,172 @@ 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.15.1\n"
+"X-Generator: Weblate 4.16-dev\n"
+
+msgid "Unset"
+msgstr "Nollställ"
+
+msgid "Left Mouse Button"
+msgstr "Vänster Musknapp"
+
+msgid "Right Mouse Button"
+msgstr "Höger Musknapp"
+
+msgid "Middle Mouse Button"
+msgstr "Mitten Musknapp"
+
+msgid "Mouse Wheel Up"
+msgstr "Mus Scrollhjul Upp"
+
+msgid "Mouse Wheel Down"
+msgstr "Mus Scrollhjul Ner"
+
+msgid "Mouse Wheel Left"
+msgstr "Mus Scrollhjul Vänster"
+
+msgid "Mouse Wheel Right"
+msgstr "Mus Scrollhjul Höger"
+
+msgid "Mouse Thumb Button 1"
+msgstr "Tum Knapp Mus 1"
+
+msgid "Mouse Thumb Button 2"
+msgstr "Tum Knapp Mus 2"
msgid "Button"
msgstr "Knapp"
+msgid "Double Click"
+msgstr "Dubbelklick"
+
+msgid "Mouse motion at position (%s) with velocity (%s)"
+msgstr "Musrörelse på plats (%s) med hastighet (%s)"
+
+msgid "Left Stick X-Axis, Joystick 0 X-Axis"
+msgstr "Vänster Spak X-Axel, Joystick 0 X-Axel"
+
+msgid "Left Stick Y-Axis, Joystick 0 Y-Axis"
+msgstr "Vänster Spak Y-Axel, Joystick 0 Y-Axel"
+
+msgid "Right Stick X-Axis, Joystick 1 X-Axis"
+msgstr "Höger Spak X-Axel, Joystick 1 X-Axel"
+
+msgid "Right Stick Y-Axis, Joystick 1 Y-Axis"
+msgstr "Höger Spak Y-Axel, Joystick 1 Y-Axel"
+
+msgid "Joystick 2 X-Axis, Left Trigger, Sony L2, Xbox LT"
+msgstr "Joystick 2 X-Axel, Vänster avtryckare, Sony L2, Xbox LT"
+
+msgid "Joystick 2 Y-Axis, Right Trigger, Sony R2, Xbox RT"
+msgstr "Joystick 2 Y-Axel, Höger Avtryckare, Sony R2, Xbox RT"
+
+msgid "Joystick 3 X-Axis"
+msgstr "Joystick 3 X-Axel"
+
+msgid "Joystick 3 Y-Axis"
+msgstr "Joystick 3 Y-Axel"
+
+msgid "Joystick 4 X-Axis"
+msgstr "Joystick 4 X-Axel"
+
+msgid "Joystick 4 Y-Axis"
+msgstr "Joystick 4 Y-Axel"
+
+msgid "Unknown Joypad Axis"
+msgstr "Okänd Joypad Axel"
+
+msgid "Joypad Motion on Axis %d (%s) with Value %.2f"
+msgstr "Joypadrörelse på axel %d (%s) med värde %.2f"
+
+msgid "Bottom Action, Sony Cross, Xbox A, Nintendo B"
+msgstr "Nedre Action, Sony Kryss, Xbox A, Nintendo B"
+
+msgid "Right Action, Sony Circle, Xbox B, Nintendo A"
+msgstr "Höger Action, Sony Cirkel, Xbox B, Nintendo A"
+
+msgid "Left Action, Sony Square, Xbox X, Nintendo Y"
+msgstr "Vänster Action, Sony Fyrkant, Xbox X, Nintendo Y"
+
+msgid "Top Action, Sony Triangle, Xbox Y, Nintendo X"
+msgstr "Övre Action, Sony Triangel, Xbox Y, Nintendo X"
+
+msgid "Back, Sony Select, Xbox Back, Nintendo -"
+msgstr "Tillbaka, Sony Select, XBox Back, Nintendo -"
+
+msgid "Guide, Sony PS, Xbox Home"
+msgstr "Guide, Sony PS, Xbox Home"
+
+msgid "Start, Nintendo +"
+msgstr "Start, Nintendo +"
+
+msgid "Left Stick, Sony L3, Xbox L/LS"
+msgstr "Vänster Spak, Sony L3, XBox L/LS"
+
+msgid "Right Stick, Sony R3, Xbox R/RS"
+msgstr "Höger Spak, Sony R3, Xbox R/RS"
+
+msgid "Left Shoulder, Sony L1, Xbox LB"
+msgstr "Vänster Kantknapp, Sony L1, Xbox LB"
+
+msgid "Right Shoulder, Sony R1, Xbox RB"
+msgstr "Höger Kantknapp, Sony R1, Xbox RB"
+
+msgid "D-pad Up"
+msgstr "Styrknapp Upp"
+
+msgid "D-pad Down"
+msgstr "Styrknapp Ner"
+
+msgid "D-pad Left"
+msgstr "Styrknapp Vänster"
+
+msgid "D-pad Right"
+msgstr "Styrknapp Höger"
+
+msgid "Xbox Share, PS5 Microphone, Nintendo Capture"
+msgstr "Xbox Dela-knappen, PS5 Mikrofon, Nintendo Capture"
+
+msgid "Xbox Paddle 1"
+msgstr "Xbox Paddelknapp 1"
+
+msgid "Xbox Paddle 2"
+msgstr "Xbox Paddelknapp 2"
+
+msgid "Xbox Paddle 3"
+msgstr "Xbox Paddelknapp 3"
+
+msgid "Xbox Paddle 4"
+msgstr "Xbox Paddelknapp 4"
+
+msgid "PS4/5 Touchpad"
+msgstr "PS4/5 Pekplatta"
+
+msgid "touched"
+msgstr "berörd"
+
+msgid "released"
+msgstr "släppt"
+
+msgid "Screen %s at (%s) with %s touch points"
+msgstr "Skärm %s vid (%s) med %s beröringspunkter"
+
+msgid ""
+"Screen dragged with %s touch points at position (%s) with velocity of (%s)"
+msgstr ""
+"Skärm dragen med %s beröringspunkter på position (%s) med hastighet (%s)"
+
+msgid "Magnify Gesture at (%s) with factor %s"
+msgstr "Förstoringsgest vid (%s) med faktor %s"
+
+msgid "Pan Gesture at (%s) with delta (%s)"
+msgstr "Panoreringsgest vid (%s) med delta (%s)"
+
+msgid "MIDI Input on Channel=%s Message=%s"
+msgstr "MIDI Inmatning på Kanel=%s Meddelande=%s"
+
+msgid "Input Event with Shortcut=%s"
+msgstr "Inmatningshändelse med Genväg=%s"
+
msgid "Select"
msgstr "Välj"
@@ -56,6 +217,21 @@ msgstr "Avbryt"
msgid "Up"
msgstr "Upp"
+msgid "Down"
+msgstr "Ner"
+
+msgid "Page Up"
+msgstr "Page Up"
+
+msgid "Page Down"
+msgstr "Page Down"
+
+msgid "Home"
+msgstr "Home"
+
+msgid "End"
+msgstr "End"
+
msgid "Cut"
msgstr "Klipp"
@@ -71,15 +247,114 @@ msgstr "Ã…ngra"
msgid "Redo"
msgstr "Återställ"
+msgid "New Line"
+msgstr "Ny Rad"
+
+msgid "New Blank Line"
+msgstr "Ny Blank Rad"
+
+msgid "New Line Above"
+msgstr "Ny Rad Ovanför"
+
+msgid "Backspace"
+msgstr "Backsteg"
+
+msgid "Backspace Word"
+msgstr "Backsteg Ord"
+
+msgid "Backspace all to Left"
+msgstr "Backsteg alla till Vänster"
+
msgid "Delete"
msgstr "Ta bort"
+msgid "Delete Word"
+msgstr "Ta bort Ord"
+
+msgid "Delete all to Right"
+msgstr "Ta bort alla till Höger"
+
+msgid "Caret Left"
+msgstr "Markör Vänster"
+
+msgid "Caret Word Left"
+msgstr "Markör Ord Vänster"
+
+msgid "Caret Right"
+msgstr "Markör Höger"
+
+msgid "Caret Word Right"
+msgstr "Markör Ord Höger"
+
+msgid "Caret Up"
+msgstr "Markör Upp"
+
+msgid "Caret Down"
+msgstr "Markör Ner"
+
+msgid "Caret Line Start"
+msgstr "Markör Rad Början"
+
+msgid "Caret Line End"
+msgstr "Markör Rad Slut"
+
+msgid "Caret Page Up"
+msgstr "Markör Sida Upp"
+
+msgid "Caret Page Down"
+msgstr "Markör Sida Ner"
+
+msgid "Caret Document Start"
+msgstr "Markör Dokument Början"
+
+msgid "Caret Document End"
+msgstr "Markör Dokument Slut"
+
+msgid "Caret Add Below"
+msgstr "Markör Lägg till Under"
+
+msgid "Caret Add Above"
+msgstr "Markör Lägg till Ovan"
+
+msgid "Scroll Up"
+msgstr "Rulla Upp"
+
+msgid "Scroll Down"
+msgstr "Rulla Ner"
+
msgid "Select All"
msgstr "Välj Alla"
+msgid "Select Word Under Caret"
+msgstr "Välj Ord Under Markör"
+
+msgid "Add Selection for Next Occurrence"
+msgstr "Lägg till Val för Nästa Förekomst"
+
+msgid "Toggle Insert Mode"
+msgstr "Växla Läge Infoga"
+
+msgid "Text Submitted"
+msgstr "Text Skickad"
+
+msgid "Duplicate Nodes"
+msgstr "Dubblerade Noder"
+
+msgid "Delete Nodes"
+msgstr "Ta bort Noder"
+
+msgid "Go Up One Level"
+msgstr "Gå Upp En Nivå"
+
msgid "Refresh"
msgstr "Uppdatera"
+msgid "Show Hidden"
+msgstr "Visa Dolda"
+
+msgid "Swap Input Direction"
+msgstr "Växla Inmatnings-riktning"
+
msgid "Invalid input %d (not passed) in expression"
msgstr "Ogiltig inmatning %d (ej överförd) i uttrycket"
@@ -122,12 +397,54 @@ msgstr "PiB"
msgid "EiB"
msgstr "EiB"
+msgid "Example: %s"
+msgstr "Exempel: %s"
+
+msgid "%d item"
+msgid_plural "%d items"
+msgstr[0] "%d föremål"
+msgstr[1] "%d föremål"
+
+msgid ""
+"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or "
+"'\"'"
+msgstr ""
+"Ogiltigt namn på handling. Det får inte vara tomt eller innehålla '/', ':', "
+"'=', '\\' or '\"'"
+
msgid "An action with the name '%s' already exists."
-msgstr "En process med namnet '%s' existerar redan."
+msgstr "En Handling med namnet '%s' finns redan."
+
+msgid "Add Event"
+msgstr "Lägg till Händelse"
+
+msgid "Remove Action"
+msgstr "Ta bort Handling"
+
+msgid "Cannot Remove Action"
+msgstr "Kan inte ta bort Handling"
+
+msgid "Edit Event"
+msgstr "Redigera Händelse"
+
+msgid "Remove Event"
+msgstr "Ta bort Händelse"
+
+msgid "Filter by name..."
+msgstr "Filtrera efter namn..."
+
+msgid "Clear All"
+msgstr "Rensa Alla"
+
+msgid "Add New Action"
+msgstr "Lägg till ny Handling"
msgid "Add"
msgstr "Lägg till"
+msgid "Show Built-in Actions"
+msgstr "Visa Inbyggda Handlingar"
+
msgid "Action"
msgstr "Åtgärd"
@@ -269,12 +586,29 @@ msgstr "Ändra Animationsinterpoleringsläge"
msgid "Change Animation Loop Mode"
msgstr "Ändra Animationsslingläge"
+msgid ""
+"Compressed tracks can't be edited or removed. Re-import the animation with "
+"compression disabled in order to edit."
+msgstr ""
+"Komprimerade spår kan inte redigeras eller tas bort. Du måste importera "
+"animationen på nytt med komprimeringen inaktiverad för att kunna redigera "
+"den."
+
msgid "Remove Anim Track"
msgstr "Ta bort Anim spår"
+msgid "Create new track for %s and insert key?"
+msgstr "Skapa ett nytt spår för %s och infoga nyckel?"
+
+msgid "Create %d new tracks and insert keys?"
+msgstr "Skapa %d nya spår och infoga nycklar?"
+
msgid "Create"
msgstr "Skapa"
+msgid "Animation Insert Key"
+msgstr "Infoga animeringsnyckel"
+
msgid "node '%s'"
msgstr "nod '%s'"
@@ -294,6 +628,10 @@ msgstr "Ändra Animationssteg"
msgid "Rearrange Tracks"
msgstr "Ändra ordning på spår"
+msgid "Position/Rotation/Scale 3D tracks only apply to 3D-based nodes."
+msgstr ""
+"3D-spår för position/rotation/skala gäller endast för 3D-baserade noder."
+
msgid ""
"Audio tracks can only point to nodes of type:\n"
"-AudioStreamPlayer\n"
@@ -320,6 +658,18 @@ msgstr "Lägg till Bezier-spår"
msgid "Track path is invalid, so can't add a key."
msgstr "Kurva är felaktig så det går inte att skapa en nyckel."
+msgid "Track is not of type Node3D, can't insert key"
+msgstr "Spåret är inte av typen Node3D, kan inte infoga nyckel"
+
+msgid "Add Position Key"
+msgstr "Lägg till positionsnyckel"
+
+msgid "Add Rotation Key"
+msgstr "Lägg till Rotation Key"
+
+msgid "Add Scale Key"
+msgstr "Lägg till skalningsnyckel"
+
msgid "Add Track Key"
msgstr "Lägg till spårnyckel"
@@ -329,9 +679,15 @@ msgstr "Spårväg ogiltig, kan således inte lägga till en metod nyckel."
msgid "Add Method Track Key"
msgstr "Lägg till metodspårnyckel"
+msgid "Animation Move Keys"
+msgstr "Animation Flyttknappar"
+
msgid "Scale"
msgstr "Skala"
+msgid "BlendShape"
+msgstr "BlendShape"
+
msgid "Methods"
msgstr "Metoder"
@@ -344,18 +700,56 @@ msgstr "Klippbordet är tomt!"
msgid "Paste Tracks"
msgstr "Klistra in spår"
+msgid "Animation Scale Keys"
+msgstr "Tangenter för animerade skalor"
+
+msgid "Make Easing Keys"
+msgstr "Gör lättnadstangenter"
+
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
msgstr ""
"Detta alternativ fungerar ej för att redigera Bezier, då det enbart är ett "
"spår."
+msgid "Animation Add RESET Keys"
+msgstr "Animering Lägg till RESET-tangenter"
+
+msgid "Bake Animation as Linear keys."
+msgstr "Bake Animation som linjära nycklar."
+
+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 ""
+"Denna animationen tillhör en importerad scen, så ändringar i de importerade "
+"spåren kommer inte sparas.\n"
+"\n"
+"För att aktivera förmågan att lägga till anpassade spår, navigera till "
+"scenens import inställningar och ställ in\n"
+"\"Animation > Lagring\" till \"Filer\", aktivera \"Animation > Behåll "
+"Anpassade Spår\", sedan importera om.\n"
+"Alternativt, använd en importförinställning som importerar animationer till "
+"separata filer."
+
msgid "Warning: Editing imported animation"
msgstr "Varning: Redigerar importerad animation"
msgid "Select an AnimationPlayer node to create and edit animations."
msgstr "Välj en AnimationsSpelar-nod för att skapa och redigera animationer."
+msgid "Imported Scene"
+msgstr "Importerad Scen"
+
+msgid "Toggle between the bezier curve editor and track editor."
+msgstr "Växla mellan redigeringen av bezierkurvor och spårredigeringen."
+
msgid "Only show tracks from nodes selected in tree."
msgstr "Visa enbart spår från valda noder i trädet."
@@ -389,6 +783,9 @@ msgstr "Skala urval"
msgid "Scale From Cursor"
msgstr "Skala Från Muspekare"
+msgid "Make Easing Selection"
+msgstr "Gör ett val för lättnader"
+
msgid "Duplicate Selection"
msgstr "Fördubbla val"
@@ -407,15 +804,30 @@ msgstr "Gå till Föregående Steg"
msgid "Apply Reset"
msgstr "Verkställ återställning"
+msgid "Bake Animation"
+msgstr "Baka Animering"
+
+msgid "Optimize Animation (no undo)"
+msgstr "Optimera Animering (ingen ångra)"
+
+msgid "Clean-Up Animation (no undo)"
+msgstr "Uppstädning av Animation (inget att ångra)"
+
msgid "Use Bezier Curves"
msgstr "Använd Bezier-kurvor"
msgid "Anim. Optimizer"
msgstr "Anim. Optimerare"
+msgid "Max. Velocity Error:"
+msgstr "Max. Hastighetsfel:"
+
msgid "Max. Angular Error:"
msgstr "Max. Vinkel-fel:"
+msgid "Max. Precision Error:"
+msgstr "Max. Precisionsfel:"
+
msgid "Optimize"
msgstr "Optimera"
@@ -437,12 +849,21 @@ msgstr "Städa upp"
msgid "Scale Ratio:"
msgstr "Skalnings förhållande:"
+msgid "Select Transition and Easing"
+msgstr "Välj Övergång och Lättnad"
+
+msgid "Anim. Baker"
+msgstr "Anim. Bakare"
+
msgid "Select Tracks to Copy"
msgstr "Välj Spår att Kopiera"
msgid "Select All/None"
msgstr "Välj Alla/Inga"
+msgid "Animation Change Keyframe Time"
+msgstr "Ändra Tidsnyckelns Tid på Animationen"
+
msgid "Add Audio Track Clip"
msgstr "Lägg till Ljudspårsklipp"
@@ -461,6 +882,16 @@ msgstr "Radnummer:"
msgid "%d replaced."
msgstr "%d ersatt."
+msgid "%d match"
+msgid_plural "%d matches"
+msgstr[0] "%d matcha"
+msgstr[1] "%d matchar"
+
+msgid "%d of %d match"
+msgid_plural "%d of %d matches"
+msgstr[0] "%d av %d matcha"
+msgstr[1] "%d av %d matchar"
+
msgid "Match Case"
msgstr "Matcha gemener/versaler"
@@ -531,6 +962,12 @@ msgstr "Lägg till extra Call Argument:"
msgid "Extra Call Arguments:"
msgstr "Extra Call Argument:"
+msgid "Allows to drop arguments sent by signal emitter."
+msgstr "Gör det möjligt att släppa argument som skickas av signalgivaren."
+
+msgid "Unbind Signal Arguments:"
+msgstr "Koppla bort signalargument:"
+
msgid "Receiver Method:"
msgstr "Mottagarmetod:"
@@ -561,6 +998,9 @@ msgstr "Anslut"
msgid "Signal:"
msgstr "Signal:"
+msgid "No description."
+msgstr "Ingen beskrivning."
+
msgid "Connect '%s' to '%s'"
msgstr "Anslut '%s' till '%s'"
@@ -579,27 +1019,33 @@ msgstr "Koppla från"
msgid "Connect a Signal to a Method"
msgstr "Anslut en Signal till en Metod"
-msgid "Edit Connection:"
-msgstr "Redigera Koppling:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr "Är du säker att du vill ta bort alla kopplingar från \"%s\" signalen?"
msgid "Signals"
msgstr "Signaler"
+msgid "Filter Signals"
+msgstr "Filtersignaler"
+
msgid "Are you sure you want to remove all connections from this signal?"
msgstr "Är du säker att du vill ta bort alla kopplingar från denna signal?"
msgid "Disconnect All"
msgstr "Koppla av alla"
+msgid "Copy Name"
+msgstr "Kopiera namn"
+
msgid "Edit..."
msgstr "Ändra..."
msgid "Go to Method"
msgstr "GÃ¥ till metod"
+msgid "Change Type of \"%s\""
+msgstr "Ändra typ av \"%s\""
+
msgid "Change"
msgstr "Ändra"
@@ -609,6 +1055,12 @@ msgstr "Skapa Ny %s"
msgid "No results for \"%s\"."
msgstr "Inga resultat för \"%s\"."
+msgid "This class is marked as deprecated."
+msgstr "Den här klassen är markerad som inaktuell."
+
+msgid "This class is marked as experimental."
+msgstr "Denna klass är markerad som experimentell."
+
msgid "No description available for %s."
msgstr "Ingen beskrivning tillgänglig för %s."
@@ -618,6 +1070,9 @@ msgstr "Favoriter:"
msgid "Recent:"
msgstr "Senaste:"
+msgid "(Un)favorite selected item."
+msgstr "(Av)favoritmarkerat objekt."
+
msgid "Search:"
msgstr "Sök:"
@@ -636,6 +1091,18 @@ msgstr "Kopiera Nod-Sökväg"
msgid "Instance:"
msgstr "Instans:"
+msgid ""
+"This node has been instantiated from a PackedScene file:\n"
+"%s\n"
+"Click to open the original file in the Editor."
+msgstr ""
+"Den här noden har installerats från en PackedScene-fil:\n"
+"%s\n"
+"Klicka för att öppna originalfilen i redigeraren."
+
+msgid "ms"
+msgstr "ms"
+
msgid "Value"
msgstr "Värde"
@@ -672,18 +1139,57 @@ msgstr "Namn"
msgid "Time"
msgstr "Tid"
+msgid "Fit to Frame"
+msgstr "Anpassa till ram"
+
+msgid "Linked"
+msgstr "Länkad"
+
+msgid "CPU"
+msgstr "PROCESSOR"
+
+msgid "GPU"
+msgstr "GPU"
+
+msgid "Execution resumed."
+msgstr "Utförandet har återupptagits."
+
msgid "Warning:"
msgstr "Varning:"
msgid "Error:"
msgstr "Fel:"
-msgid "Source"
-msgstr "Källa"
+msgid "Stack Trace:"
+msgstr "Stackspårning:"
+
+msgid "Debug session started."
+msgstr "Felsökningssessionen har påbörjats."
+
+msgid "Debug session closed."
+msgstr "Felsökningssessionen är avslutad."
+
+msgid "Line %d"
+msgstr "Linje %d"
+
+msgid "Delete Breakpoint"
+msgstr "Ta bort brytpunkt"
+
+msgid "Delete All Breakpoints in:"
+msgstr "Ta bort alla brytpunkter i:"
+
+msgid "Delete All Breakpoints"
+msgstr "Ta bort alla brytpunkter"
msgid "C++ Source"
msgstr "C++ Källa"
+msgid "Filter Stack Variables"
+msgstr "Filtrera stackvariabler"
+
+msgid "Visual Profiler"
+msgstr "Visuell profilering"
+
msgid "Total:"
msgstr "Totalt:"
@@ -743,6 +1249,12 @@ msgstr "Öppna Scen"
msgid "Owners of: %s (Total: %d)"
msgstr "Ägare av: %s (Totalt: %d)"
+msgid "Localization remap"
+msgstr "Ommappning av lokalisering"
+
+msgid "Localization remap for path '%s' and locale '%s'."
+msgstr "Lokaliseringsomvandling för sökvägen %s och språket %s."
+
msgid ""
"Remove the selected files from the project? (Cannot be undone.)\n"
"Depending on your filesystem configuration, the files will either be moved "
@@ -946,6 +1458,12 @@ msgstr "Dämpa"
msgid "Bypass"
msgstr "Gå förbi"
+msgid "Duplicate Bus"
+msgstr "Duplicera buss"
+
+msgid "Delete Bus"
+msgstr "Radera buss"
+
msgid "Reset Volume"
msgstr "Återställ Volym"
@@ -1024,18 +1542,27 @@ msgstr "Giltiga tecken:"
msgid "Must not collide with an existing engine class name."
msgstr "FÃ¥r inte vara samma som ett befintligt engine class-namn."
+msgid "Must not collide with an existing global script class name."
+msgstr "FÃ¥r inte vara samma som ett befintligt globalt konstant-namn."
+
msgid "Must not collide with an existing built-in type name."
msgstr "FÃ¥r inte vara samma som ett befintligt inbyggt typ-namn."
msgid "Must not collide with an existing global constant name."
msgstr "FÃ¥r inte vara samma som ett befintligt globalt konstant-namn."
+msgid "Keyword cannot be used as an Autoload name."
+msgstr "Nyckelord kan inte användas som ett autoladdningsnamn."
+
msgid "Autoload '%s' already exists!"
msgstr "Autoload '%s' finns redan!"
msgid "Rename Autoload"
msgstr "Byt namn på Autload"
+msgid "Toggle Autoload Globals"
+msgstr "Växla AutoLoad Globals"
+
msgid "Move Autoload"
msgstr "Flytta Autoload"
@@ -1048,12 +1575,18 @@ msgstr "Aktivera"
msgid "Rearrange Autoloads"
msgstr "Ändra ordning på Autoloads"
+msgid "Can't add Autoload:"
+msgstr "Kunde inte lägga till Auto laddning:"
+
msgid "%s is an invalid path. File does not exist."
msgstr "%s är en ogiltig genväg. Filen existerar inte."
msgid "%s is an invalid path. Not in resource path (res://)."
msgstr "%s är en ogiltig genväg. Inte i resurs-genväg (res://)."
+msgid "Add Autoload"
+msgstr "Lägg till Auto laddning"
+
msgid "Path:"
msgstr "Sökväg:"
@@ -1063,12 +1596,71 @@ msgstr "Node Namn:"
msgid "Global Variable"
msgstr "Global variabel"
+msgid "3D Engine"
+msgstr "3D motor"
+
msgid "2D Physics"
msgstr "2D-Fysik"
msgid "3D Physics"
msgstr "3D-Fysik"
+msgid "XR"
+msgstr "XR"
+
+msgid "RenderingDevice"
+msgstr "Renderare"
+
+msgid "Vulkan"
+msgstr "Vulkan"
+
+msgid "Text Server: Fallback"
+msgstr "Textserver: Fallback"
+
+msgid "Text Server: Advanced"
+msgstr "Textserver: Avancerad"
+
+msgid "TTF, OTF, Type 1, WOFF1 Fonts"
+msgstr "TTF, OTF, Typ 1, WOFF1-teckensnitt"
+
+msgid "WOFF2 Fonts"
+msgstr "WOFF2-teckensnitt"
+
+msgid "SIL Graphite Fonts"
+msgstr "SIL Graphite-teckensnitt"
+
+msgid "Multi-channel Signed Distance Field Font Rendering"
+msgstr "Rendering av tecknade distansfält med flera kanaler för teckensnitt"
+
+msgid "3D Nodes as well as RenderingServer access to 3D features."
+msgstr "3D Noder samt RenderingServer tillgång till 3D-funktioner."
+
+msgid "2D Physics nodes and PhysicsServer2D."
+msgstr "2D-fysiknoder och PhysicsServer2D."
+
+msgid "3D Physics nodes and PhysicsServer3D."
+msgstr "3D-fysiknoder och PhysicsServer3D."
+
+msgid "Navigation, both 2D and 3D."
+msgstr "Navigering, både 2D och 3D."
+
+msgid "XR (AR and VR)."
+msgstr "XR (AR och VR)."
+
+msgid ""
+"RenderingDevice based rendering (if disabled, the OpenGL back-end is "
+"required)."
+msgstr ""
+"RenderingDevice-baserad rendering (om den är inaktiverad krävs OpenGL-"
+"serverdelen)."
+
+msgid ""
+"OpenGL back-end (if disabled, the RenderingDevice back-end is required)."
+msgstr "OpenGL-backend (om den är inaktiverad krävs RenderingDevice-backend)."
+
+msgid "Vulkan back-end of RenderingDevice."
+msgstr "Vulkan-back-end av RenderingDevice."
+
msgid "File '%s' format is invalid, import aborted."
msgstr "Fil '%s''s format är ogiltig, import avbruten."
@@ -1350,6 +1942,12 @@ msgstr "Egenskaper"
msgid "default:"
msgstr "standard:"
+msgid "Constructors"
+msgstr "Konstruktör"
+
+msgid "Operators"
+msgstr "Operatorer"
+
msgid "Theme Properties"
msgstr "Tema Egenskaper"
@@ -1360,7 +1958,7 @@ msgid "Enumerations"
msgstr "Uppräkningar"
msgid "Property Descriptions"
-msgstr "Egenskapsbeskrivningar"
+msgstr "Egendomsbeskrivning"
msgid ""
"There is currently no description for this property. Please help us by "
@@ -1369,9 +1967,15 @@ msgstr ""
"Det finns för närvarande ingen beskrivning för denna egenskap. Snälla hjälp "
"oss genom att [color=$color][url=$url]bidra med en[/url][/color]!"
+msgid "Constructor Descriptions"
+msgstr "Konstruktör beskrivning"
+
msgid "Method Descriptions"
msgstr "Metodbeskrivning"
+msgid "Operator Descriptions"
+msgstr "Operator beskrivning"
+
msgid "%d match."
msgstr "%d matcha."
@@ -1402,6 +2006,9 @@ msgstr "Ändra storlek på Array"
msgid "Set Multiple:"
msgstr "Sätt Flera:"
+msgid "Edit Filters"
+msgstr "Redigera Filter"
+
msgid "Language:"
msgstr "Språk:"
@@ -2207,9 +2814,6 @@ msgstr "Triangel existerar redan."
msgid "Parameter Changed:"
msgstr "Parameter ändrad:"
-msgid "Edit Filters"
-msgstr "Redigera Filter"
-
msgid "Node Moved"
msgstr "Nod Flyttad"
@@ -2598,6 +3202,9 @@ msgstr "Kasta"
msgid "Standard"
msgstr "Standard"
+msgid "Source"
+msgstr "Källa"
+
msgid ""
"Missing connected method '%s' for signal '%s' from node '%s' to node '%s'."
msgstr ""
@@ -2648,9 +3255,6 @@ msgstr "(tom)"
msgid "Animations:"
msgstr "Animationer:"
-msgid "Loop"
-msgstr "Slinga"
-
msgid "Updating the editor"
msgstr "Uppdaterar editorn"
diff --git a/editor/translations/editor/th.po b/editor/translations/editor/th.po
index 661f212c82..b93243806a 100644
--- a/editor/translations/editor/th.po
+++ b/editor/translations/editor/th.po
@@ -496,6 +496,9 @@ msgstr "จาà¸à¸ªà¸±à¸à¸à¸²à¸“:"
msgid "Scene does not contain any script."
msgstr "ไม่มีสคริปต์ในฉาà¸"
+msgid "Select Method"
+msgstr "เลือà¸à¹€à¸¡à¸—็อด"
+
msgid "Remove"
msgstr "ลบ"
@@ -551,9 +554,6 @@ msgstr "ลบà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¹‚ยง"
msgid "Connect a Signal to a Method"
msgstr "เชื่อมต่อสัà¸à¸à¸²à¸“ไปยังเมธอด"
-msgid "Edit Connection:"
-msgstr "à¹à¸à¹‰à¹„ขà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•à¹ˆà¸­:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr "คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¸«à¸£à¸·à¸­à¸§à¹ˆà¸²à¸ˆà¸°à¸¥à¸šà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•à¹ˆà¸­à¸—ั้งหมดจาà¸à¸ªà¸±à¸à¸à¸²à¸“ \"%s\"?"
@@ -674,30 +674,15 @@ msgstr "คำเตือน:"
msgid "Error:"
msgstr "ผิดพลาด:"
-msgid "C++ Error"
-msgstr "C++ ผิดพลาด"
-
-msgid "C++ Error:"
-msgstr "C++ ผิดพลาด:"
-
-msgid "Source"
-msgstr "ต้นฉบับ"
-
-msgid "C++ Source"
-msgstr "C++ ต้นฉบับ"
-
-msgid "Source:"
-msgstr "ต้นฉบับ:"
-
-msgid "C++ Source:"
-msgstr "C++ ต้นฉบับ:"
-
msgid "Stack Trace"
msgstr "à¹à¸—ร็à¸à¸ªà¹à¸•à¸„"
msgid "Copy Error"
msgstr "คัดลอà¸à¸œà¸´à¸”พลาด"
+msgid "C++ Source"
+msgstr "C++ ต้นฉบับ"
+
msgid "Video RAM"
msgstr "หน่วยความจำวีดีโอ"
@@ -1514,12 +1499,12 @@ msgstr "à¹à¸ªà¸”งทุà¸à¸ à¸¹à¸¡à¸´à¸ à¸²à¸„"
msgid "Show Selected Locales Only"
msgstr "à¹à¸ªà¸”งเฉพาะภภายในเท่านั้น"
+msgid "Edit Filters"
+msgstr "à¹à¸à¹‰à¹„ขตัวà¸à¸£à¸­à¸‡"
+
msgid "Language:"
msgstr "ภาษา:"
-msgid "Script"
-msgstr "สคริปต์"
-
msgid "Clear Output"
msgstr "เคลียร์เอาต์พุต"
@@ -1962,22 +1947,6 @@ msgid "Manage Templates"
msgstr "จัดà¸à¸²à¸£à¹€à¸—มเพลต"
msgid ""
-"This will set up your project for custom Android builds by installing the "
-"source template to \"res://android/build\".\n"
-"You can then apply modifications and build your own custom APK on export "
-"(adding modules, changing the AndroidManifest.xml, etc.).\n"
-"Note that in order to make custom builds instead of using pre-built APKs, "
-"the \"Use Custom Build\" option should be enabled in the Android export "
-"preset."
-msgstr ""
-"นี่จะตั้งค่าโปรเจคต์ของคุณสำหรับà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¸ªà¸³à¸«à¸£à¸±à¸š Android ที่à¸à¸³à¸«à¸™à¸”เอง "
-"โดยà¸à¸²à¸£à¸•à¸´à¸”ตั้งเทมเพลตต้นฉบับไปยัง \"res: // android / build\"\n"
-"คุณสามารถปรับเปลี่ยนà¹à¸¥à¸°à¸ªà¸£à¹‰à¸²à¸‡ APK à¹à¸šà¸šà¸à¸³à¸«à¸™à¸”เองสำหรับส่งออภ(เพิ่มโมดูล, เปลี่ยน "
-"AndroidManifest.xml เป็นต้น)\n"
-"โปรดทราบว่าในà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¹à¸šà¸šà¸à¸³à¸«à¸™à¸”เองà¹à¸—นที่จะใช้ APK ที่สร้างไว้ล่วงหน้า ควรเปิดใช้ตัวเลือภ"
-"\"Use Custom Build\" ในพรีเซ็ตà¸à¸²à¸£à¸ªà¹ˆà¸‡à¸­à¸­à¸à¸‚อง Android"
-
-msgid ""
"The Android build template is already installed in this project and it won't "
"be overwritten.\n"
"Remove the \"res://android/build\" directory manually before attempting this "
@@ -2766,6 +2735,9 @@ msgstr "เลือà¸à¸«à¸£à¸·à¸­à¹€à¸¥à¸·à¹ˆà¸­à¸™à¸ˆà¸¸à¸” สร้างà¸
msgid "Enable snap and show grid."
msgstr "เปิà¸à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸à¸²à¸£à¹€à¸‚้าหาà¹à¸¥à¹à¸ªà¸”งเส้นà¸à¸£à¸´à¸”"
+msgid "Blend:"
+msgstr "ผสม:"
+
msgid "Point"
msgstr "จุด"
@@ -2808,12 +2780,6 @@ msgstr "ลบจุดà¹à¸¥à¸°à¸ªà¸²à¸¡à¹€à¸«à¸¥à¸µà¹ˆà¸¢à¸¡"
msgid "Generate blend triangles automatically (instead of manually)"
msgstr "สร้างสามเหลี่ยม blend อัตโนมัติ (à¹à¸—นที่à¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¹à¸šà¸šà¸›à¸à¸•à¸´)"
-msgid "Blend:"
-msgstr "ผสม:"
-
-msgid "Edit Filters"
-msgstr "à¹à¸à¹‰à¹„ขตัวà¸à¸£à¸­à¸‡"
-
msgid "Output node can't be added to the blend tree."
msgstr "โหนดเอาซ์พุตไม่สามารถเพิ่มไปยัง blend tree"
@@ -2927,9 +2893,6 @@ msgstr "เล่นà¹à¸­à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¸—ี่เลือà¸à¸¢à¹‰à¸­
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "เล่นà¹à¸­à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¸—ี่เลือà¸à¸¢à¹‰à¸­à¸™à¸«à¸¥à¸±à¸‡à¸ˆà¸²à¸à¸—้ายสุด (Shift+A)"
-msgid "Stop animation playback. (S)"
-msgstr "หยุดà¸à¸²à¸£à¹€à¸¥à¹ˆà¸™à¹à¸­à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™ (S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "เล่นà¹à¸­à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¸—ี่เลือà¸à¸ˆà¸²à¸à¹€à¸£à¸´à¹ˆà¸¡à¸•à¹‰à¸™ (Shift+D)"
@@ -3950,12 +3913,6 @@ msgstr "à¹à¸à¹‰à¹„ข Notifier AABB"
msgid "Change Particles AABB"
msgstr "à¹à¸à¹‰à¹„ข Particles AABB"
-msgid "Change Box Shape Extents"
-msgstr "ปรับขนาดทรงสี่เหลี่ยม"
-
-msgid "Change Probe Extents"
-msgstr "à¹à¸à¹‰à¹„ขขนาด Probe"
-
msgid "Change Capsule Shape Radius"
msgstr "ปรับรัศมีทรงà¹à¸„ปซูล"
@@ -4671,6 +4628,9 @@ msgstr "มาตรà¸à¸²à¸™"
msgid "Connections to method:"
msgstr "เชื่อมไปยังเมธอด:"
+msgid "Source"
+msgstr "ต้นฉบับ"
+
msgid "Target"
msgstr "เป้าหมาย"
@@ -4891,12 +4851,6 @@ msgstr "(ว่างเปล่า)"
msgid "Animations:"
msgstr "à¹à¸­à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™:"
-msgid "Speed:"
-msgstr "ความเร็ว:"
-
-msgid "Loop"
-msgstr "วน"
-
msgid "Animation Frames:"
msgstr "เฟรมà¹à¸­à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™:"
@@ -5743,9 +5697,6 @@ msgstr "เพิ่มà¸à¸²à¸£à¸à¸£à¸°à¸—ำ"
msgid "Change Action deadzone"
msgstr "เปลี่ยน Action deadzone"
-msgid "Add Input Action Event"
-msgstr "เพิ่มปุ่มà¸à¸”ของà¸à¸²à¸£à¸à¸£à¸°à¸—ำ"
-
msgid "Erase Input Action"
msgstr "ลบà¸à¸²à¸£à¸à¸£à¸°à¸—ำ"
@@ -5773,9 +5724,6 @@ msgstr "เลือà¸à¸„ุณสมบัติ"
msgid "Select Virtual Method"
msgstr "เลือà¸à¹€à¸¡à¸—็อด"
-msgid "Select Method"
-msgstr "เลือà¸à¹€à¸¡à¸—็อด"
-
msgid "Batch Rename"
msgstr "เปลี่ยนชื่อหลายรายà¸à¸²à¸£"
@@ -6426,12 +6374,6 @@ msgstr "public key ผิดพลาดสำหรับ APK expansion"
msgid "Invalid package name:"
msgstr "ชื่อà¹à¸žà¹‡à¸„เà¸à¸ˆà¸œà¸´à¸”พลาด:"
-msgid "\"Use Custom Build\" must be enabled to use the plugins."
-msgstr "\"Use Custom Build\" จำเป็นต้องเปิดà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸«à¸²à¸à¸ˆà¸°à¹ƒà¸Šà¹‰à¸›à¸¥à¸±à¹Šà¸à¸­à¸´à¸™"
-
-msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled."
-msgstr "\"Export AAB\" จะใช้ได้เฉพาะเมื่อเปิดใช้งาน \"Use Custom Build\""
-
msgid "Invalid filename! Android App Bundle requires the *.aab extension."
msgstr "ชื่อไฟล์ผิดพลาด! à¹à¸­à¸™à¸”รอยด์à¹à¸­à¸›à¸šà¸±à¸™à¹€à¸”ิลจำเป็นต้องมีนามสà¸à¸¸à¸¥ *.aab"
@@ -6441,12 +6383,6 @@ msgstr "à¸à¸²à¸£à¸‚ยาย APK เข้าà¸à¸±à¸™à¹„ม่ได้à¸à¸±à
msgid "Invalid filename! Android APK requires the *.apk extension."
msgstr "ชื่อไฟล์ผิดพลาด! à¹à¸­à¸™à¸”รอยด์ APK จำเป็นต้องมีนามสà¸à¸¸à¸¥ *.apk"
-msgid ""
-"Trying to build from a custom built template, but no version info for it "
-"exists. Please reinstall from the 'Project' menu."
-msgstr ""
-"พยายามสร้างจาà¸à¹€à¸—มเพลตที่สร้างขึ้นเอง à¹à¸•à¹ˆà¹„ม่มีข้อมูลเวอร์ชัน โปรดติดตั้งใหม่จาà¸à¹€à¸¡à¸™à¸¹ \"โปรเจà¸à¸•à¹Œ\""
-
msgid "Building Android Project (gradle)"
msgstr "à¸à¸³à¸¥à¸±à¸‡à¸ªà¸£à¹‰à¸²à¸‡à¹‚ปรเจคà¹à¸­à¸™à¸”รอยด์ (gradle)"
diff --git a/editor/translations/editor/tr.po b/editor/translations/editor/tr.po
index 5c845faf1a..8710f48c5b 100644
--- a/editor/translations/editor/tr.po
+++ b/editor/translations/editor/tr.po
@@ -89,13 +89,14 @@
# Dream Drunk <myemailpoly149@gmail.com>, 2022.
# alpdenthedev <ekrem_ekrem_45@hotmail.com>, 2022.
# Muhammed Said Gülberk <msgulberk@gmail.com>, 2022.
+# Cave Johnson <aperturelabs123@proton.me>, 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: 2022-12-05 10:16+0000\n"
-"Last-Translator: Muhammed Said Gülberk <msgulberk@gmail.com>\n"
+"PO-Revision-Date: 2023-02-09 09:37+0000\n"
+"Last-Translator: Cave Johnson <aperturelabs123@proton.me>\n"
"Language-Team: Turkish <https://hosted.weblate.org/projects/godot-engine/"
"godot/tr/>\n"
"Language: tr\n"
@@ -103,11 +104,35 @@ 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.15-dev\n"
+"X-Generator: Weblate 4.16-dev\n"
+
+msgid "Unset"
+msgstr "BelirtilmemiÅŸ"
msgid "Physical"
msgstr "Fiziksel"
+msgid "Left Mouse Button"
+msgstr "Sol Fare Düğmesi"
+
+msgid "Right Mouse Button"
+msgstr "Sağ Fare Düğmesi"
+
+msgid "Middle Mouse Button"
+msgstr "Orta Fare Düğmesi"
+
+msgid "Mouse Wheel Up"
+msgstr "Fare Tekerleği Yukarı"
+
+msgid "Mouse Wheel Down"
+msgstr "Fare Tekerleği Aşağı."
+
+msgid "Mouse Wheel Left"
+msgstr "Sol Fare Tekerlek Düğmesi"
+
+msgid "Mouse Wheel Right"
+msgstr "Sağ Fare Tekerlek Düğmesi"
+
msgid "Button"
msgstr "Düğme"
@@ -655,6 +680,9 @@ msgstr "Sinyaller:"
msgid "Scene does not contain any script."
msgstr "Sahne hiç komut içermiyor."
+msgid "Select Method"
+msgstr "Metot Seç"
+
msgid "Remove"
msgstr "Kaldır"
@@ -710,9 +738,6 @@ msgstr "Bağlantıyı kes"
msgid "Connect a Signal to a Method"
msgstr "Bir Yönteme Bir Sinyal Bağlayın"
-msgid "Edit Connection:"
-msgstr "Bağlantıyı Düzenle:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
"\"%s\" sinyalinden tüm bağlantıları kaldırmak istediğinizden emin misiniz?"
@@ -855,23 +880,8 @@ msgstr "Uyarılar:"
msgid "Error:"
msgstr "Hata:"
-msgid "C++ Error"
-msgstr "C++ Hatası"
-
-msgid "C++ Error:"
-msgstr "C++ Hatası:"
-
-msgid "Source"
-msgstr "Kaynak"
-
-msgid "C++ Source"
-msgstr "C++ Kaynağı"
-
-msgid "Source:"
-msgstr "Kaynak:"
-
-msgid "C++ Source:"
-msgstr "C++ Kaynak:"
+msgid "%s Error"
+msgstr "%s Hatası"
msgid "Stack Trace"
msgstr "Bellek Dökümü"
@@ -882,6 +892,9 @@ msgstr "Hatayı Kopyala"
msgid "Open C++ Source on GitHub"
msgstr "GitHub'da C++ Kaynağını Açın"
+msgid "C++ Source"
+msgstr "C++ Kaynağı"
+
msgid "Video RAM"
msgstr "Görüntü Belleği"
@@ -1847,12 +1860,12 @@ msgstr "Tüm Dilleri Göster"
msgid "Show Selected Locales Only"
msgstr "Sadece Seçili Dilleri Göster"
+msgid "Edit Filters"
+msgstr "Süzgeçleri Düzenle"
+
msgid "Language:"
msgstr "Dil:"
-msgid "Script"
-msgstr "Betik"
-
msgid "Variant"
msgstr "Varyant"
@@ -2406,24 +2419,6 @@ msgid "Install from file"
msgstr "Dosyadan Kur"
msgid ""
-"This will set up your project for custom Android builds by installing the "
-"source template to \"res://android/build\".\n"
-"You can then apply modifications and build your own custom APK on export "
-"(adding modules, changing the AndroidManifest.xml, etc.).\n"
-"Note that in order to make custom builds instead of using pre-built APKs, "
-"the \"Use Custom Build\" option should be enabled in the Android export "
-"preset."
-msgstr ""
-"Bu, kaynak şablonunu \"res://android/build\" dizinine kurarak projenizi özel "
-"Android derlemeleri için ayarlayacaktır.\n"
-"Daha sonra dışa aktarırken değişiklikleri uygulayabilir ve kendi özel "
-"APK'nızı oluşturabilirsiniz (modül ekleme, AndroidManifest.xml dosyasını "
-"deÄŸiÅŸtirme vb.).\n"
-"Önceden oluşturulmuş APK'ları kullanmak yerine özel derlemeler yapmak için "
-"Android dışa aktarma ön ayarında \"Özel Derleme Kullan\" seçeneğinin "
-"etkinleştirilmesi gerektiğini unutmayın."
-
-msgid ""
"The Android build template is already installed in this project and it won't "
"be overwritten.\n"
"Remove the \"res://android/build\" directory manually before attempting this "
@@ -2648,9 +2643,6 @@ msgstr "Kısayollar"
msgid "Binding"
msgstr "Bağlayıcı"
-msgid "%s Error"
-msgstr "%s Hatası"
-
msgid "All Devices"
msgstr "Tüm Aygıtlar"
@@ -3565,6 +3557,9 @@ msgstr "Noktaları seç ve taşı. Sağ fare düğmesi ile yeni noktalar oluştu
msgid "Enable snap and show grid."
msgstr "Yapıştırmayı etkinleştir ve ızgarayı göster."
+msgid "Blend:"
+msgstr "Karışma:"
+
msgid "Point"
msgstr "Nokta"
@@ -3607,15 +3602,9 @@ msgstr "Noktaları ve üçgenleri sil."
msgid "Generate blend triangles automatically (instead of manually)"
msgstr "Otomatik üçgen harmanlayıcı oluştur (el ile)"
-msgid "Blend:"
-msgstr "Karışma:"
-
msgid "Parameter Changed:"
msgstr "Parametre DeÄŸiÅŸtirildi:"
-msgid "Edit Filters"
-msgstr "Süzgeçleri Düzenle"
-
msgid "Output node can't be added to the blend tree."
msgstr "Çıktı düğümü işleme ağacına eklenemiyor."
@@ -3735,9 +3724,6 @@ msgstr "Seçilen animasyonu geçerli konumdan geriye doğru oynat. (A)"
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "Seçilen animasyonu geriye doğru oynat. (Shift + A)"
-msgid "Stop animation playback. (S)"
-msgstr "Animasyonu oynatmayı durdur. (S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "Seçilen animasyonu başlangıç anından oynat. (ÜstKrkt + D)"
@@ -4942,12 +4928,6 @@ msgstr "Bildirici DeÄŸiÅŸtir AABB"
msgid "Change Particles AABB"
msgstr "Parçacık AABB Değişimi"
-msgid "Change Box Shape Extents"
-msgstr "Kübik Şekli Genişlet"
-
-msgid "Change Probe Extents"
-msgstr "DeÅŸme GeniÅŸlemesini DeÄŸiÅŸtir"
-
msgid "Change Capsule Shape Radius"
msgstr "Kapsülün Çapını Değiştir"
@@ -5755,6 +5735,9 @@ msgstr "Standart"
msgid "Connections to method:"
msgstr "Metotlara bağlantılar:"
+msgid "Source"
+msgstr "Kaynak"
+
msgid "Target"
msgstr "Hedef"
@@ -5993,12 +5976,6 @@ msgstr "(boÅŸ)"
msgid "Animations:"
msgstr "Animasyonlar:"
-msgid "Speed:"
-msgstr "Hız:"
-
-msgid "Loop"
-msgstr "Döngü"
-
msgid "Animation Frames:"
msgstr "Animasyon Çerçeveleri:"
@@ -7364,9 +7341,6 @@ msgstr "GiriÅŸ Eylemi Ekle"
msgid "Change Action deadzone"
msgstr "Eylem Değiştir ölübölgesi"
-msgid "Add Input Action Event"
-msgstr "Giriş İşlem Olayı Ekle"
-
msgid "Erase Input Action"
msgstr "Girdi Eylemini Sil"
@@ -7394,9 +7368,6 @@ msgstr "Özellik Seç"
msgid "Select Virtual Method"
msgstr "Sanal Metot Seç"
-msgid "Select Method"
-msgstr "Metot Seç"
-
msgid "Batch Rename"
msgstr "Tümden Yeniden Adlandır"
@@ -8162,15 +8133,6 @@ msgstr "APK genişletmesi için geçersiz ortak anahtar."
msgid "Invalid package name:"
msgstr "Geçersiz paket ismi:"
-msgid "\"Use Custom Build\" must be enabled to use the plugins."
-msgstr ""
-"Eklentileri kullanabilmek için \"Özel Derleme Kullan\" seçeneği aktif olmalı."
-
-msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled."
-msgstr ""
-"\"AAB Dışa Aktar\" yalnızca \"Özel Yapı Kullan\" etkinleştirildiğinde "
-"geçerlidir."
-
msgid "Signing debug %s..."
msgstr "%s hata ayıklaması imzalanıyor..."
@@ -8208,13 +8170,6 @@ msgid "Unsupported export format!"
msgstr "Desteklenmeyen dışa aktarım biçimi!"
msgid ""
-"Trying to build from a custom built template, but no version info for it "
-"exists. Please reinstall from the 'Project' menu."
-msgstr ""
-"Özel olarak oluşturulmuş bir şablondan oluşturmaya çalışılıyor, ancak bunun "
-"için sürüm bilgisi yok. Lütfen 'Proje' menüsünden yeniden yükleyin."
-
-msgid ""
"Android build version mismatch: Template installed: %s, Godot version: %s. "
"Please reinstall Android build template from 'Project' menu."
msgstr ""
diff --git a/editor/translations/editor/uk.po b/editor/translations/editor/uk.po
index 4722883f7a..9c1363c20f 100644
--- a/editor/translations/editor/uk.po
+++ b/editor/translations/editor/uk.po
@@ -608,6 +608,9 @@ msgstr "З Ñигналу:"
msgid "Scene does not contain any script."
msgstr "У Ñцені немає жодного Ñкрипту."
+msgid "Select Method"
+msgstr "Вибір методу"
+
msgid "Remove"
msgstr "Вилучити"
@@ -668,9 +671,6 @@ msgstr "Роз'єднати"
msgid "Connect a Signal to a Method"
msgstr "З'єднати Ñигнал із методом"
-msgid "Edit Connection:"
-msgstr "Редагувати з’єднаннÑ:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr "Ви Ñправді хочете вилучити уÑÑ– з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· Ñигналу «%s»?"
@@ -815,23 +815,8 @@ msgstr "ПопередженнÑ:"
msgid "Error:"
msgstr "Помилка:"
-msgid "C++ Error"
-msgstr "Помилка C++"
-
-msgid "C++ Error:"
-msgstr "Помилка C++:"
-
-msgid "Source"
-msgstr "Джерело"
-
-msgid "C++ Source"
-msgstr "Код C++"
-
-msgid "Source:"
-msgstr "Код:"
-
-msgid "C++ Source:"
-msgstr "Код C++:"
+msgid "%s Error"
+msgstr "Помилка %s"
msgid "Stack Trace"
msgstr "ТраÑÑƒÐ²Ð°Ð½Ð½Ñ Ñтека"
@@ -842,6 +827,9 @@ msgstr "Помилка копіюваннÑ"
msgid "Open C++ Source on GitHub"
msgstr "Відкрити початковий код C++ на GitHub"
+msgid "C++ Source"
+msgstr "Код C++"
+
msgid "Video RAM"
msgstr "Відеопам'ÑÑ‚ÑŒ"
@@ -1814,12 +1802,12 @@ msgstr "Показати уÑÑ– локалізації"
msgid "Show Selected Locales Only"
msgstr "Показати лише позначені локалізації"
+msgid "Edit Filters"
+msgstr "Редагувати фільтри"
+
msgid "Language:"
msgstr "Мова:"
-msgid "Script"
-msgstr "Скрипт"
-
msgid "Variant"
msgstr "Варіант"
@@ -2378,23 +2366,6 @@ msgid "Install from file"
msgstr "Ð’Ñтановити з файла"
msgid ""
-"This will set up your project for custom Android builds by installing the "
-"source template to \"res://android/build\".\n"
-"You can then apply modifications and build your own custom APK on export "
-"(adding modules, changing the AndroidManifest.xml, etc.).\n"
-"Note that in order to make custom builds instead of using pre-built APKs, "
-"the \"Use Custom Build\" option should be enabled in the Android export "
-"preset."
-msgstr ""
-"Це налаштує ваш проєкт на викориÑÑ‚Ð°Ð½Ð½Ñ Ð½ÐµÑ‚Ð¸Ð¿Ð¾Ð²Ð¸Ñ… збірок Android шлÑхом "
-"вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð° джерела до «res://android/build».\n"
-"Далі, ви можете внеÑти зміни Ñ– зібрати влаÑний нетиповий APK при "
-"екÑпортуванні (додаючи модулі, змінюючи AndroidManifest.xml тощо).\n"
-"Зауважте, що з метою ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½ÐµÑ‚Ð¸Ð¿Ð¾Ð²Ð¸Ñ… збірок, заміÑÑ‚ÑŒ викориÑÑ‚Ð°Ð½Ð½Ñ "
-"попередньо зібраних APK, Ñлід позначити пункт «СкориÑтатиÑÑ Ð½ÐµÑ‚Ð¸Ð¿Ð¾Ð²Ð¾ÑŽ "
-"збіркою» у шаблоні екÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Android."
-
-msgid ""
"The Android build template is already installed in this project and it won't "
"be overwritten.\n"
"Remove the \"res://android/build\" directory manually before attempting this "
@@ -2621,9 +2592,6 @@ msgstr "Клавіатурні ÑкороченнÑ"
msgid "Binding"
msgstr "Палітурка"
-msgid "%s Error"
-msgstr "Помилка %s"
-
msgid "All Devices"
msgstr "УÑÑ– приÑтрої"
@@ -3558,6 +3526,9 @@ msgstr ""
msgid "Enable snap and show grid."
msgstr "Увімкнути Ð¿Ñ€Ð¸Ð»Ð¸Ð¿Ð°Ð½Ð½Ñ Ñ– показати Ñітку."
+msgid "Blend:"
+msgstr "Змішувати:"
+
msgid "Point"
msgstr "Точка"
@@ -3600,15 +3571,9 @@ msgstr "Вилучити точки і трикутники."
msgid "Generate blend triangles automatically (instead of manually)"
msgstr "Створити трикутники Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾ (а не вручну)"
-msgid "Blend:"
-msgstr "Змішувати:"
-
msgid "Parameter Changed:"
msgstr "Змінено параметр:"
-msgid "Edit Filters"
-msgstr "Редагувати фільтри"
-
msgid "Output node can't be added to the blend tree."
msgstr "Вузол Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð½Ðµ можна додавати до дерева злиттÑ."
@@ -3733,9 +3698,6 @@ msgstr ""
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "Відтворити вибрану анімацію назад з кінцÑ. (Shift+A)"
-msgid "Stop animation playback. (S)"
-msgstr "Зупинити Ð²Ñ–Ð´Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð°Ð½Ñ–Ð¼Ð°Ñ†Ñ–Ñ—. (S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "Відтворити вибрану анімацію від початку. (Shift+D)"
@@ -4969,12 +4931,6 @@ msgstr "Змінити AABB ÑповіщеннÑ"
msgid "Change Particles AABB"
msgstr "Змінити AABB чаÑток"
-msgid "Change Box Shape Extents"
-msgstr "Змінити розміри кубічної форми"
-
-msgid "Change Probe Extents"
-msgstr "Змінити розміри зонду"
-
msgid "Change Capsule Shape Radius"
msgstr "Змінити Ñ€Ð°Ð´Ñ–ÑƒÑ Ñ„Ð¾Ñ€Ð¼Ð¸ капÑули"
@@ -5794,6 +5750,9 @@ msgstr "Стандартний"
msgid "Connections to method:"
msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· методом:"
+msgid "Source"
+msgstr "Джерело"
+
msgid "Target"
msgstr "ПризначеннÑ"
@@ -6041,12 +6000,6 @@ msgstr "(порожньо)"
msgid "Animations:"
msgstr "Ðнімації:"
-msgid "Speed:"
-msgstr "ШвидкіÑÑ‚ÑŒ:"
-
-msgid "Loop"
-msgstr "Зациклити"
-
msgid "Animation Frames:"
msgstr "Кадри анімації:"
@@ -7481,9 +7434,6 @@ msgstr "Додати дію"
msgid "Change Action deadzone"
msgstr "Змінити «мертву» зону дії"
-msgid "Add Input Action Event"
-msgstr "Додати подію за вхідною дією"
-
msgid "Erase Input Action"
msgstr "Витерти Ð·Ð°Ð¿Ð¸Ñ Ð´Ñ–Ñ—"
@@ -7511,9 +7461,6 @@ msgstr "Вибір влаÑтивоÑÑ‚Ñ–"
msgid "Select Virtual Method"
msgstr "Вибір віртуального методу"
-msgid "Select Method"
-msgstr "Вибір методу"
-
msgid "Batch Rename"
msgstr "Пакетне перейменуваннÑ"
@@ -8310,16 +8257,6 @@ msgstr "Ðекоректний відкритий ключ Ð´Ð»Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚
msgid "Invalid package name:"
msgstr "Ðекоректна назва пакунка:"
-msgid "\"Use Custom Build\" must be enabled to use the plugins."
-msgstr ""
-"Щоб можна було кориÑтуватиÑÑ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ°Ð¼Ð¸, Ñлід позначити пункт "
-"«ВикориÑтовувати нетипову збірку»."
-
-msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled."
-msgstr ""
-"Пункт «ЕкÑпортувати AAB» Ñ” чинним, лише Ñкщо увімкнено «ВикориÑтовувати "
-"нетипове збираннÑ»."
-
msgid ""
"\"Target SDK\" %d is higher than the default version %d. This may work, but "
"wasn't tested and may be unstable."
@@ -8364,14 +8301,6 @@ msgid "Unsupported export format!"
msgstr "Ðепідтримуваний формат екÑпортуваннÑ!"
msgid ""
-"Trying to build from a custom built template, but no version info for it "
-"exists. Please reinstall from the 'Project' menu."
-msgstr ""
-"ÐамагаємоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ Ð·Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ð½Ð° оÑнові нетипового шаблона збираннÑ, але не "
-"виÑвлено даних щодо верÑÑ–Ñ—. Будь лаÑка, повторно вÑтановіть шаблон за "
-"допомогою меню «Проєкт»."
-
-msgid ""
"Android build version mismatch: Template installed: %s, Godot version: %s. "
"Please reinstall Android build template from 'Project' menu."
msgstr ""
diff --git a/editor/translations/editor/vi.po b/editor/translations/editor/vi.po
index 491c82e76f..481d9bad69 100644
--- a/editor/translations/editor/vi.po
+++ b/editor/translations/editor/vi.po
@@ -528,6 +528,9 @@ msgstr "Từ tín hiệu:"
msgid "Scene does not contain any script."
msgstr "Cảnh không chứa tập lệnh nào cả."
+msgid "Select Method"
+msgstr "Chá»n PhÆ°Æ¡ng thức"
+
msgid "Remove"
msgstr "Xóa"
@@ -584,9 +587,6 @@ msgstr "Hủy kết nối"
msgid "Connect a Signal to a Method"
msgstr "Kết nối tín hiệu vào một hàm"
-msgid "Edit Connection:"
-msgstr "Chỉnh sửa kết nối:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr "Bạn muốn xoá tất cả kết nối từ tín hiệu \"%s\"?"
@@ -701,18 +701,6 @@ msgstr "Cảnh báo:"
msgid "Error:"
msgstr "Lá»—i:"
-msgid "C++ Error"
-msgstr "Lá»—i C++"
-
-msgid "C++ Error:"
-msgstr "Lá»—i C++:"
-
-msgid "Source"
-msgstr "Nguồn"
-
-msgid "Source:"
-msgstr "Nguồn:"
-
msgid "Copy Error"
msgstr "Sao chép lỗi"
@@ -1534,12 +1522,12 @@ msgstr "Äã bá» ghim %s"
msgid "Copy Property Path"
msgstr "Sao chép Ä‘Æ°á»ng dẫn thuá»™c tính"
+msgid "Edit Filters"
+msgstr "Chỉnh sá»­a Lá»c"
+
msgid "Language:"
msgstr "Ngôn ngữ:"
-msgid "Script"
-msgstr "Tệp lệnh"
-
msgid "Clear Output"
msgstr "Xoá đầu ra"
@@ -2041,23 +2029,6 @@ msgid "Install from file"
msgstr "Cài đặt từ tệp"
msgid ""
-"This will set up your project for custom Android builds by installing the "
-"source template to \"res://android/build\".\n"
-"You can then apply modifications and build your own custom APK on export "
-"(adding modules, changing the AndroidManifest.xml, etc.).\n"
-"Note that in order to make custom builds instead of using pre-built APKs, "
-"the \"Use Custom Build\" option should be enabled in the Android export "
-"preset."
-msgstr ""
-"Việc này sẽ thiết lập dự án của bạn cho các bản dựng Android tùy chỉnh bằng "
-"cách cài đặt bản mẫu nguồn vào \"res://android/build\".\n"
-"Bạn có thể áp dụng các sửa đổi và dựng tệp APK tùy chỉnh khi xuất (thêm các "
-"mô đun, thay đổi AndroidManifest.xml, v.v.).\n"
-"LÆ°u ý rằng để tạo các bản dá»±ng tùy chỉnh thay cho tệp APK dá»±ng sẵn, tùy chá»n "
-"\"Sử dụng bản dựng tùy chỉnh\" phải được bật trong thiết lập sẵn xuất sang "
-"Android."
-
-msgid ""
"The Android build template is already installed in this project and it won't "
"be overwritten.\n"
"Remove the \"res://android/build\" directory manually before attempting this "
@@ -2874,6 +2845,9 @@ msgstr "Chá»n và di chuyển các Ä‘iểm, chuá»™t phải để tạo Ä‘iểm.
msgid "Enable snap and show grid."
msgstr "Bật Dính và hiện lưới."
+msgid "Blend:"
+msgstr "Trá»™n:"
+
msgid "Point"
msgstr "Äiểm"
@@ -2916,12 +2890,6 @@ msgstr "Xóa tam giác và các điểm."
msgid "Generate blend triangles automatically (instead of manually)"
msgstr "Tự động tạo tam giác trộn (thay vì phải vất vả thủ công)"
-msgid "Blend:"
-msgstr "Trá»™n:"
-
-msgid "Edit Filters"
-msgstr "Chỉnh sá»­a Lá»c"
-
msgid "Output node can't be added to the blend tree."
msgstr "Nút đầu ra không thể thêm vào Cây Trộn."
@@ -3031,9 +2999,6 @@ msgstr "Chạy hoạt ảnh đã chá»n ngược lại từ vị trí hiện táº
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "Chạy hoạt ảnh đã chá»n ngược lại từ cuối. (Shift+A)"
-msgid "Stop animation playback. (S)"
-msgstr "Dừng chạy lại hoạt ảnh. (S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "Chạy hoạt ảnh đã chá»n từ đầu. (Shift+D)"
@@ -3800,9 +3765,6 @@ msgstr "Thay đổi bán kính ánh sáng"
msgid "Change Sphere Shape Radius"
msgstr "Thay Äổi Bán Kính Hình Cầu"
-msgid "Change Box Shape Extents"
-msgstr "Chỉnh chiá»u dài hình há»™p"
-
msgid "Change Capsule Shape Radius"
msgstr "Chỉnh bán kính hình nhộng"
@@ -4281,6 +4243,9 @@ msgstr "Chuẩn"
msgid "Connections to method:"
msgstr "Kết nối đến phương thức:"
+msgid "Source"
+msgstr "Nguồn"
+
msgid "Target"
msgstr "Mục tiêu"
@@ -4484,12 +4449,6 @@ msgstr "(trống)"
msgid "Animations:"
msgstr "Các hoạt hình:"
-msgid "Speed:"
-msgstr "Tốc độ:"
-
-msgid "Loop"
-msgstr "Lặp"
-
msgid "Animation Frames:"
msgstr "Khung hình hoạt hình:"
@@ -5143,9 +5102,6 @@ msgstr "Tiện ích"
msgid "Select Property"
msgstr "Chá»n Thuá»™c tính"
-msgid "Select Method"
-msgstr "Chá»n PhÆ°Æ¡ng thức"
-
msgid "Prefix:"
msgstr "Tiá»n tố:"
@@ -5655,13 +5611,6 @@ msgstr "Khóa công khai của bộ APK mở rộng không hợp lệ."
msgid "Invalid package name:"
msgstr "Tên gói không hợp lệ:"
-msgid "\"Use Custom Build\" must be enabled to use the plugins."
-msgstr "\"Sử dụng Bản dựng tùy chỉnh\" phải được bật để sử dụng các tiện ích."
-
-msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled."
-msgstr ""
-"\"Xuất AAB\" chỉ dùng được khi \"Sử dụng Bản dựng tùy chỉnh\" được bật."
-
msgid "Exporting for Android"
msgstr "Äang xuất sang Android"
@@ -5671,13 +5620,6 @@ 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 ""
-"Trying to build from a custom built template, but no version info for it "
-"exists. Please reinstall from the 'Project' menu."
-msgstr ""
-"Cố gắng dựng từ một bản mẫu được dựng tùy chỉnh, nhưng không có thông tin "
-"phiên bản nào tồn tại. Vui lòng cài đặt lại 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 4f6c2e4dc6..918935ec61 100644
--- a/editor/translations/editor/zh_CN.po
+++ b/editor/translations/editor/zh_CN.po
@@ -58,7 +58,7 @@
# idleman <1524328475@qq.com>, 2019.
# king <wangding1992@126.com>, 2019.
# silentbird <silentbird520@outlook.com>, 2019.
-# Haoyu Qiu <timothyqiu32@gmail.com>, 2019, 2020, 2021, 2022.
+# Haoyu Qiu <timothyqiu32@gmail.com>, 2019, 2020, 2021, 2022, 2023.
# Revan Ji <jiruifancr@gmail.com>, 2020.
# nieyuanhong <15625988003@163.com>, 2020.
# binotaliu <binota@protonmail.ch>, 2020.
@@ -76,7 +76,7 @@
# twoBornottwoB <305766341@qq.com>, 2021.
# Magian <magian1127@gmail.com>, 2021.
# Weiduo Xie <xwditfr@gmail.com>, 2021.
-# suplife <2634557184@qq.com>, 2021, 2022.
+# suplife <2634557184@qq.com>, 2021, 2022, 2023.
# luoji <564144019@qq.com>, 2021.
# zeng haochen <m18621006730@163.com>, 2021.
# Sam Sun <oppositenormal@outlook.com>, 2021.
@@ -84,16 +84,19 @@
# nitenook <admin@alterbaum.net>, 2021.
# jker <cxgmfy@163.com>, 2021.
# Ankar <1511276198@qq.com>, 2022.
-# 风é’å±± <idleman@yeah.net>, 2022.
+# 风é’å±± <idleman@yeah.net>, 2022, 2023.
# 1104 EXSPIRAVIT_ <m18621006730@gmail.com>, 2022.
# ChairC <974833488@qq.com>, 2022.
+# èµµä¸ä¸€ <279631638@qq.com>, 2023.
+# WangYi13 <wyi13@outlook.com>, 2023.
+# matrixant <yuan545@hotmail.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: 2022-12-28 00:54+0000\n"
-"Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n"
+"PO-Revision-Date: 2023-02-10 06:54+0000\n"
+"Last-Translator: 风é’å±± <idleman@yeah.net>\n"
"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
"godot-engine/godot/zh_Hans/>\n"
"Language: zh_CN\n"
@@ -101,34 +104,212 @@ 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.15.1-dev\n"
+"X-Generator: Weblate 4.16-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 "Mouse Wheel Left"
+msgstr "鼠标滚轮å‘å·¦"
+
+msgid "Mouse Wheel Right"
+msgstr "鼠标滚轮å‘å³"
+
+msgid "Mouse Thumb Button 1"
+msgstr "鼠标拇指键 1"
+
+msgid "Mouse Thumb Button 2"
+msgstr "鼠标拇指键 2"
+
msgid "Button"
msgstr "按钮"
+msgid "Double Click"
+msgstr "åŒå‡»"
+
+msgid "Mouse motion at position (%s) with velocity (%s)"
+msgstr "鼠标移动至(%s)速度为(%s)"
+
+msgid "Left Stick X-Axis, Joystick 0 X-Axis"
+msgstr "å·¦æ‘‡æ† X è½´ã€æŽ§åˆ¶æ† 0 X è½´"
+
+msgid "Left Stick Y-Axis, Joystick 0 Y-Axis"
+msgstr "å·¦æ‘‡æ† Y è½´ã€æŽ§åˆ¶æ† 0 Y è½´"
+
+msgid "Right Stick X-Axis, Joystick 1 X-Axis"
+msgstr "å³æ‘‡æ† X è½´ã€æŽ§åˆ¶æ† 1 X è½´"
+
+msgid "Right Stick Y-Axis, Joystick 1 Y-Axis"
+msgstr "å³æ‘‡æ† Y è½´ã€æŽ§åˆ¶æ† 1 Y è½´"
+
+msgid "Joystick 2 X-Axis, Left Trigger, Sony L2, Xbox LT"
+msgstr "æŽ§åˆ¶æ† 2 X è½´ã€å·¦æ‰³æœºã€ç´¢å°¼ L2ã€Xbox LT"
+
+msgid "Joystick 2 Y-Axis, Right Trigger, Sony R2, Xbox RT"
+msgstr "æŽ§åˆ¶æ† 2 Y è½´ã€å³æ‰³æœºã€ç´¢å°¼ R2ã€Xbox RT"
+
+msgid "Joystick 3 X-Axis"
+msgstr "æŽ§åˆ¶æ† 3 X è½´"
+
+msgid "Joystick 3 Y-Axis"
+msgstr "æŽ§åˆ¶æ† 3 Y è½´"
+
+msgid "Joystick 4 X-Axis"
+msgstr "æŽ§åˆ¶æ† 4 X è½´"
+
+msgid "Joystick 4 Y-Axis"
+msgstr "æŽ§åˆ¶æ† 4 Y è½´"
+
+msgid "Unknown Joypad Axis"
+msgstr "未知控制æ†è½´"
+
+msgid "Joypad Motion on Axis %d (%s) with Value %.2f"
+msgstr "手柄 %d(%s)轴è¿åŠ¨ %.2f"
+
+msgid "Bottom Action, Sony Cross, Xbox A, Nintendo B"
+msgstr "下侧动作ã€ç´¢å°¼å‰é”®ã€Xbox Aã€ä»»å¤©å ‚ B"
+
+msgid "Right Action, Sony Circle, Xbox B, Nintendo A"
+msgstr "å³ä¾§åŠ¨ä½œã€ç´¢å°¼åœ†åœˆã€Xbox Bã€ä»»å¤©å ‚ A"
+
+msgid "Left Action, Sony Square, Xbox X, Nintendo Y"
+msgstr "左侧动作ã€ç´¢å°¼æ–¹å—ã€Xbox Xã€ä»»å¤©å ‚ Y"
+
+msgid "Top Action, Sony Triangle, Xbox Y, Nintendo X"
+msgstr "上侧动作ã€ç´¢å°¼ä¸‰è§’ã€Xbox Yã€ä»»å¤©å ‚ X"
+
+msgid "Back, Sony Select, Xbox Back, Nintendo -"
+msgstr "返回ã€ç´¢å°¼ Selectã€Xbox Backã€ä»»å¤©å ‚ -"
+
+msgid "Guide, Sony PS, Xbox Home"
+msgstr "指å—ã€ç´¢å°¼ PSã€Xbox Home"
+
+msgid "Start, Nintendo +"
+msgstr "开始ã€ä»»å¤©å ‚ +"
+
+msgid "Left Stick, Sony L3, Xbox L/LS"
+msgstr "左摇æ†ã€ç´¢å°¼ L3ã€Xbox L/LS"
+
+msgid "Right Stick, Sony R3, Xbox R/RS"
+msgstr "å³æ‘‡æ†ã€ç´¢å°¼ R3ã€Xbox R/RS"
+
+msgid "Left Shoulder, Sony L1, Xbox LB"
+msgstr "左肩键ã€ç´¢å°¼ L1ã€Xbox LB"
+
+msgid "Right Shoulder, Sony R1, Xbox RB"
+msgstr "å³è‚©é”®ã€ç´¢å°¼ R1ã€Xbox RB"
+
+msgid "D-pad Up"
+msgstr "æ–¹å‘键上"
+
+msgid "D-pad Down"
+msgstr "æ–¹å‘键下"
+
+msgid "D-pad Left"
+msgstr "æ–¹å‘键左"
+
+msgid "D-pad Right"
+msgstr "æ–¹å‘é”®å³"
+
+msgid "Xbox Share, PS5 Microphone, Nintendo Capture"
+msgstr "Xbox 分享ã€PS5 麦克风ã€ä»»å¤©å ‚截å±"
+
+msgid "Xbox Paddle 1"
+msgstr "Xbox 拨片 1"
+
+msgid "Xbox Paddle 2"
+msgstr "Xbox 拨片 2"
+
+msgid "Xbox Paddle 3"
+msgstr "Xbox 拨片 3"
+
+msgid "Xbox Paddle 4"
+msgstr "Xbox 拨片 4"
+
+msgid "PS4/5 Touchpad"
+msgstr "PS4/5 触控æ¿"
+
+msgid "touched"
+msgstr "按下"
+
+msgid "released"
+msgstr "放开"
+
+msgid "Screen %s at (%s) with %s touch points"
+msgstr "%s触控å±ï¼ˆ%s)触点数é‡ä¸º %s"
+
+msgid ""
+"Screen dragged with %s touch points at position (%s) with velocity of (%s)"
+msgstr "使用 %s 个触点在触控å±ä¸Šæ‹–动至(%s)速度为(%s)"
+
+msgid "Magnify Gesture at (%s) with factor %s"
+msgstr "放大手势,ä½äºŽï¼ˆ%s),系数为 %s"
+
+msgid "Pan Gesture at (%s) with delta (%s)"
+msgstr "平移手势,ä½äºŽï¼ˆ%s),增é‡ä¸ºï¼ˆ%s)"
+
+msgid "MIDI Input on Channel=%s Message=%s"
+msgstr "MIDI 输入,通é“=%s,消æ¯=%s"
+
+msgid "Input Event with Shortcut=%s"
+msgstr "输入事件,快æ·é”®=%s"
+
+msgid "Accept"
+msgstr "接å—"
+
msgid "Select"
msgstr "选择"
msgid "Cancel"
msgstr "å–消"
+msgid "Focus Next"
+msgstr "èšç„¦ä¸‹ä¸€ä¸ª"
+
+msgid "Focus Prev"
+msgstr "èšç„¦ä¸Šä¸€ä¸ª"
+
msgid "Left"
-msgstr "左侧"
+msgstr "å·¦"
msgid "Right"
-msgstr "å³ä¾§"
+msgstr "å³"
msgid "Up"
-msgstr "上传"
+msgstr "上"
msgid "Down"
-msgstr "下载"
+msgstr "下"
+
+msgid "Page Up"
+msgstr "上一页"
+
+msgid "Page Down"
+msgstr "下一页"
+
+msgid "Home"
+msgstr "行首"
msgid "End"
-msgstr "结æŸ"
+msgstr "行尾"
msgid "Cut"
msgstr "剪切"
@@ -145,24 +326,126 @@ msgstr "撤销"
msgid "Redo"
msgstr "é‡åš"
+msgid "Completion Query"
+msgstr "补全请求"
+
+msgid "New Line"
+msgstr "æ¢è¡Œ"
+
+msgid "New Blank Line"
+msgstr "新建空行"
+
+msgid "New Line Above"
+msgstr "æ¢è¡Œè‡³ä¸Šæ–¹"
+
msgid "Indent"
msgstr "缩进"
+msgid "Dedent"
+msgstr "å–消缩进"
+
+msgid "Backspace"
+msgstr "退格"
+
+msgid "Backspace Word"
+msgstr "退格一个å•è¯"
+
+msgid "Backspace all to Left"
+msgstr "退格至最左侧"
+
msgid "Delete"
msgstr "删除"
+msgid "Delete Word"
+msgstr "删除一个å•è¯"
+
+msgid "Delete all to Right"
+msgstr "删除至最å³ä¾§"
+
+msgid "Caret Left"
+msgstr "光标左移"
+
+msgid "Caret Word Left"
+msgstr "光标左移一个å•è¯"
+
+msgid "Caret Right"
+msgstr "光标å³ç§»"
+
+msgid "Caret Word Right"
+msgstr "光标å³ç§»ä¸€ä¸ªå•è¯"
+
+msgid "Caret Up"
+msgstr "光标上移"
+
+msgid "Caret Down"
+msgstr "光标下移"
+
+msgid "Caret Line Start"
+msgstr "光标至行首"
+
+msgid "Caret Line End"
+msgstr "光标至行尾"
+
+msgid "Caret Page Up"
+msgstr "光标至上页"
+
+msgid "Caret Page Down"
+msgstr "光标至下页"
+
+msgid "Caret Document Start"
+msgstr "光标至文档开头"
+
+msgid "Caret Document End"
+msgstr "光标至文档末尾"
+
+msgid "Caret Add Below"
+msgstr "å‘下添加光标"
+
+msgid "Caret Add Above"
+msgstr "å‘上添加光标"
+
+msgid "Scroll Up"
+msgstr "å‘上滚动"
+
+msgid "Scroll Down"
+msgstr "å‘下滚动"
+
msgid "Select All"
msgstr "全选"
+msgid "Select Word Under Caret"
+msgstr "选择光标下的å•è¯"
+
+msgid "Add Selection for Next Occurrence"
+msgstr "将下个匹é…项添加到选区"
+
+msgid "Clear Carets and Selection"
+msgstr "清除光标和选区"
+
+msgid "Toggle Insert Mode"
+msgstr "开关æ’入模å¼"
+
+msgid "Text Submitted"
+msgstr "æ交文本"
+
msgid "Duplicate Nodes"
msgstr "å¤åˆ¶èŠ‚点"
msgid "Delete Nodes"
msgstr "删除节点"
+msgid "Go Up One Level"
+msgstr "å‘上一级"
+
msgid "Refresh"
msgstr "刷新"
+msgid "Show Hidden"
+msgstr "显示éšè—文件"
+
+msgid "Swap Input Direction"
+msgstr "交æ¢è¾“入方å‘"
+
msgid "Invalid input %d (not passed) in expression"
msgstr "表达å¼çš„输入 %d 无效(未传递)"
@@ -184,6 +467,12 @@ msgstr "构造 '%s' çš„å‚数无效"
msgid "On call to '%s':"
msgstr "在调用 '%s' 时:"
+msgid "Built-in script"
+msgstr "内置脚本"
+
+msgid "Built-in"
+msgstr "内置"
+
msgid "B"
msgstr "B"
@@ -205,6 +494,13 @@ msgstr "PiB"
msgid "EiB"
msgstr "EiB"
+msgid "Example: %s"
+msgstr "示例:%s"
+
+msgid "%d item"
+msgid_plural "%d items"
+msgstr[0] "%d 个项目"
+
msgid ""
"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'"
@@ -216,9 +512,33 @@ msgstr "å为“%sâ€çš„动作已存在。"
msgid "Add Event"
msgstr "添加事件"
+msgid "Remove Action"
+msgstr "移除动作"
+
+msgid "Cannot Remove Action"
+msgstr "无法移除动作"
+
+msgid "Edit Event"
+msgstr "编辑事件"
+
+msgid "Remove Event"
+msgstr "移除事件"
+
+msgid "Filter by name..."
+msgstr "按å称筛选..."
+
+msgid "Clear All"
+msgstr "全部清除"
+
+msgid "Add New Action"
+msgstr "添加新动作"
+
msgid "Add"
msgstr "添加"
+msgid "Show Built-in Actions"
+msgstr "显示内置动作"
+
msgid "Action"
msgstr "动作"
@@ -231,6 +551,9 @@ msgstr "时间:"
msgid "Value:"
msgstr "值:"
+msgid "Update Selected Key Handles"
+msgstr "更新所选键控制点"
+
msgid "Insert Key Here"
msgstr "此处æ’入关键帧"
@@ -240,24 +563,96 @@ msgstr "å¤åˆ¶æ‰€é€‰å…³é”®å¸§"
msgid "Delete Selected Key(s)"
msgstr "删除所选关键帧"
+msgid "Make Handles Free"
+msgstr "改为自由控制柄"
+
+msgid "Make Handles Linear"
+msgstr "改为线性控制柄"
+
+msgid "Make Handles Balanced"
+msgstr "改为平衡控制柄"
+
+msgid "Make Handles Mirrored"
+msgstr "改为镜åƒæŽ§åˆ¶æŸ„"
+
+msgid "Make Handles Balanced (Auto Tangent)"
+msgstr "改为平衡控制柄(自动切线)"
+
+msgid "Make Handles Mirrored (Auto Tangent)"
+msgstr "改为镜åƒæŽ§åˆ¶æŸ„(自动切线)"
+
msgid "Add Bezier Point"
msgstr "添加è´å¡žå°”顶点"
msgid "Move Bezier Points"
msgstr "移动è´å¡žå°”顶点"
+msgid "Animation Duplicate Keys"
+msgstr "å¤åˆ¶åŠ¨ç”»å…³é”®å¸§"
+
+msgid "Animation Delete Keys"
+msgstr "删除动画关键帧"
+
msgid "Focus"
msgstr "èšç„¦"
+msgid "Select All Keys"
+msgstr "全选关键帧"
+
+msgid "Deselect All Keys"
+msgstr "å–消选择关键帧"
+
+msgid "Animation Change Transition"
+msgstr "修改动画过渡"
+
+msgid "Animation Change %s"
+msgstr "修改动画 %s"
+
+msgid "Animation Change Keyframe Value"
+msgstr "修改动画关键帧的值"
+
+msgid "Animation Change Call"
+msgstr "修改动画调用"
+
+msgid "Animation Multi Change Transition"
+msgstr "批é‡ä¿®æ”¹åŠ¨ç”»è¿‡æ¸¡"
+
+msgid "Animation Multi Change %s"
+msgstr "批é‡ä¿®æ”¹åŠ¨ç”» %s"
+
+msgid "Animation Multi Change Keyframe Value"
+msgstr "批é‡ä¿®æ”¹åŠ¨ç”»å…³é”®å¸§çš„值"
+
+msgid "Animation Multi Change Call"
+msgstr "批é‡ä¿®æ”¹åŠ¨ç”»è°ƒç”¨"
+
msgid "Change Animation Length"
msgstr "修改动画长度"
msgid "Change Animation Loop"
msgstr "修改动画循环"
+msgid "Can't change loop mode on animation instanced from imported scene."
+msgstr "无法修改从导入场景中实例化的动画的循环模å¼ã€‚"
+
+msgid "Can't change loop mode on animation embedded in another scene."
+msgstr "无法修改嵌入å¦ä¸€åœºæ™¯çš„动画的循环模å¼ã€‚"
+
msgid "Property Track"
msgstr "属性轨é“"
+msgid "3D Position Track"
+msgstr "3D ä½ç½®è½¨é“"
+
+msgid "3D Rotation Track"
+msgstr "3D 旋转轨é“"
+
+msgid "3D Scale Track"
+msgstr "3D 缩放轨é“"
+
+msgid "Blend Shape Track"
+msgstr "æ··åˆå½¢çŠ¶è½¨é“"
+
msgid "Call Method Track"
msgstr "方法调用轨é“"
@@ -288,6 +683,9 @@ msgstr "函数:"
msgid "Audio Clips:"
msgstr "音频剪辑:"
+msgid "Animation Clips:"
+msgstr "动画剪辑:"
+
msgid "Change Track Path"
msgstr "修改轨é“路径"
@@ -295,13 +693,13 @@ msgid "Toggle this track on/off."
msgstr "切æ¢è¯¥è½¨é“的开关。"
msgid "Update Mode (How this property is set)"
-msgstr "更新模å¼ï¼ˆè®¾ç½®å±žæ€§çš„æ–¹å¼ï¼‰"
+msgstr "更新模å¼ï¼ˆè®¾ç½®è¯¥å±žæ€§çš„æ–¹å¼ï¼‰"
msgid "Interpolation Mode"
msgstr "æ’值模å¼"
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr "æ— ç¼å¾ªçŽ¯æ¨¡å¼ï¼ˆä½¿ç”¨å¾ªçŽ¯å¼€å§‹æ’值循环结æŸï¼‰"
+msgstr "æ— ç¼å¾ªçŽ¯æ¨¡å¼ï¼ˆå¾ªçŽ¯æ’值尾首)"
msgid "Remove this track."
msgstr "移除该轨é“。"
@@ -318,6 +716,9 @@ msgstr "旋转:"
msgid "Scale:"
msgstr "缩放:"
+msgid "Blend Shape:"
+msgstr "æ··åˆå½¢çŠ¶ï¼š"
+
msgid "Type:"
msgstr "类型:"
@@ -333,6 +734,18 @@ msgstr "入点手柄:"
msgid "Out-Handle:"
msgstr "出点手柄:"
+msgid "Handle mode: Free\n"
+msgstr "控柄模å¼ï¼šè‡ªç”±\n"
+
+msgid "Handle mode: Linear\n"
+msgstr "控柄模å¼ï¼šçº¿æ€§\n"
+
+msgid "Handle mode: Balanced\n"
+msgstr "控柄模å¼ï¼šå¹³è¡¡\n"
+
+msgid "Handle mode: Mirrored\n"
+msgstr "控柄模å¼ï¼šé•œåƒ\n"
+
msgid "Stream:"
msgstr "æµï¼š"
@@ -346,7 +759,7 @@ msgid "Animation Clip:"
msgstr "动画剪辑:"
msgid "Toggle Track Enabled"
-msgstr "å¯ç”¨ï¼ç¦ç”¨è½¨é“"
+msgstr "å¯ç”¨/ç¦ç”¨è½¨é“"
msgid "Continuous"
msgstr "è¿žç»­"
@@ -366,8 +779,14 @@ msgstr "线性"
msgid "Cubic"
msgstr "三次方"
+msgid "Linear Angle"
+msgstr "线性角"
+
+msgid "Cubic Angle"
+msgstr "三次角"
+
msgid "Clamp Loop Interp"
-msgstr "切断循环æ’值"
+msgstr "钳制循环æ’值"
msgid "Wrap Loop Interp"
msgstr "环绕循环æ’值"
@@ -393,12 +812,26 @@ msgstr "修改动画æ’值模å¼"
msgid "Change Animation Loop Mode"
msgstr "修改动画循环模å¼"
+msgid ""
+"Compressed tracks can't be edited or removed. Re-import the animation with "
+"compression disabled in order to edit."
+msgstr "ä¸èƒ½ç¼–辑或移除压缩的轨é“。è¦è¿›è¡Œç¼–辑,请ç¦ç”¨åŽ‹ç¼©åŽé‡æ–°å¯¼å…¥åŠ¨ç”»ã€‚"
+
msgid "Remove Anim Track"
msgstr "移除动画轨é“"
+msgid "Create new track for %s and insert key?"
+msgstr "是å¦ä¸º %s 新建轨é“并æ’入关键帧?"
+
+msgid "Create %d new tracks and insert keys?"
+msgstr "是å¦æ–°å»º %d 个轨é“并æ’入关键帧?"
+
msgid "Create"
msgstr "创建"
+msgid "Animation Insert Key"
+msgstr "æ’入动画关键帧"
+
msgid "node '%s'"
msgstr "节点“%sâ€"
@@ -417,6 +850,12 @@ msgstr "修改动画步长"
msgid "Rearrange Tracks"
msgstr "é‡æ–°æŽ’列轨é“"
+msgid "Blend Shape tracks only apply to MeshInstance3D nodes."
+msgstr "æ··åˆå½¢çŠ¶è½¨é“仅应用于 MeshInstance3D 节点。"
+
+msgid "Position/Rotation/Scale 3D tracks only apply to 3D-based nodes."
+msgstr "3D ä½ç½®/旋转/缩放轨é“仅适用于 3D 节点。"
+
msgid ""
"Audio tracks can only point to nodes of type:\n"
"-AudioStreamPlayer\n"
@@ -443,8 +882,20 @@ 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 "轨é“ä¸æ˜¯ Node3D 类型,无法æ’入关键帧"
+
+msgid "Add Position Key"
+msgstr "添加ä½ç½®å…³é”®å¸§"
+
+msgid "Add Rotation Key"
+msgstr "添加旋转关键帧"
+
+msgid "Add Scale Key"
+msgstr "添加缩放关键帧"
+
msgid "Add Track Key"
-msgstr "添加轨é“帧"
+msgstr "添加轨é“关键帧"
msgid "Track path is invalid, so can't add a method key."
msgstr "轨é“路径无效,所以无法添加方法帧。"
@@ -455,6 +906,9 @@ msgstr "添加方法轨é“帧"
msgid "Method not found in object:"
msgstr "对象方法未找到:"
+msgid "Animation Move Keys"
+msgstr "移动动画关键帧"
+
msgid "Position"
msgstr "ä½ç½®"
@@ -464,6 +918,9 @@ msgstr "旋转"
msgid "Scale"
msgstr "缩放"
+msgid "BlendShape"
+msgstr "æ··åˆå½¢çŠ¶"
+
msgid "Methods"
msgstr "方法"
@@ -479,16 +936,50 @@ msgstr "剪贴æ¿æ˜¯ç©ºçš„ï¼"
msgid "Paste Tracks"
msgstr "粘贴轨é“"
+msgid "Animation Scale Keys"
+msgstr "缩放动画关键帧"
+
+msgid "Make Easing Keys"
+msgstr "改为缓动关键帧"
+
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
msgstr "由于åªæœ‰å•ä¸€è½¨é“,因此该选项ä¸é€‚用于è´å¡žå°”编辑。"
+msgid "Animation Add RESET Keys"
+msgstr "添加动画 RESET 关键帧"
+
+msgid "Bake Animation as Linear keys."
+msgstr "将动画烘焙为线性关键帧。"
+
+msgid ""
+"This animation belongs to an imported scene, so changes to imported tracks "
+"will not be saved.\n"
+"\n"
+"To modify this animation, navigate to the scene's Advanced Import settings "
+"and select the animation.\n"
+"Some options, including looping, are available here. To add custom tracks, "
+"enable \"Save To File\" and\n"
+"\"Keep Custom Tracks\"."
+msgstr ""
+"此动画属于导入的场景,因此ä¸ä¼šä¿å­˜å¯¹å¯¼å…¥è½¨é“的更改。\n"
+"\n"
+"如果è¦ç¼–辑这个动画,请å‰å¾€è¯¥åœºæ™¯çš„“高级导入设置â€å¹¶é€‰æ‹©è¯¥åŠ¨ç”»ã€‚\n"
+"有包å«å¾ªçŽ¯åœ¨å†…çš„å„ç§é€‰é¡¹ã€‚添加自定义轨é“请å¯ç”¨â€œä¿å­˜ä¸ºæ–‡ä»¶â€\n"
+"并“ä¿ç•™è‡ªå®šä¹‰è½¨é“â€ã€‚"
+
msgid "Warning: Editing imported animation"
msgstr "警告:正在编辑导入的动画"
msgid "Select an AnimationPlayer node to create and edit animations."
msgstr "选择一个 AnimationPlayer 节点以创建和编辑动画。"
+msgid "Imported Scene"
+msgstr "导入的场景"
+
+msgid "Toggle between the bezier curve editor and track editor."
+msgstr "在è´å¡žå°”曲线编辑器和轨é“编辑器之间进行切æ¢ã€‚"
+
msgid "Only show tracks from nodes selected in tree."
msgstr "仅显示在树中选中节点的轨é“。"
@@ -522,6 +1013,9 @@ msgstr "缩放选中项"
msgid "Scale From Cursor"
msgstr "通过光标缩放"
+msgid "Make Easing Selection"
+msgstr "缓动选中项"
+
msgid "Duplicate Selection"
msgstr "å¤åˆ¶é€‰ä¸­é¡¹"
@@ -540,6 +1034,18 @@ msgstr "跳到上一步"
msgid "Apply Reset"
msgstr "应用é‡ç½®"
+msgid "Bake Animation"
+msgstr "烘焙动画"
+
+msgid "Optimize Animation (no undo)"
+msgstr "优化动画(无法撤销)"
+
+msgid "Clean-Up Animation (no undo)"
+msgstr "清ç†åŠ¨ç”»ï¼ˆæ— æ³•æ’¤é”€ï¼‰"
+
+msgid "Pick a node to animate:"
+msgstr "选择è¦è®¾ç½®åŠ¨ç”»çš„节点:"
+
msgid "Use Bezier Curves"
msgstr "使用è´å¡žå°”曲线"
@@ -549,9 +1055,15 @@ msgstr "创建 RESET 轨é“"
msgid "Anim. Optimizer"
msgstr "动画优化器"
+msgid "Max. Velocity Error:"
+msgstr "最大速度误差:"
+
msgid "Max. Angular Error:"
msgstr "最大角度误差:"
+msgid "Max. Precision Error:"
+msgstr "最大精度误差:"
+
msgid "Optimize"
msgstr "优化"
@@ -573,11 +1085,20 @@ msgstr "清ç†"
msgid "Scale Ratio:"
msgstr "缩放比率:"
+msgid "Select Transition and Easing"
+msgstr "选择过渡和缓动"
+
+msgid "Anim. Baker"
+msgstr "动画烘焙器"
+
msgid "Select Tracks to Copy"
msgstr "选择è¦å¤åˆ¶çš„轨é“"
msgid "Select All/None"
-msgstr "全选ï¼å–消"
+msgstr "全选/å–消"
+
+msgid "Animation Change Keyframe Time"
+msgstr "修改动画关键帧的时间"
msgid "Add Audio Track Clip"
msgstr "添加音频轨é“剪辑"
@@ -597,6 +1118,14 @@ msgstr "è¡Œå·ï¼š"
msgid "%d replaced."
msgstr "å·²æ›¿æ¢ %d 处。"
+msgid "%d match"
+msgid_plural "%d matches"
+msgstr[0] "%d 个匹é…"
+
+msgid "%d of %d match"
+msgid_plural "%d of %d matches"
+msgstr[0] "第 %d 个匹é…,共 %d 个"
+
msgid "Match Case"
msgstr "区分大å°å†™"
@@ -613,7 +1142,7 @@ msgid "Selection Only"
msgstr "仅选中"
msgid "Toggle Scripts Panel"
-msgstr "切æ¢è„šæœ¬é¢æ¿"
+msgstr "开关脚本é¢æ¿"
msgid "Zoom In"
msgstr "放大"
@@ -653,9 +1182,18 @@ msgstr "连接到脚本:"
msgid "From Signal:"
msgstr "æ¥è‡ªä¿¡å·ï¼š"
+msgid "Filter Nodes"
+msgstr "筛选节点"
+
msgid "Scene does not contain any script."
msgstr "场景ä¸åŒ…å«è„šæœ¬ã€‚"
+msgid "Select Method"
+msgstr "选择方法"
+
+msgid "Filter Methods"
+msgstr "筛选方法"
+
msgid "Remove"
msgstr "移除"
@@ -665,6 +1203,12 @@ msgstr "添加é¢å¤–调用å‚数:"
msgid "Extra Call Arguments:"
msgstr "é¢å¤–调用å‚数:"
+msgid "Allows to drop arguments sent by signal emitter."
+msgstr "å…许丢弃由信å·å‘é€è€…å‘é€çš„å‚数。"
+
+msgid "Unbind Signal Arguments:"
+msgstr "解绑信å·å‚数:"
+
msgid "Receiver Method:"
msgstr "接收方法:"
@@ -696,6 +1240,9 @@ msgstr "连接"
msgid "Signal:"
msgstr "ä¿¡å·ï¼š"
+msgid "No description."
+msgstr "æ— æ述。"
+
msgid "Connect '%s' to '%s'"
msgstr "å°† “%s†连接到 “%sâ€"
@@ -714,27 +1261,33 @@ msgstr "断开连接"
msgid "Connect a Signal to a Method"
msgstr "连接信å·åˆ°æ–¹æ³•"
-msgid "Edit Connection:"
-msgstr "编辑连接:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr "确定è¦ä»Žä¿¡å· “%s†中移除所有连接å—?"
msgid "Signals"
msgstr "ä¿¡å·"
+msgid "Filter Signals"
+msgstr "筛选信å·"
+
msgid "Are you sure you want to remove all connections from this signal?"
msgstr "确定è¦ä»Žè¯¥ä¿¡å·ä¸­ç§»é™¤æ‰€æœ‰è¿žæŽ¥å—?"
msgid "Disconnect All"
msgstr "断开全部"
+msgid "Copy Name"
+msgstr "å¤åˆ¶å称"
+
msgid "Edit..."
msgstr "编辑..."
msgid "Go to Method"
msgstr "跳转到方法"
+msgid "Change Type of \"%s\""
+msgstr "修改“%sâ€çš„类型"
+
msgid "Change"
msgstr "更改"
@@ -744,6 +1297,12 @@ msgstr "创建 %s"
msgid "No results for \"%s\"."
msgstr "未找到 “%sâ€ã€‚"
+msgid "This class is marked as deprecated."
+msgstr "这个类被标记为已废弃。"
+
+msgid "This class is marked as experimental."
+msgstr "这个类被标记为实验性。"
+
msgid "No description available for %s."
msgstr "没有针对 %s çš„æ述。"
@@ -753,6 +1312,9 @@ msgstr "收è—:"
msgid "Recent:"
msgstr "最近使用:"
+msgid "(Un)favorite selected item."
+msgstr "收è—/å–消收è—选中项。"
+
msgid "Search:"
msgstr "æœç´¢ï¼š"
@@ -780,8 +1342,20 @@ msgstr "å¤åˆ¶èŠ‚点路径"
msgid "Instance:"
msgstr "实例:"
+msgid ""
+"This node has been instantiated from a PackedScene file:\n"
+"%s\n"
+"Click to open the original file in the Editor."
+msgstr ""
+"这个节点是从 PackedScene 文件中实例化的:\n"
+"%s\n"
+"点击在编辑器中打开原始文件。"
+
msgid "Toggle Visibility"
-msgstr "åˆ‡æ¢ éšè—/å¯è§"
+msgstr "切æ¢å¯è§æ€§"
+
+msgid "ms"
+msgstr "ms"
msgid "Monitors"
msgstr "监视"
@@ -851,6 +1425,21 @@ msgstr "时间"
msgid "Calls"
msgstr "调用"
+msgid "Fit to Frame"
+msgstr "é™åˆ¶åˆ°å•å¸§"
+
+msgid "Linked"
+msgstr "è”åˆ"
+
+msgid "CPU"
+msgstr "CPU"
+
+msgid "GPU"
+msgstr "GPU"
+
+msgid "Execution resumed."
+msgstr "å·²æ¢å¤æ‰§è¡Œã€‚"
+
msgid "Bytes:"
msgstr "字节:"
@@ -860,26 +1449,32 @@ msgstr "警告:"
msgid "Error:"
msgstr "错误:"
-msgid "C++ Error"
-msgstr "C++ 错误"
+msgid "%s Error"
+msgstr "%s 错误"
-msgid "C++ Error:"
-msgstr "C++ 错误:"
+msgid "Stack Trace"
+msgstr "栈追踪"
-msgid "Source"
-msgstr "æ¥æº"
+msgid "Stack Trace:"
+msgstr "栈追踪:"
-msgid "C++ Source"
-msgstr "C++ æºæ–‡ä»¶"
+msgid "Debug session started."
+msgstr "调试会è¯å¼€å§‹ã€‚"
-msgid "Source:"
-msgstr "æºæ–‡ä»¶ï¼š"
+msgid "Debug session closed."
+msgstr "调试会è¯ç»“æŸã€‚"
-msgid "C++ Source:"
-msgstr "C++ æºæ–‡ä»¶ï¼š"
+msgid "Line %d"
+msgstr "行 %d"
-msgid "Stack Trace"
-msgstr "栈追踪"
+msgid "Delete Breakpoint"
+msgstr "移除断点"
+
+msgid "Delete All Breakpoints in:"
+msgstr "移除所有断点:"
+
+msgid "Delete All Breakpoints"
+msgstr "移除所有断点"
msgid "Copy Error"
msgstr "å¤åˆ¶é”™è¯¯ä¿¡æ¯"
@@ -887,6 +1482,9 @@ msgstr "å¤åˆ¶é”™è¯¯ä¿¡æ¯"
msgid "Open C++ Source on GitHub"
msgstr "在 GitHub 打开 C++ æºç "
+msgid "C++ Source"
+msgstr "C++ æºæ–‡ä»¶"
+
msgid "Video RAM"
msgstr "显存"
@@ -908,6 +1506,9 @@ msgstr "继续"
msgid "Stack Frames"
msgstr "栈帧"
+msgid "Filter Stack Variables"
+msgstr "筛选栈å˜é‡"
+
msgid "Breakpoints"
msgstr "断点"
@@ -920,8 +1521,11 @@ msgstr "全部折å "
msgid "Profiler"
msgstr "性能分æžå™¨"
+msgid "Visual Profiler"
+msgstr "å¯è§†åˆ†æžå™¨"
+
msgid "List of Video Memory Usage by Resource:"
-msgstr "å ç”¨æ˜¾å­˜çš„资æºåˆ—表:"
+msgstr "显存资æºå ç”¨åˆ—表:"
msgid "Total:"
msgstr "åˆè®¡ï¼š"
@@ -1009,13 +1613,19 @@ msgstr "打开场景"
msgid "Owners of: %s (Total: %d)"
msgstr "%s 的所有者(总计:%d)"
+msgid "Localization remap"
+msgstr "本地化é‡æ˜ å°„"
+
+msgid "Localization remap for path '%s' and locale '%s'."
+msgstr "对路径“%sâ€å’ŒåŒºåŸŸè®¾ç½®â€œ%sâ€çš„本地化é‡æ˜ å°„。"
+
msgid ""
"Remove the selected files from the project? (Cannot be undone.)\n"
"Depending on your filesystem configuration, the files will either be moved "
"to the system trash or deleted permanently."
msgstr ""
-"是å¦ä»Žé¡¹ç›®ä¸­åˆ é™¤æ‰€é€‰æ–‡ä»¶ï¼Ÿï¼ˆæ— æ³•æ’¤é”€ã€‚)\n"
-"æ ¹æ®ä½ çš„文件系统设置,文件会被移动至系统回收站或永久删除。"
+"是å¦ä»Žé¡¹ç›®ä¸­ç§»é™¤æ‰€é€‰æ–‡ä»¶ï¼Ÿï¼ˆæ— æ³•æ’¤é”€ã€‚)\n"
+"æ ¹æ®ä½ çš„文件系统设置,文件å¯èƒ½ä¼šè¢«ç§»åŠ¨è‡³ç³»ç»Ÿå›žæ”¶ç«™ï¼Œä¹Ÿå¯èƒ½è¢«æ°¸ä¹…删除。"
msgid ""
"The files being removed are required by other resources in order for them to "
@@ -1024,9 +1634,9 @@ msgid ""
"Depending on your filesystem configuration, the files will either be moved "
"to the system trash or deleted permanently."
msgstr ""
-"其他资æºéœ€è¦è¿™äº›å³å°†è¢«åˆ é™¤çš„文件æ‰èƒ½æ­£å¸¸å·¥ä½œã€‚\n"
-"ä»ç„¶è¦åˆ é™¤å—?(无法撤销。)\n"
-"æ ¹æ®ä½ çš„文件系统设置,文件会被移动至系统回收站或永久删除。"
+"其他资æºéœ€è¦è¿™äº›å³å°†è¢«ç§»é™¤çš„文件æ‰èƒ½æ­£å¸¸å·¥ä½œã€‚\n"
+"ä»ç„¶è¦ç§»é™¤å—?(无法撤销。)\n"
+"æ ¹æ®ä½ çš„文件系统设置,文件å¯èƒ½ä¼šè¢«ç§»åŠ¨è‡³ç³»ç»Ÿå›žæ”¶ç«™ï¼Œä¹Ÿå¯èƒ½è¢«æ°¸ä¹…删除。"
msgid "Cannot remove:"
msgstr "无法移除:"
@@ -1141,28 +1751,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 "正在解压素æ"
+msgstr "正在解压资产"
msgid "The following files failed extraction from asset \"%s\":"
-msgstr "以下文件无法从素æ“%sâ€ä¸­æå–:"
+msgstr "以下文件无法从资产“%sâ€ä¸­æå–:"
msgid "(and %s more files)"
msgstr "(以åŠå…¶ä»– %s 个文件)"
msgid "Asset \"%s\" installed successfully!"
-msgstr "ç´ æ“%sâ€å®‰è£…æˆåŠŸï¼"
+msgstr "资产“%sâ€å®‰è£…æˆåŠŸï¼"
msgid "Success!"
msgstr "æˆåŠŸï¼"
@@ -1171,7 +1781,7 @@ msgid "Install"
msgstr "安装"
msgid "Asset Installer"
-msgstr "ç´ æ安装器"
+msgstr "资产安装器"
msgid "Speakers"
msgstr "扬声器"
@@ -1221,6 +1831,12 @@ msgstr "æ—通"
msgid "Bus Options"
msgstr "总线选项"
+msgid "Duplicate Bus"
+msgstr "创建总线副本"
+
+msgid "Delete Bus"
+msgstr "删除总线"
+
msgid "Reset Volume"
msgstr "é‡ç½®éŸ³é‡"
@@ -1308,29 +1924,41 @@ msgstr "有效字符:"
msgid "Must not collide with an existing engine class name."
msgstr "与引擎内置类å称冲çªã€‚"
+msgid "Must not collide with an existing global script class name."
+msgstr "与已存在的全局脚本类å冲çªã€‚"
+
msgid "Must not collide with an existing built-in type name."
msgstr "与引擎内置类型å称冲çªã€‚"
msgid "Must not collide with an existing global constant name."
msgstr "与已存在的全局常é‡å称冲çªã€‚"
+msgid "Keyword cannot be used as an Autoload name."
+msgstr "关键字ä¸å¯ç”¨ä½œè‡ªåŠ¨åŠ è½½å称。"
+
msgid "Autoload '%s' already exists!"
-msgstr "Autoload“%sâ€å·²å­˜åœ¨ï¼"
+msgstr "自动加载“%sâ€å·²å­˜åœ¨ï¼"
msgid "Rename Autoload"
-msgstr "é‡å‘½å Autoload"
+msgstr "é‡å‘½å自动加载"
+
+msgid "Toggle Autoload Globals"
+msgstr "开关自动加载全局å˜é‡"
msgid "Move Autoload"
-msgstr "移动 Autoload"
+msgstr "移动自动加载"
msgid "Remove Autoload"
-msgstr "移除 Autoload"
+msgstr "移除自动加载"
msgid "Enable"
msgstr "å¯ç”¨"
msgid "Rearrange Autoloads"
-msgstr "é‡æŽ’ Autoload"
+msgstr "é‡æŽ’自动加载"
+
+msgid "Can't add Autoload:"
+msgstr "无法添加自动加载:"
msgid "%s is an invalid path. File does not exist."
msgstr "%s 是无效路径。文件ä¸å­˜åœ¨ã€‚"
@@ -1338,6 +1966,9 @@ msgstr "%s 是无效路径。文件ä¸å­˜åœ¨ã€‚"
msgid "%s is an invalid path. Not in resource path (res://)."
msgstr "%s 是无效路径。ä¸æ˜¯èµ„æºè·¯å¾„(res://)。"
+msgid "Add Autoload"
+msgstr "添加自动加载"
+
msgid "Path:"
msgstr "路径:"
@@ -1347,6 +1978,9 @@ msgstr "节点å称:"
msgid "Global Variable"
msgstr "全局å˜é‡"
+msgid "3D Engine"
+msgstr "3D 引擎"
+
msgid "2D Physics"
msgstr "2D 物ç†"
@@ -1356,9 +1990,108 @@ msgstr "3D 物ç†"
msgid "Navigation"
msgstr "导航"
+msgid "XR"
+msgstr "XR"
+
+msgid "RenderingDevice"
+msgstr "RenderingDevice"
+
msgid "OpenGL"
msgstr "OpenGL"
+msgid "Vulkan"
+msgstr "Vulkan"
+
+msgid "Text Server: Fallback"
+msgstr "文本æœåŠ¡å™¨ï¼šåŽå¤‡"
+
+msgid "Text Server: Advanced"
+msgstr "文本æœåŠ¡å™¨ï¼šé«˜çº§"
+
+msgid "TTF, OTF, Type 1, WOFF1 Fonts"
+msgstr "TTFã€OTFã€Type 1ã€WOFF1 字体"
+
+msgid "WOFF2 Fonts"
+msgstr "WOFF2 字体"
+
+msgid "SIL Graphite Fonts"
+msgstr "SIL 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 功能的访问。"
+
+msgid "2D Physics nodes and PhysicsServer2D."
+msgstr "2D 物ç†èŠ‚点和 PhysicsServer2D。"
+
+msgid "3D Physics nodes and PhysicsServer3D."
+msgstr "3D 物ç†èŠ‚点和 PhysicsServer3D。"
+
+msgid "Navigation, both 2D and 3D."
+msgstr "导航,2D å’Œ 3D å‡å¯ã€‚"
+
+msgid "XR (AR and VR)."
+msgstr "XR(AR 和 VR)。"
+
+msgid ""
+"RenderingDevice based rendering (if disabled, the OpenGL back-end is "
+"required)."
+msgstr "基于RenderingDevice的渲染(如果ç¦ç”¨ï¼Œåˆ™éœ€è¦OpenGLåŽç«¯ï¼‰ã€‚"
+
+msgid ""
+"OpenGL back-end (if disabled, the RenderingDevice back-end is required)."
+msgstr "OpenGL åŽç«¯ï¼ˆå¦‚æžœç¦ç”¨ï¼Œåˆ™éœ€è¦ RenderingDevice åŽç«¯ï¼‰ã€‚"
+
+msgid "Vulkan back-end of RenderingDevice."
+msgstr "RenderingDevice çš„ Vulkan åŽç«¯ã€‚"
+
+msgid ""
+"Fallback implementation of Text Server\n"
+"Supports basic text layouts."
+msgstr ""
+"文本æœåŠ¡å™¨çš„åŽå¤‡å®žçŽ°\n"
+"支æŒåŸºæœ¬çš„文本布局。"
+
+msgid ""
+"Text Server implementation powered by ICU and HarfBuzz libraries.\n"
+"Supports complex text layouts, BiDi, and contextual OpenType font features."
+msgstr ""
+"ç”± ICU å’Œ HarfBuzz 库æ供支æŒçš„文本æœåŠ¡å™¨å®žçŽ°ã€‚\n"
+"支æŒå¤æ‚的文本布局ã€BiDi 和上下文 OpenType 字体功能。"
+
+msgid ""
+"TrueType, OpenType, Type 1, and WOFF1 font format support using FreeType "
+"library (if disabled, WOFF2 support is also disabled)."
+msgstr ""
+"使用 FreeType åº“æ”¯æŒ TrueTypeã€OpenTypeã€Type 1 å’Œ WOFF1 字体格å¼ï¼ˆå¦‚æžœç¦ç”¨ï¼Œ"
+"WOFF2 支æŒä¹Ÿä¼šè¢«ç¦ç”¨ï¼‰ã€‚"
+
+msgid "WOFF2 font format support using FreeType and Brotli libraries."
+msgstr "使用 FreeType å’Œ Brotli åº“æ”¯æŒ WOFF2 字体格å¼ã€‚"
+
+msgid ""
+"SIL Graphite smart font technology support (supported by Advanced Text "
+"Server only)."
+msgstr "æ”¯æŒ SIL Graphite 智能字体技术(仅由高级文本æœåŠ¡å™¨æ”¯æŒï¼‰ã€‚"
+
+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 ""
+"使用 msdfgen 库支æŒå¤šé€šé“有符å·è·ç¦»åœºå­—体渲染(å³ä½¿ç¦ç”¨æ­¤é€‰é¡¹ï¼Œä¹Ÿå¯ä»¥ä½¿ç”¨é¢„渲"
+"染的 MSDF 字体)。"
+
+msgid "General Features:"
+msgstr "常规特性:"
+
+msgid "Text Rendering and Font Options:"
+msgstr "文本渲染与字体选项:"
+
+msgid "File saving failed."
+msgstr "ä¿å­˜æ–‡ä»¶å¤±è´¥ã€‚"
+
msgid "Nodes and Classes:"
msgstr "节点和类:"
@@ -1374,12 +2107,42 @@ msgstr "新建"
msgid "Save"
msgstr "ä¿å­˜"
+msgid "Profile:"
+msgstr "é…置文件:"
+
msgid "Reset to Defaults"
msgstr "é‡ç½®ä¸ºé»˜è®¤å€¼"
+msgid "Detect from Project"
+msgstr "从项目中检测"
+
+msgid "Actions:"
+msgstr "动作:"
+
+msgid "Configure Engine Build Profile:"
+msgstr "é…置引擎构建é…置文件:"
+
+msgid "Please Confirm:"
+msgstr "请确认:"
+
+msgid "Engine Build Profile"
+msgstr "引擎构建é…置文件"
+
+msgid "Load Profile"
+msgstr "加载é…置文件"
+
msgid "Export Profile"
msgstr "导出é…置文件"
+msgid "Forced classes on detect:"
+msgstr "强制检测类:"
+
+msgid "Edit Build Configuration Profile"
+msgstr "编辑构建é…置文件"
+
+msgid "Filter Commands"
+msgstr "筛选命令"
+
msgid "Paste Params"
msgstr "粘贴å‚æ•°"
@@ -1401,6 +2164,9 @@ msgstr "[未ä¿å­˜]"
msgid "Please select a base directory first."
msgstr "请先选择一个基础目录。"
+msgid "Could not create folder. File with that name already exists."
+msgstr "无法创建文件夹。åŒå文件已存在。"
+
msgid "Choose a Directory"
msgstr "选择目录"
@@ -1423,7 +2189,7 @@ msgid "Script Editor"
msgstr "脚本编辑器"
msgid "Asset Library"
-msgstr "ç´ æ库"
+msgstr "资产库"
msgid "Scene Tree Editing"
msgstr "场景树编辑"
@@ -1437,6 +2203,9 @@ msgstr "文件系统é¢æ¿"
msgid "Import Dock"
msgstr "导入é¢æ¿"
+msgid "History Dock"
+msgstr "历å²åœé é¢æ¿"
+
msgid "Allows to view and edit 3D scenes."
msgstr "å…许查看并编辑 3D 场景。"
@@ -1444,7 +2213,7 @@ msgid "Allows to edit scripts using the integrated script editor."
msgstr "å…许使用内置脚本编辑器编辑脚本。"
msgid "Provides built-in access to the Asset Library."
-msgstr "æ供对素æ库的内置访问。"
+msgstr "æ供对资产库的内置访问。"
msgid "Allows editing the node hierarchy in the Scene dock."
msgstr "å…许在场景é¢æ¿ä¸­ç¼–辑节点层级。"
@@ -1460,7 +2229,10 @@ msgstr "å…许使用专门的é¢æ¿æµè§ˆæœ¬åœ°æ–‡ä»¶ç³»ç»Ÿã€‚"
msgid ""
"Allows to configure import settings for individual assets. Requires the "
"FileSystem dock to function."
-msgstr "å…许为å„个素æé…置导入设置。文件系统é¢æ¿éœ€è¦å¯ç”¨ã€‚"
+msgstr "å…许为å„个资产é…置导入设置。文件系统é¢æ¿éœ€è¦å¯ç”¨ã€‚"
+
+msgid "Provides an overview of the editor's and each scene's undo history."
+msgstr "æ供编辑器和æ¯ä¸ªåœºæ™¯çš„撤消历å²è®°å½•çš„概览。"
msgid "(current)"
msgstr "(当å‰ï¼‰"
@@ -1469,7 +2241,7 @@ 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 "é…置文件必须是有效的文件å,并且ä¸èƒ½åŒ…å« â€œ.â€"
@@ -1501,7 +2273,7 @@ msgstr "主è¦ç‰¹æ€§ï¼š"
msgid ""
"Profile '%s' already exists. Remove it first before importing, import "
"aborted."
-msgstr "é…置文件 “%s†已存在。在导入之å‰å…ˆåˆ é™¤è¯¥é…置文件,导入已中止。"
+msgstr "é…置文件“%sâ€å·²å­˜åœ¨ã€‚请在导入之å‰å…ˆç§»é™¤è¯¥é…置文件,导入已中止。"
msgid "Reset to Default"
msgstr "é‡ç½®ä¸ºé»˜è®¤å€¼"
@@ -1596,6 +2368,9 @@ msgstr "打开文件或目录"
msgid "Save a File"
msgstr "ä¿å­˜æ–‡ä»¶"
+msgid "Favorited folder does not exist anymore and will be removed."
+msgstr "收è—的文件夹ä¸å†å­˜åœ¨ï¼Œå°†è¢«ç§»é™¤ã€‚"
+
msgid "Go Back"
msgstr "åŽé€€"
@@ -1636,13 +2411,13 @@ msgid "Refresh files."
msgstr "刷新文件。"
msgid "(Un)favorite current folder."
-msgstr "收è—ï¼å–消收è—当å‰æ–‡ä»¶å¤¹ã€‚"
+msgstr "收è—/å–消收è—当å‰æ–‡ä»¶å¤¹ã€‚"
msgid "Toggle the visibility of hidden files."
msgstr "切æ¢éšè—文件的å¯è§æ€§ã€‚"
msgid "View items as a grid of thumbnails."
-msgstr "以网格缩略图查看项目。"
+msgstr "以栅格缩略图查看项目。"
msgid "View items as a list."
msgstr "以列表查看项目。"
@@ -1656,6 +2431,19 @@ msgstr "预览:"
msgid "File:"
msgstr "文件:"
+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 ""
+"是å¦ç§»é™¤é€‰å®šçš„文件?为了安全起è§ï¼Œåªæœ‰æ–‡ä»¶å’Œç©ºç›®å½•å¯ä»¥ä»Žè¿™é‡Œè¢«åˆ é™¤ã€‚(无法撤"
+"消。)\n"
+"æ ¹æ®ä½ çš„文件系统设置,文件å¯èƒ½ä¼šè¢«ç§»åŠ¨è‡³ç³»ç»Ÿå›žæ”¶ç«™ï¼Œä¹Ÿå¯èƒ½è¢«æ°¸ä¹…删除。"
+
+msgid "Some extensions need the editor to restart to take effect."
+msgstr "æŸäº›æ‰©å±•éœ€è¦é‡æ–°å¯åŠ¨ç¼–辑器æ‰èƒ½ç”Ÿæ•ˆã€‚"
+
msgid "Restart"
msgstr "é‡æ–°å¯åŠ¨"
@@ -1671,7 +2459,56 @@ msgid ""
msgstr "文件 %s 有ä¸åŒç±»åž‹çš„多个导入器,已中止导入"
msgid "(Re)Importing Assets"
-msgstr "正在导入或é‡æ–°å¯¼å…¥ç´ æ"
+msgstr "正在导入或é‡æ–°å¯¼å…¥èµ„产"
+
+msgid "Import resources of type: %s"
+msgstr "导入 %s 类型的资æº"
+
+msgid "No return value."
+msgstr "无返回值。"
+
+msgid "Deprecated"
+msgstr "已废弃"
+
+msgid "Experimental"
+msgstr "实验性"
+
+msgid "This method supports a variable number of arguments."
+msgstr "这个方法支æŒå¯å˜æ•°é‡çš„å‚数。"
+
+msgid ""
+"This method is called by the engine.\n"
+"It can be overridden to customize built-in behavior."
+msgstr ""
+"这个方法由引擎调用。\n"
+"覆盖åŽå¯è‡ªå®šä¹‰å†…置行为。"
+
+msgid ""
+"This method has no side effects.\n"
+"It does not modify the object in any way."
+msgstr ""
+"这个方法没有副作用。\n"
+"ä¸ä¼šä»¥ä»»ä½•å½¢å¼ä¿®æ”¹è¯¥å¯¹è±¡ã€‚"
+
+msgid ""
+"This method does not need an instance to be called.\n"
+"It can be called directly using the class name."
+msgstr ""
+"调用这个方法ä¸éœ€è¦å®žä¾‹ã€‚\n"
+"å¯ä»¥ç›´æŽ¥ä½¿ç”¨ç±»å调用。"
+
+msgid "Error codes returned:"
+msgstr "返回错误ç ï¼š"
+
+msgid "There is currently no description for this %s."
+msgstr "这个 %s ç›®å‰æ²¡æœ‰æ述。"
+
+msgid ""
+"There is currently no description for this %s. Please help us by "
+"[color=$color][url=$url]contributing one[/url][/color]!"
+msgstr ""
+"这个 %s ç›®å‰æ²¡æœ‰æ述。请帮我们[color=$color][url=$url]贡献一个[/url][/"
+"color]ï¼"
msgid "Top"
msgstr "顶部"
@@ -1685,9 +2522,30 @@ msgstr "继承:"
msgid "Inherited by:"
msgstr "派生:"
+msgid ""
+"This class is marked as deprecated. It will be removed in future versions."
+msgstr "这个类被标记为已废弃,会在将æ¥çš„版本中移除。"
+
+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 ""
+"这个类被标记为实验性,在将æ¥çš„版本中æžå¯èƒ½å‘生修改,也å¯èƒ½è¢«ç§»é™¤ã€‚使用时请自"
+"行斟酌。"
+
msgid "Description"
msgstr "æè¿°"
+msgid "There is currently no description for this class."
+msgstr "ç›®å‰æ²¡æœ‰è¿™ä¸ªç±»çš„æ述。"
+
+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 "在线教程"
@@ -1700,6 +2558,15 @@ msgstr "覆盖 %s:"
msgid "default:"
msgstr "默认:"
+msgid "property:"
+msgstr "属性:"
+
+msgid "Constructors"
+msgstr "构造函数"
+
+msgid "Operators"
+msgstr "è¿ç®—符"
+
msgid "Theme Properties"
msgstr "主题属性"
@@ -1712,6 +2579,9 @@ msgstr "常é‡"
msgid "Fonts"
msgstr "字体"
+msgid "Font Sizes"
+msgstr "字体大å°"
+
msgid "Icons"
msgstr "图标"
@@ -1721,22 +2591,44 @@ msgstr "æ ·å¼"
msgid "Enumerations"
msgstr "枚举"
+msgid "Annotations"
+msgstr "注解"
+
+msgid "There is currently no description for this annotation."
+msgstr "ç›®å‰æ²¡æœ‰è¿™ä¸ªæ³¨è§£çš„æ述。"
+
+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"
msgstr "属性说明"
msgid "(value)"
msgstr "(值)"
+msgid "There is currently no description for this property."
+msgstr "ç›®å‰æ²¡æœ‰è¿™ä¸ªå±žæ€§çš„æ述。"
+
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=$color][url=$url]贡献一个[/url][/"
"color]ï¼"
+msgid "Constructor Descriptions"
+msgstr "构造函数说明"
+
msgid "Method Descriptions"
msgstr "方法说明"
+msgid "Operator Descriptions"
+msgstr "è¿ç®—符说明"
+
msgid "%d match."
msgstr "%d 个匹é…。"
@@ -1758,12 +2650,21 @@ msgstr "全部显示"
msgid "Classes Only"
msgstr "ä»…ç±»"
+msgid "Constructors Only"
+msgstr "仅构造函数"
+
msgid "Methods Only"
msgstr "仅方法"
+msgid "Operators Only"
+msgstr "ä»…è¿ç®—符"
+
msgid "Signals Only"
msgstr "ä»…ä¿¡å·"
+msgid "Annotations Only"
+msgstr "仅注解"
+
msgid "Constants Only"
msgstr "仅常é‡"
@@ -1776,6 +2677,9 @@ msgstr "仅主题属性"
msgid "Member Type"
msgstr "æˆå‘˜ç±»åž‹"
+msgid "(constructors)"
+msgstr "(构造函数)"
+
msgid "Class"
msgstr "ç±»"
@@ -1785,6 +2689,9 @@ msgstr "方法"
msgid "Signal"
msgstr "ä¿¡å·"
+msgid "Annotation"
+msgstr "注解"
+
msgid "Constant"
msgstr "常é‡"
@@ -1794,9 +2701,21 @@ msgstr "属性"
msgid "Theme Property"
msgstr "主题属性"
+msgid "This member is marked as deprecated."
+msgstr "这个æˆå‘˜è¢«æ ‡è®°ä¸ºå·²åºŸå¼ƒã€‚"
+
+msgid "This member is marked as experimental."
+msgstr "这个æˆå‘˜è¢«æ ‡è®°ä¸ºå®žéªŒæ€§ã€‚"
+
msgid "Property:"
msgstr "属性:"
+msgid "Pin Value"
+msgstr "固定值"
+
+msgid "Pin Value [Disabled because '%s' is editor-only]"
+msgstr "固定值 [å·²ç¦ç”¨ï¼Œå› ä¸ºâ€œ%sâ€ä»…适用于编辑器]"
+
msgid ""
"Pinning a value forces it to be saved even if it's equal to the default."
msgstr "将值固定会强制ä¿å­˜è¿™ä¸ªå€¼ï¼Œå³ä¾¿å®ƒä¸Žé»˜è®¤å€¼ç›¸ç­‰ã€‚"
@@ -1804,54 +2723,160 @@ msgstr "将值固定会强制ä¿å­˜è¿™ä¸ªå€¼ï¼Œå³ä¾¿å®ƒä¸Žé»˜è®¤å€¼ç›¸ç­‰ã€‚"
msgid "Open Documentation"
msgstr "打开文档"
+msgid "Element %d: %s%d*"
+msgstr "元素 %d:%s%d*"
+
msgid "Move Up"
msgstr "å‘上移动"
msgid "Move Down"
msgstr "å‘下移动"
+msgid "Insert New Before"
+msgstr "在å‰æ–¹æ’å…¥"
+
+msgid "Insert New After"
+msgstr "在之åŽæ’å…¥"
+
+msgid "Clear Array"
+msgstr "清空数组"
+
+msgid "Resize Array..."
+msgstr "调整数组大å°..."
+
+msgid "Add Element"
+msgstr "添加元素"
+
msgid "Resize Array"
msgstr "调整数组大å°"
+msgid "New Size:"
+msgstr "新大å°ï¼š"
+
+msgid "Element %s"
+msgstr "元素 %s"
+
+msgid "Add Metadata"
+msgstr "添加元数æ®"
+
msgid "Set %s"
msgstr "设置 %s"
msgid "Set Multiple:"
msgstr "批é‡è®¾ç½®ï¼š"
+msgid "Remove metadata %s"
+msgstr "ç§»é™¤å…ƒæ•°æ® %s"
+
msgid "Pinned %s"
msgstr "将 %s 固定"
msgid "Unpinned %s"
msgstr "将 %s 解除固定"
+msgid "Add metadata %s"
+msgstr "æ·»åŠ å…ƒæ•°æ® %s"
+
+msgid "Metadata name can't be empty."
+msgstr "元数æ®å称ä¸èƒ½ä¸ºç©ºã€‚"
+
+msgid "Metadata name must be a valid identifier."
+msgstr "元数æ®å称必须是有效的标识符。"
+
+msgid "Metadata with name \"%s\" already exists."
+msgstr "å为“%sâ€çš„元数æ®å·²å­˜åœ¨ã€‚"
+
+msgid "Names starting with _ are reserved for editor-only metadata."
+msgstr "以 _ 开头的å称已为编辑器元数æ®ä¿ç•™ã€‚"
+
+msgid "Metadata name is valid."
+msgstr "元数æ®å称有效。"
+
+msgid "Add Metadata Property for \"%s\""
+msgstr "为“%sâ€æ·»åŠ å…ƒæ•°æ®å±žæ€§"
+
+msgid "Copy Value"
+msgstr "å¤åˆ¶å€¼"
+
+msgid "Paste Value"
+msgstr "粘贴值"
+
msgid "Copy Property Path"
msgstr "å¤åˆ¶å±žæ€§è·¯å¾„"
+msgid "Select existing layout:"
+msgstr "选择现存布局:"
+
+msgid "Changed Locale Language Filter"
+msgstr "修改区域设置语言筛选"
+
+msgid "Changed Locale Script Filter"
+msgstr "修改区域设置文字筛选"
+
+msgid "Changed Locale Country Filter"
+msgstr "修改区域设置地区筛选"
+
msgid "Changed Locale Filter Mode"
msgstr "修改区域设置筛选模å¼"
+msgid "Select a Locale"
+msgstr "选择区域"
+
msgid "Show All Locales"
msgstr "显示所有区域"
msgid "Show Selected Locales Only"
msgstr "仅显示选定的区域"
+msgid "Edit Filters"
+msgstr "编辑筛选器"
+
msgid "Language:"
msgstr "语言:"
-msgid "Script"
-msgstr "脚本"
+msgid "Country:"
+msgstr "地区:"
+
+msgid "Language"
+msgstr "语言"
+
+msgid "Country"
+msgstr "地区"
msgid "Variant"
msgstr "å˜ä½“"
+msgid "Filter Messages"
+msgstr "消æ¯ç­›é€‰"
+
msgid "Clear Output"
msgstr "清空输出"
msgid "Copy Selection"
msgstr "å¤åˆ¶é€‰ä¸­é¡¹"
+msgid ""
+"Collapse duplicate messages into one log entry. Shows number of occurrences."
+msgstr "å°†é‡å¤çš„ä¿¡æ¯æŠ˜å æˆä¸€ä¸ªæ—¥å¿—æ¡ç›®ã€‚显示出现的次数。"
+
+msgid "Focus Search/Filter Bar"
+msgstr "èšç„¦æœç´¢/过滤æ "
+
+msgid "Toggle visibility of standard output messages."
+msgstr "切æ¢æ ‡å‡†è¾“出消æ¯çš„å¯è§æ€§ã€‚"
+
+msgid "Toggle visibility of errors."
+msgstr "切æ¢é”™è¯¯çš„å¯è§æ€§ã€‚"
+
+msgid "Toggle visibility of warnings."
+msgstr "切æ¢è­¦å‘Šçš„å¯è§æ€§ã€‚"
+
+msgid "Toggle visibility of editor messages."
+msgstr "切æ¢ç¼–辑器消æ¯çš„å¯è§æ€§ã€‚"
+
+msgid "Native Shader Source Inspector"
+msgstr "本地ç€è‰²å™¨æºæ£€æŸ¥å™¨"
+
msgid "New Window"
msgstr "新窗å£"
@@ -1883,6 +2908,11 @@ msgid ""
"Make it unique first."
msgstr "无法ä¿å­˜æ­¤èµ„æºï¼Œå› ä¸ºæ­¤èµ„æºä¸å±žäºŽå·²ç¼–辑的场景。请先唯一化此资æºã€‚"
+msgid ""
+"This resource can't be saved because it was imported from another file. Make "
+"it unique first."
+msgstr "无法ä¿å­˜æ­¤èµ„æºï¼Œå› ä¸ºæ­¤èµ„æºæ˜¯ä»Žå…¶ä»–文件导入的。请先唯一化此资æºã€‚"
+
msgid "Save Resource As..."
msgstr "资æºå¦å­˜ä¸º..."
@@ -1895,6 +2925,21 @@ msgstr "请求文件的类型未知:"
msgid "Error while saving."
msgstr "ä¿å­˜æ—¶å‡ºé”™ã€‚"
+msgid "Can't open file '%s'. The file could have been moved or deleted."
+msgstr "无法打开文件“%sâ€ã€‚该文件å¯èƒ½å·²è¢«ç§»åŠ¨æˆ–删除。"
+
+msgid "Error while parsing file '%s'."
+msgstr "解æžæ–‡ä»¶â€œ%sâ€æ—¶å‡ºé”™ã€‚"
+
+msgid "Scene file '%s' appears to be invalid/corrupt."
+msgstr "场景文件“%sâ€ä¼¼ä¹Žæ— æ•ˆ/å·²æŸå。"
+
+msgid "Missing file '%s' or one its dependencies."
+msgstr "缺失文件“%sâ€æˆ–å…¶ä¾èµ–项。"
+
+msgid "Error while loading file '%s'."
+msgstr "加载文件“%sâ€æ—¶å‡ºé”™ã€‚"
+
msgid "Saving Scene"
msgstr "正在ä¿å­˜åœºæ™¯"
@@ -1908,6 +2953,13 @@ msgid "This operation can't be done without a tree root."
msgstr "æ­¤æ“作必须在打开一个场景åŽæ‰èƒ½æ‰§è¡Œã€‚"
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 ""
+"这个场景包å«å¾ªçŽ¯å®žä¾‹åŒ–,无法ä¿å­˜ã€‚\n"
+"请解决此问题åŽå°è¯•å†æ¬¡ä¿å­˜ã€‚"
+
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr "无法ä¿å­˜åœºæ™¯ã€‚å¯èƒ½æ˜¯å› ä¸ºä¾èµ–项(实例或继承)无法满足。"
@@ -1948,34 +3000,80 @@ msgstr "布局å称未找到ï¼"
msgid "Restored the Default layout to its base settings."
msgstr "已将默认布局æ¢å¤ä¸ºåŽŸå§‹å†…容。"
+msgid "This object is marked as read-only, so it's not editable."
+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"
+"这个资æºå±žäºŽå·²å¯¼å…¥çš„场景,ä¸å¯ç¼–辑。\n"
"请阅读与导入场景相关的文档,以更佳ç†è§£æ­¤å·¥ä½œæµã€‚"
msgid ""
+"This resource belongs to a scene that was instantiated or inherited.\n"
+"Changes to it must be made inside the original scene."
+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 ""
+"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 ""
+"此场景是导入的,因此ä¸ä¼šä¿ç•™å¯¹å…¶æ‰€åšçš„更改。\n"
+"实例化或继承它将å…许您对其进行更改。\n"
+"请阅读与导入场景相关的文档以更好地ç†è§£æ­¤å·¥ä½œæµç¨‹ã€‚"
+
msgid "Changes may be lost!"
msgstr "更改å¯èƒ½ä¼šä¸¢å¤±ï¼"
+msgid "This object is read-only."
+msgstr "这个对象是åªè¯»çš„。"
+
+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 ""
+"å·²å¯ç”¨ Movie Maker 模å¼ï¼Œä½†æ²¡æœ‰æŒ‡å®šç”µå½±æ–‡ä»¶è·¯å¾„。\n"
+"å¯ä»¥åœ¨é¡¹ç›®è®¾ç½®çš„“编辑器 > Movie Writerâ€ç±»åˆ«ä¸‹æŒ‡å®šé»˜è®¤çš„电影文件路径。\n"
+"è¿è¡Œå•ä¸€åœºæ™¯æ—¶ï¼Œä¹Ÿå¯ä»¥åœ¨æ ¹èŠ‚点上添加 `movie_file` 字符串元数æ®ï¼Œ\n"
+"指定录制该场景时使用的电影文件的路径。"
+
msgid "There is no defined scene to run."
msgstr "没有设置è¦è¿è¡Œçš„场景。"
msgid "Save scene before running..."
msgstr "è¿è¡Œå‰ä¿å­˜åœºæ™¯..."
+msgid "Could not start subprocess(es)!"
+msgstr "无法å¯åŠ¨å­è¿›ç¨‹ï¼"
+
+msgid "Reload the played scene."
+msgstr "é‡è½½è¿è¡Œçš„场景。"
+
msgid "Play the project."
msgstr "è¿è¡Œæ­¤é¡¹ç›®ã€‚"
msgid "Play the edited scene."
msgstr "è¿è¡Œæ­£åœ¨ç¼–辑的场景。"
+msgid "Play a custom scene."
+msgstr "è¿è¡Œè‡ªå®šä¹‰åœºæ™¯ã€‚"
+
msgid "Open Base Scene"
msgstr "打开父场景"
@@ -1991,9 +3089,15 @@ msgstr "快速打开脚本..."
msgid "Save & Reload"
msgstr "ä¿å­˜å¹¶é‡æ–°åŠ è½½"
+msgid "Save modified resources before reloading?"
+msgstr "在é‡æ–°åŠ è½½ä¹‹å‰ä¿å­˜ä¿®æ”¹åŽçš„资æºï¼Ÿ"
+
msgid "Save & Quit"
msgstr "ä¿å­˜å¹¶é€€å‡º"
+msgid "Save modified resources before closing?"
+msgstr "在关闭之å‰ä¿å­˜ä¿®æ”¹åŽçš„资æºï¼Ÿ"
+
msgid "Save changes to '%s' before reloading?"
msgstr "是å¦åœ¨é‡æ–°åŠ è½½å‰ä¿å­˜å¯¹â€œ%sâ€çš„更改?"
@@ -2025,12 +3129,30 @@ msgstr "鼠标按下时无法撤销。"
msgid "Nothing to undo."
msgstr "æ— å¯æ’¤é”€ã€‚"
+msgid "Global Undo: %s"
+msgstr "全局撤销:%s"
+
+msgid "Remote Undo: %s"
+msgstr "远程撤销:%s"
+
+msgid "Scene Undo: %s"
+msgstr "场景撤销:%s"
+
msgid "Can't redo while mouse buttons are pressed."
msgstr "鼠标按下时无法é‡åšã€‚"
msgid "Nothing to redo."
msgstr "æ— å¯é‡åšã€‚"
+msgid "Global Redo: %s"
+msgstr "全局é‡åšï¼š%s"
+
+msgid "Remote Redo: %s"
+msgstr "远程é‡åšï¼š%s"
+
+msgid "Scene Redo: %s"
+msgstr "场景é‡åšï¼š%s"
+
msgid "Can't reload a scene that was never saved."
msgstr "无法é‡æ–°åŠ è½½ä»Žæœªä¿å­˜è¿‡çš„场景。"
@@ -2190,6 +3312,9 @@ msgstr "平移视图"
msgid "Dock Position"
msgstr "é¢æ¿ä½ç½®"
+msgid "Make Floating"
+msgstr "浮动"
+
msgid "Add a new scene."
msgstr "添加新场景。"
@@ -2211,6 +3336,18 @@ msgstr "转到上一个打开的场景。"
msgid "Copy Text"
msgstr "å¤åˆ¶æ–‡æœ¬"
+msgid "Next Scene Tab"
+msgstr "下一个场景选项å¡"
+
+msgid "Previous Scene Tab"
+msgstr "上一个场景选项å¡"
+
+msgid "Focus FileSystem Filter"
+msgstr "èšç„¦æ–‡ä»¶ç³»ç»Ÿè¿‡æ»¤å™¨"
+
+msgid "Command Palette"
+msgstr "命令é¢æ¿"
+
msgid "New Scene"
msgstr "新建场景"
@@ -2229,6 +3366,9 @@ msgstr "最近打开"
msgid "Save Scene"
msgstr "ä¿å­˜åœºæ™¯"
+msgid "Export As..."
+msgstr "导出为..."
+
msgid "MeshLibrary..."
msgstr "网格库..."
@@ -2244,9 +3384,18 @@ msgstr "项目"
msgid "Project Settings..."
msgstr "项目设置..."
+msgid "Project Settings"
+msgstr "项目设置"
+
msgid "Version Control"
msgstr "版本控制"
+msgid "Create Version Control Metadata"
+msgstr "创建版本控制元数æ®"
+
+msgid "Version Control Settings"
+msgstr "版本控制设置"
+
msgid "Export..."
msgstr "导出..."
@@ -2256,6 +3405,9 @@ msgstr "安装 Android 构建模æ¿..."
msgid "Open User Data Folder"
msgstr "打开 “用户数æ®â€ 文件夹"
+msgid "Customize Engine Build Configuration..."
+msgstr "自定义引擎构建é…ç½®..."
+
msgid "Tools"
msgstr "工具"
@@ -2274,6 +3426,9 @@ msgstr "编辑器"
msgid "Editor Settings..."
msgstr "编辑器设置..."
+msgid "Command Palette..."
+msgstr "命令é¢æ¿..."
+
msgid "Editor Layout"
msgstr "编辑器布局"
@@ -2301,6 +3456,9 @@ msgstr "管ç†ç¼–辑器功能..."
msgid "Manage Export Templates..."
msgstr "管ç†å¯¼å‡ºæ¨¡æ¿..."
+msgid "Configure FBX Importer..."
+msgstr "é…ç½® FBX 导入器..."
+
msgid "Help"
msgstr "帮助"
@@ -2328,15 +3486,65 @@ msgstr "关于 Godot"
msgid "Support Godot Development"
msgstr "æ”¯æŒ Godot å¼€å‘"
+msgid "Run the project's default scene."
+msgstr "è¿è¡Œé¡¹ç›®çš„默认场景。"
+
msgid "Run Project"
msgstr "è¿è¡Œé¡¹ç›®"
+msgid "Pause the running project's execution for debugging."
+msgstr "æš‚åœè¿è¡Œä¸­çš„项目以进行调试。"
+
+msgid "Pause Running Project"
+msgstr "æš‚åœè¿è¡Œä¸­çš„项目"
+
+msgid "Stop the currently running project."
+msgstr "åœæ­¢ç›®å‰è¿è¡Œä¸­çš„项目。"
+
+msgid "Stop Running Project"
+msgstr "åœæ­¢è¿è¡Œä¸­çš„项目"
+
+msgid "Run the currently edited scene."
+msgstr "è¿è¡Œå½“å‰ç¼–辑的场景。"
+
+msgid "Run Current Scene"
+msgstr "è¿è¡Œå½“å‰åœºæ™¯"
+
+msgid "Run a specific scene."
+msgstr "è¿è¡Œä¸€ä¸ªç‰¹å®šçš„场景。"
+
+msgid "Run Specific Scene"
+msgstr "è¿è¡Œç‰¹å®šåœºæ™¯"
+
+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 ""
+"å¯ç”¨ Movie Maker 模å¼ã€‚\n"
+"该项目将以稳定的 FPS è¿è¡Œï¼Œå½±åƒå’ŒéŸ³é¢‘输出将被记录到一个视频文件中。"
+
+msgid "Choose a renderer."
+msgstr "选择渲染器。"
+
+msgid "Forward+"
+msgstr "Forward+"
+
+msgid "Mobile"
+msgstr "移动"
+
msgid "Compatibility"
-msgstr "兼容性"
+msgstr "兼容"
+
+msgid "Changing the renderer requires restarting the editor."
+msgstr "改å˜æ¸²æŸ“器需è¦é‡å¯ç¼–辑器。"
msgid "Update Continuously"
msgstr "æŒç»­æ›´æ–°"
+msgid "Update When Changed"
+msgstr "改å˜æ—¶æ›´æ–°"
+
msgid "Hide Update Spinner"
msgstr "éšè—更新旋转图"
@@ -2349,6 +3557,9 @@ msgstr "检查器"
msgid "Node"
msgstr "节点"
+msgid "History"
+msgstr "历å²"
+
msgid "Expand Bottom Panel"
msgstr "展开底部é¢æ¿"
@@ -2367,21 +3578,8 @@ msgstr "管ç†æ¨¡æ¿"
msgid "Install from file"
msgstr "从文件安装"
-msgid ""
-"This will set up your project for custom Android builds by installing the "
-"source template to \"res://android/build\".\n"
-"You can then apply modifications and build your own custom APK on export "
-"(adding modules, changing the AndroidManifest.xml, etc.).\n"
-"Note that in order to make custom builds instead of using pre-built APKs, "
-"the \"Use Custom Build\" option should be enabled in the Android export "
-"preset."
-msgstr ""
-"通过将æºæ¨¡æ¿å®‰è£…到 “res://android/build†,将为自定义 Android 构建设置项"
-"目。\n"
-"然åŽï¼Œå¯ä»¥åº”用修改并在导出时构建自己的自定义 APK(添加模å—ã€æ›´æ”¹ "
-"AndroidManifest.xml 等)。\n"
-"请注æ„,è¦ä½¿ç”¨è‡ªå®šä¹‰æž„建而ä¸æ˜¯ä½¿ç”¨é¢„先构建的 APK,需在 Android 导出预设中å¯"
-"用 “Use Custom Build†选项。"
+msgid "Select Android sources file"
+msgstr "选择 Android æºæ–‡ä»¶"
msgid ""
"The Android build template is already installed in this project and it won't "
@@ -2390,7 +3588,7 @@ msgid ""
"operation again."
msgstr ""
"Android 构建模æ¿å·²å®‰è£…在此项目中,将ä¸ä¼šè¢«è¦†ç›–。\n"
-"å†æ¬¡å°è¯•æ‰§è¡Œæ­¤æ“作之å‰ï¼Œè¯·æ‰‹åŠ¨åˆ é™¤ “res://android/build†目录。"
+"å†æ¬¡å°è¯•æ‰§è¡Œæ­¤æ“作之å‰ï¼Œè¯·æ‰‹åŠ¨ç§»é™¤â€œres://android/buildâ€ç›®å½•ã€‚"
msgid "Import Templates From ZIP File"
msgstr "从 ZIP 文件中导入模æ¿"
@@ -2442,7 +3640,7 @@ msgid "Open Script Editor"
msgstr "打开脚本编辑器"
msgid "Open Asset Library"
-msgstr "打开素æ库"
+msgstr "打开资产库"
msgid "Open the next Editor"
msgstr "打开下一个编辑器"
@@ -2450,6 +3648,9 @@ msgstr "打开下一个编辑器"
msgid "Open the previous Editor"
msgstr "打开上一个编辑器"
+msgid "Ok"
+msgstr "确定"
+
msgid "Warning!"
msgstr "警告ï¼"
@@ -2474,6 +3675,9 @@ msgstr "编辑æ’件"
msgid "Installed Plugins:"
msgstr "已安装æ’件:"
+msgid "Create New Plugin"
+msgstr "创建新æ’件"
+
msgid "Version"
msgstr "版本"
@@ -2489,6 +3693,9 @@ msgstr "编辑文本:"
msgid "On"
msgstr "å¯ç”¨"
+msgid "Renaming layer %d:"
+msgstr "é‡å‘½å层 %d:"
+
msgid "No name provided."
msgstr "没有æä¾›å称。"
@@ -2501,12 +3708,44 @@ msgstr "第 %d ä½ï¼Œå€¼ä¸º %d"
msgid "Rename"
msgstr "é‡å‘½å"
+msgid "Rename layer"
+msgstr "é‡å‘½å层"
+
+msgid "Layer %d"
+msgstr "层 %d"
+
+msgid "No Named Layers"
+msgstr "无命å层"
+
+msgid "Edit Layer Names"
+msgstr "编辑层å称"
+
+msgid "<empty>"
+msgstr "<空>"
+
+msgid "Temporary Euler may be changed implicitly!"
+msgstr "临时欧拉值å¯èƒ½è¢«éšå¼æ”¹å˜!"
+
+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 ""
+"临时欧拉值ä¸ä¼šä»¥åŽŸå§‹å½¢å¼åœ¨è¯¥å¯¹è±¡ä¸­å­˜å‚¨ï¼Œè€Œä¼šä»¥å››å…ƒæ•°å½¢å¼å­˜å‚¨ï¼Œè¯¥è½¬æ¢ä¸å¯"
+"逆。\n"
+"这是因为欧拉值 -> 四元数的结果是唯一的,但四元数 -> 欧拉值的结果å¯èƒ½æœ‰å¤šä¸ªã€‚"
+
msgid "Assign..."
msgstr "指定..."
msgid "Invalid RID"
msgstr "无效的 RID"
+msgid "Recursion detected, unable to assign resource to property."
+msgstr "检测到递归,无法将资æºåˆ†é…给属性。"
+
msgid ""
"Can't create a ViewportTexture on resources saved as a file.\n"
"Resource needs to belong to a scene."
@@ -2529,12 +3768,24 @@ msgstr "选择视å£"
msgid "Selected node is not a Viewport!"
msgstr "选定节点ä¸æ˜¯ Viewportï¼"
+msgid "(Nil) %s"
+msgstr "(空)%s"
+
+msgid "%s (size %s)"
+msgstr "%sï¼ˆå¤§å° %s)"
+
msgid "Size:"
msgstr "大å°ï¼š"
msgid "Remove Item"
msgstr "移除项目"
+msgid "Dictionary (Nil)"
+msgstr "字典(空)"
+
+msgid "Dictionary (size %d)"
+msgstr "å­—å…¸ï¼ˆå¤§å° %d)"
+
msgid "New Key:"
msgstr "新建键:"
@@ -2544,6 +3795,15 @@ msgstr "新建值:"
msgid "Add Key/Value Pair"
msgstr "添加键值对"
+msgid "Localizable String (Nil)"
+msgstr "å¯æœ¬åœ°åŒ–字符串(空)"
+
+msgid "Localizable String (size %d)"
+msgstr "å¯æœ¬åœ°åŒ–å­—ç¬¦ä¸²ï¼ˆå¤§å° %d)"
+
+msgid "Add Translation"
+msgstr "添加翻译"
+
msgid ""
"The selected resource (%s) does not match any type expected for this "
"property (%s)."
@@ -2552,9 +3812,15 @@ msgstr "所选资æºï¼ˆ%s)与该属性(%s)所需的类型都ä¸åŒ¹é…。"
msgid "Quick Load"
msgstr "快速加载"
+msgid "Inspect"
+msgstr "查看"
+
msgid "Make Unique"
msgstr "唯一化"
+msgid "Make Unique (Recursive)"
+msgstr "唯一化(递归)"
+
msgid "Convert to %s"
msgstr "转æ¢ä¸º %s"
@@ -2567,6 +3833,15 @@ msgstr "新建脚本"
msgid "Extend Script"
msgstr "扩展脚本"
+msgid "New Shader"
+msgstr "新建ç€è‰²å™¨"
+
+msgid "No Remote Debug export presets configured."
+msgstr "没有é…置远程调试导出预置。"
+
+msgid "Remote Debug"
+msgstr "远程调试"
+
msgid ""
"No runnable export preset found for this platform.\n"
"Please add a runnable preset in the Export menu or define an existing preset "
@@ -2584,6 +3859,16 @@ msgstr "在 _run() 方法中填写逻辑代ç ã€‚"
msgid "There is an edited scene already."
msgstr "已存在一个正在编辑的场景。"
+msgid ""
+"Couldn't run editor script, did you forget to override the '_run' method?"
+msgstr "无法è¿è¡Œç¼–辑器脚本,你是å¦å¿˜äº†è¦†ç›–“_runâ€æ–¹æ³•ï¼Ÿ"
+
+msgid "Edit Built-in Action"
+msgstr "编辑内置动作"
+
+msgid "Edit Shortcut"
+msgstr "编辑快æ·é”®"
+
msgid "Common"
msgstr "通用"
@@ -2593,6 +3878,9 @@ msgstr "编辑器设置"
msgid "General"
msgstr "常规"
+msgid "Filter Settings"
+msgstr "筛选设置"
+
msgid "The editor must be restarted for changes to take effect."
msgstr "å¿…é¡»é‡æ–°å¯åŠ¨ç¼–辑器æ‰èƒ½ä½¿æ›´æ”¹ç”Ÿæ•ˆã€‚"
@@ -2602,8 +3890,81 @@ msgstr "å¿«æ·é”®"
msgid "Binding"
msgstr "绑定"
-msgid "%s Error"
-msgstr "%s 错误"
+msgid ""
+"Hold %s to round to integers.\n"
+"Hold Shift for more precise changes."
+msgstr ""
+"æŒ‰ä½ %s å–整。\n"
+"æŒ‰ä½ Shift 获å–更精确的å˜åŒ–。"
+
+msgid "No notifications."
+msgstr "无通知。"
+
+msgid "Show notifications."
+msgstr "显示通知。"
+
+msgid "Silence the notifications."
+msgstr "将通知é™éŸ³ã€‚"
+
+msgid "Left Stick Left, Joystick 0 Left"
+msgstr "左摇æ†å‘å·¦ï¼ŒæŽ§åˆ¶æ† 0 å‘å·¦"
+
+msgid "Left Stick Right, Joystick 0 Right"
+msgstr "左摇æ†å‘å³ï¼ŒæŽ§åˆ¶æ† 0 å‘å³"
+
+msgid "Left Stick Up, Joystick 0 Up"
+msgstr "左摇æ†å‘ä¸Šï¼ŒæŽ§åˆ¶æ† 0 å‘上"
+
+msgid "Left Stick Down, Joystick 0 Down"
+msgstr "左摇æ†å‘ä¸‹ï¼ŒæŽ§åˆ¶æ† 0 å‘下"
+
+msgid "Right Stick Left, Joystick 1 Left"
+msgstr "å³æ‘‡æ†å‘å·¦ï¼ŒæŽ§åˆ¶æ† 1 å‘å·¦"
+
+msgid "Right Stick Right, Joystick 1 Right"
+msgstr "å³æ‘‡æ†å‘å³ï¼ŒæŽ§åˆ¶æ† 1 å‘å³"
+
+msgid "Right Stick Up, Joystick 1 Up"
+msgstr "å³æ‘‡æ†å‘ä¸Šï¼ŒæŽ§åˆ¶æ† 1 å‘上"
+
+msgid "Right Stick Down, Joystick 1 Down"
+msgstr "å³æ‘‡æ†å‘ä¸‹ï¼ŒæŽ§åˆ¶æ† 1 å‘下"
+
+msgid "Joystick 2 Left"
+msgstr "æŽ§åˆ¶æ† 2 å‘å·¦"
+
+msgid "Left Trigger, Sony L2, Xbox LT, Joystick 2 Right"
+msgstr "左扳机ã€ç´¢å°¼ L2ã€Xbox LTã€æŽ§åˆ¶æ† 2 å‘å³"
+
+msgid "Joystick 2 Up"
+msgstr "æŽ§åˆ¶æ† 2 å‘上"
+
+msgid "Right Trigger, Sony R2, Xbox RT, Joystick 2 Down"
+msgstr "å³æ‰³æœºã€ç´¢å°¼ R2ã€Xbox RTã€æŽ§åˆ¶æ† 2 å‘下"
+
+msgid "Joystick 3 Left"
+msgstr "æŽ§åˆ¶æ† 3 å‘å·¦"
+
+msgid "Joystick 3 Right"
+msgstr "æŽ§åˆ¶æ† 3 å‘å³"
+
+msgid "Joystick 3 Up"
+msgstr "æŽ§åˆ¶æ† 3 å‘上"
+
+msgid "Joystick 3 Down"
+msgstr "æŽ§åˆ¶æ† 3 å‘下"
+
+msgid "Joystick 4 Left"
+msgstr "æŽ§åˆ¶æ† 4 å‘å·¦"
+
+msgid "Joystick 4 Right"
+msgstr "æŽ§åˆ¶æ† 4 å‘å³"
+
+msgid "Joystick 4 Up"
+msgstr "æŽ§åˆ¶æ† 4 å‘上"
+
+msgid "Joystick 4 Down"
+msgstr "æŽ§åˆ¶æ† 4 å‘下"
msgid "All Devices"
msgstr "所有设备"
@@ -2611,6 +3972,12 @@ msgstr "所有设备"
msgid "Device"
msgstr "设备"
+msgid "Listening for input..."
+msgstr "正在监å¬è¾“å…¥..."
+
+msgid "Filter by event..."
+msgstr "按事件筛选..."
+
msgid "Project export for platform:"
msgstr "针对平å°å¯¼å‡ºé¡¹ç›®ï¼š"
@@ -2650,6 +4017,15 @@ msgstr "导出项目文件失败。"
msgid "Can't open file to read from path \"%s\"."
msgstr "无法打开ä½äºŽâ€œ%sâ€çš„文件用于读å–。"
+msgid "Can't open executable file from path \"%s\"."
+msgstr "无法打开ä½äºŽâ€œ%sâ€çš„å¯æ‰§è¡Œæ–‡ä»¶ã€‚"
+
+msgid "Can't create encrypted file."
+msgstr "无法创建加密文件。"
+
+msgid "Can't open encrypted file to write."
+msgstr "无法打开加密文件进行写æ“作。"
+
msgid "Save ZIP"
msgstr "ä¿å­˜ ZIP"
@@ -2770,6 +4146,9 @@ msgstr "正在下载"
msgid "Connection Error"
msgstr "连接错误"
+msgid "TLS Handshake Error"
+msgstr "TLS æ¡æ‰‹é”™è¯¯"
+
msgid "Can't open the export templates file."
msgstr "无法打开导出模æ¿æ–‡ä»¶ã€‚"
@@ -2878,6 +4257,9 @@ msgstr "所有预设必须都定义导出路径,æ‰èƒ½è¿›è¡Œâ€œå…¨éƒ¨å¯¼å‡ºâ€
msgid "Delete preset '%s'?"
msgstr "是å¦åˆ é™¤é¢„设 “%sâ€ï¼Ÿ"
+msgid "%s Export"
+msgstr "%s 导出"
+
msgid "Release"
msgstr "å‘布"
@@ -2918,12 +4300,25 @@ msgstr "导出选中的场景(包括ä¾èµ–项)"
msgid "Export selected resources (and dependencies)"
msgstr "导出选中的资æºï¼ˆåŒ…括ä¾èµ–项)"
+msgid "Export all resources in the project except resources checked below"
+msgstr "导出项目中的所有资æºï¼Œä¸‹æ–¹å‹¾é€‰çš„资æºé™¤å¤–"
+
+msgid "Export as dedicated server"
+msgstr "导出为专用æœåŠ¡å™¨"
+
msgid "Export Mode:"
msgstr "导出模å¼ï¼š"
msgid "Resources to export:"
msgstr "导出的资æºï¼š"
+msgid ""
+"\"Strip Visuals\" will replace the following resources with placeholders:"
+msgstr "“剥离视觉内容â€å°†ç”¨å ä½ç¬¦å–代以下资æºï¼š"
+
+msgid "Strip Visuals"
+msgstr "剥离视觉内容"
+
msgid "Keep"
msgstr "ä¿æŒ"
@@ -2950,9 +4345,35 @@ msgstr "自定义 (以逗å·åˆ†éš”):"
msgid "Feature List:"
msgstr "特性列表:"
+msgid "Encryption"
+msgstr "加密"
+
+msgid "Encrypt Exported PCK"
+msgstr "加密导出的 PCK"
+
+msgid "Encrypt Index (File Names and Info)"
+msgstr "加密索引(文件å和信æ¯ï¼‰"
+
+msgid ""
+"Filters to include files/folders\n"
+"(comma-separated, e.g: *.tscn, *.tres, scenes/*)"
+msgstr ""
+"用于包å«æ–‡ä»¶/文件夹的筛选器\n"
+"(以英文逗å·åˆ†éš”,例如:*.tscn, *.tres, scenes/*)"
+
+msgid ""
+"Filters to exclude files/folders\n"
+"(comma-separated, e.g: *.ctex, *.import, music/*)"
+msgstr ""
+"用于排除文件/文件夹的筛选器\n"
+"(以英文逗å·åˆ†éš”,例如:*.ctex, *.import, music/*)"
+
msgid "Invalid Encryption Key (must be 64 hexadecimal characters long)"
msgstr "无效的加密密钥(长度必须为 64 个å六进制字符)"
+msgid "Encryption Key (256-bits as hexadecimal):"
+msgstr "加密密钥(256 ä½å六进制ç ï¼‰:"
+
msgid ""
"Note: Encryption key needs to be stored in the binary,\n"
"you need to build the export templates from source."
@@ -2963,6 +4384,9 @@ msgstr ""
msgid "More Info..."
msgstr "更多信æ¯..."
+msgid "Export PCK/ZIP..."
+msgstr "导出 PCK/ZIP..."
+
msgid "Export Project..."
msgstr "导出项目..."
@@ -2993,9 +4417,37 @@ msgstr "管ç†å¯¼å‡ºæ¨¡æ¿"
msgid "Export With Debug"
msgstr "使用调试导出"
+msgid "Path to FBX2glTF executable is empty."
+msgstr "FBX2glTF å¯æ‰§è¡Œæ–‡ä»¶çš„路径为空。"
+
+msgid "Path to FBX2glTF executable is invalid."
+msgstr "FBX2glTF å¯æ‰§è¡Œæ–‡ä»¶çš„路径无效。"
+
+msgid "Error executing this file (wrong version or architecture)."
+msgstr "执行该文件时出错(版本或架构错误)。"
+
+msgid "FBX2glTF executable is valid."
+msgstr "FBX2glTF å¯æ‰§è¡Œæ–‡ä»¶æœ‰æ•ˆã€‚"
+
+msgid "Configure FBX Importer"
+msgstr "é…ç½® FBX 导入器"
+
+msgid ""
+"FBX2glTF is required for importing FBX files.\n"
+"Please download it and provide a valid path to the binary:"
+msgstr ""
+"导入 FBX æ–‡ä»¶éœ€è¦ FBX2glTF。\n"
+"请下载它并æ供该å¯æ‰§è¡Œæ–‡ä»¶çš„有效路径:"
+
+msgid "Click this link to download FBX2glTF"
+msgstr "点击此链接下载 FBX2glTF"
+
msgid "Browse"
msgstr "æµè§ˆ"
+msgid "Confirm Path"
+msgstr "确认路径"
+
msgid "Favorites"
msgstr "收è—"
@@ -3018,6 +4470,12 @@ msgstr "移动出错:"
msgid "Error duplicating:"
msgstr "å¤åˆ¶å‡ºé”™ï¼š"
+msgid "Failed to save resource at %s: %s"
+msgstr "ä¿å­˜ä½äºŽ %s 的资æºå¤±è´¥ï¼š%s"
+
+msgid "Failed to load resource at %s: %s"
+msgstr "加载ä½äºŽ %s 的资æºå¤±è´¥ï¼š%s"
+
msgid "Unable to update dependencies:"
msgstr "无法更新ä¾èµ–:"
@@ -3069,6 +4527,9 @@ msgstr "新建继承场景"
msgid "Set As Main Scene"
msgstr "设为主场景"
+msgid "Instantiate"
+msgstr "实例化"
+
msgid "Add to Favorites"
msgstr "添加到收è—"
@@ -3084,6 +4545,21 @@ msgstr "查看所有者..."
msgid "Move To..."
msgstr "移动..."
+msgid "Folder..."
+msgstr "文件夹..."
+
+msgid "Scene..."
+msgstr "场景..."
+
+msgid "Script..."
+msgstr "脚本..."
+
+msgid "Resource..."
+msgstr "资æº..."
+
+msgid "TextFile..."
+msgstr "文本文件..."
+
msgid "New Scene..."
msgstr "新建场景..."
@@ -3093,6 +4569,12 @@ msgstr "新建脚本..."
msgid "New Resource..."
msgstr "新建资æº..."
+msgid "New TextFile..."
+msgstr "新建文本文件..."
+
+msgid "Sort Files"
+msgstr "文件排åº"
+
msgid "Sort by Name (Ascending)"
msgstr "按å称(å‡åºï¼‰"
@@ -3111,18 +4593,33 @@ msgstr "按最近修改"
msgid "Sort by First Modified"
msgstr "按最早修改"
+msgid "Copy UID"
+msgstr "å¤åˆ¶ UID"
+
msgid "Duplicate..."
msgstr "å¤åˆ¶ä¸º..."
msgid "Rename..."
msgstr "é‡å‘½å..."
+msgid "Open in External Program"
+msgstr "在外部程åºä¸­æ‰“å¼€"
+
+msgid "Go to previous selected folder/file."
+msgstr "转到之å‰é€‰å®šçš„文件夹/文件。"
+
+msgid "Go to next selected folder/file."
+msgstr "转到下一个选定的文件夹/文件。"
+
msgid "Re-Scan Filesystem"
msgstr "é‡æ–°æ‰«æ文件系统"
msgid "Toggle Split Mode"
msgstr "切æ¢æ‹†åˆ†æ¨¡å¼"
+msgid "Filter Files"
+msgstr "筛选文件"
+
msgid ""
"Scanning Files,\n"
"Please Wait..."
@@ -3168,9 +4665,21 @@ msgstr "替æ¢..."
msgid "Replace in Files"
msgstr "在文件中替æ¢"
+msgid "Replace all (no undo)"
+msgstr "全部替æ¢ï¼ˆæ— æ³•æ’¤é”€ï¼‰"
+
msgid "Searching..."
msgstr "æœç´¢ä¸­..."
+msgid "%d match in %d file"
+msgstr "%d 处匹é…,共 %d 个文件"
+
+msgid "%d matches in %d file"
+msgstr "%d 处匹é…,共 %d 个文件"
+
+msgid "%d matches in %d files"
+msgstr "%d 处匹é…,共 %d 个文件"
+
msgid "Add to Group"
msgstr "添加到分组"
@@ -3207,12 +4716,172 @@ msgstr "分组编辑器"
msgid "Manage Groups"
msgstr "管ç†åˆ†ç»„"
+msgid "The Beginning"
+msgstr "开始"
+
+msgid "Global"
+msgstr "全局"
+
+msgid "Audio Stream Importer: %s"
+msgstr "音频æµå¯¼å…¥å™¨ï¼š%s"
+
msgid "Reimport"
msgstr "é‡æ–°å¯¼å…¥"
+msgid "Enable looping."
+msgstr "å¯ç”¨å¾ªçŽ¯ã€‚"
+
msgid "Offset:"
msgstr "å移:"
+msgid ""
+"Loop offset (from beginning). Note that if BPM is set, this setting will be "
+"ignored."
+msgstr "循环å移(相对于开头)。注æ„如果设置了 BPM,这个设置会被忽略。"
+
+msgid "Loop:"
+msgstr "循环:"
+
+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 ""
+"é…置互动æµä½¿ç”¨çš„æ¯å°èŠ‚æ‹æ•°ï¼ˆèŠ‚å¥ï¼‰ã€‚\n"
+"这是é…置节æ‹ä¿¡æ¯æ‰€å¿…需的。"
+
+msgid "Beat Count:"
+msgstr "æ‹æ•°ï¼š"
+
+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 ""
+"é…置用于音ä¹æ„ŸçŸ¥å¾ªçŽ¯çš„æ‹æ•°ã€‚如果为零,它将从长度中自动检测出æ¥ã€‚\n"
+"建议设置这个值(手动或点击预览中的æ‹æ•°ï¼‰ï¼Œä»¥ç¡®ä¿å¾ªçŽ¯å·¥ä½œæ­£å¸¸ã€‚"
+
+msgid "Bar Beats:"
+msgstr "节æ‹ï¼š"
+
+msgid ""
+"Configure the Beats Per Bar. This used for music-aware transitions between "
+"AudioStreams."
+msgstr "é…ç½®æ¯å°èŠ‚çš„æ‹æ•°ã€‚这用于音频æµä¹‹é—´çš„音ä¹æ„ŸçŸ¥è¿‡æ¸¡ã€‚"
+
+msgid "Music Playback:"
+msgstr "播放音ä¹ï¼š"
+
+msgid "New Configuration"
+msgstr "新建é…ç½®"
+
+msgid "Remove Variation"
+msgstr "移除å˜ä½“"
+
+msgid ""
+"Warning: There are no configurations specified, no glyphs will be pre-"
+"rendered."
+msgstr "警告:没有指定é…置,没有字形将被预渲染。"
+
+msgid ""
+"Warning: Multiple configurations have identical settings. Duplicates will be "
+"ignored."
+msgstr "警告:多个é…置有相åŒçš„设置。é‡å¤çš„将被忽略。"
+
+msgid ""
+"Note: LCD Subpixel antialiasing is selected, each of the glyphs will be pre-"
+"rendered for all supported subpixel layouts (5x)."
+msgstr ""
+"注æ„:选中了 LCD 次åƒç´ æŠ—锯齿,æ¯ä¸ªå­—形都会针对所有支æŒçš„次åƒç´ å¸ƒå±€è¿›è¡Œé¢„渲染"
+"(5 å€ï¼‰ã€‚"
+
+msgid ""
+"Note: Subpixel positioning is selected, each of the glyphs might be pre-"
+"rendered for multiple subpixel offsets (up to 4x)."
+msgstr ""
+"注æ„:选中了次åƒç´ å®šä½ï¼Œæ¯ä¸ªå­—形都å¯èƒ½é’ˆå¯¹å¤šç§æ¬¡åƒç´ å移进行渲染(最多 4 "
+"å€ï¼‰ã€‚"
+
+msgid "Advanced Import Settings for '%s'"
+msgstr "“%sâ€é«˜çº§å¯¼å…¥è®¾ç½®"
+
+msgid "Rendering Options"
+msgstr "渲染选项"
+
+msgid "Select font rendering options, fallback font, and metadata override:"
+msgstr "选择字体渲染选项ã€åŽå¤‡å­—体和元数æ®è¦†ç›–:"
+
+msgid "Pre-render Configurations"
+msgstr "预渲染é…ç½®"
+
+msgid ""
+"Add font size, and variation coordinates, and select glyphs to pre-render:"
+msgstr "添加字体大å°å’Œå˜ä½“å标,并选择字形进行预渲染:"
+
+msgid "Configuration:"
+msgstr "é…置:"
+
+msgid "Add configuration"
+msgstr "添加é…ç½®"
+
+msgid "Clear Glyph List"
+msgstr "清空字形列表"
+
+msgid "Glyphs from the Translations"
+msgstr "翻译中的字形"
+
+msgid "Select translations to add all required glyphs to pre-render list:"
+msgstr "选择翻译以将所有必需的字形添加到预渲染列表中:"
+
+msgid "Shape all Strings in the Translations and Add Glyphs"
+msgstr "塑形翻译中的所有字符串并添加字形"
+
+msgid "Glyphs from the Text"
+msgstr "文本中的字形"
+
+msgid ""
+"Enter a text and select OpenType features to shape and add all required "
+"glyphs to pre-render list:"
+msgstr ""
+"输入文本并选择 OpenType 功能æ¥å¡‘形,并将所有必需的字形添加到预渲染列表中:"
+
+msgid "Shape Text and Add Glyphs"
+msgstr "塑形文本并添加字形"
+
+msgid "Glyphs from the Character Map"
+msgstr "字符映射表中的字形"
+
+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 ""
+"在字符映射表中添加或移除字形到预渲染列表:\n"
+"注æ„: æŸäº›æ ·å¼æ›¿ä»£é¡¹å’Œå­—å½¢å˜ä½“与字符没有一对一的对应关系,并且未在此映射表中"
+"显示,请使用“文本中的字形â€é€‰é¡¹å¡æ·»åŠ è¿™äº›å†…容。"
+
+msgid "Dynamically rendered TrueType/OpenType font"
+msgstr "动æ€æ¸²æŸ“çš„ TrueType/OpenType 字体"
+
+msgid "Prerendered multichannel(+true) signed distance field"
+msgstr "预渲染的多通é“(+true)有符å·è·ç¦»åœº"
+
+msgid "Can't load font texture:"
+msgstr "无法加载字体纹ç†ï¼š"
+
+msgid "Image margin too big."
+msgstr "图åƒè¾¹è·å¤ªå¤§ã€‚"
+
+msgid "Character margin too bit."
+msgstr "字符边è·å¤ªå°ã€‚"
+
+msgid "Pre-Import Scene"
+msgstr "预导入场景"
+
msgid "Importing Scene..."
msgstr "导入场景中..."
@@ -3231,28 +4900,165 @@ msgstr "导入åŽå¤„ç†è„šæœ¬æ— æ•ˆæˆ–å·²æŸå(请查看控制å°ï¼‰ï¼š"
msgid "Error running post-import script:"
msgstr "åŽå¤„ç†è„šæœ¬è¿è¡Œå‘生错误:"
+msgid "Did you return a Node-derived object in the `_post_import()` method?"
+msgstr "你是å¦åœ¨ `_post_import()` 方法中返回了一个 Node 派生对象?"
+
msgid "Saving..."
msgstr "ä¿å­˜ä¸­..."
msgid ""
+"Error importing GLSL shader file: '%s'. Open the file in the filesystem dock "
+"in order to see the reason."
+msgstr ""
+"在导入 GLSL ç€è‰²å™¨æ–‡ä»¶æ—¶å‡ºé”™ï¼šâ€œ%sâ€ã€‚在文件系统åœé é¢æ¿ä¸­æ‰“开该文件,以便查看"
+"原因。"
+
+msgid ""
"%s: Texture detected as used as a normal map in 3D. Enabling red-green "
"texture compression to reduce memory usage (blue channel is discarded)."
msgstr ""
"%s:检测到纹ç†è¢«ç”¨äºŽ 3D 法线贴图。正在å¯ç”¨çº¢ç»¿çº¹ç†åŽ‹ç¼©ï¼Œé™ä½Žå†…存使用(è“通é“"
"被丢弃)。"
+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:检测到纹ç†è¢«ç”¨ä½œ 3D 粗糙度贴图。根æ®åœ¨ %s 处检测到的关è”法线贴图,å¯ç”¨ç²—"
+"糙度é™åˆ¶å™¨ã€‚"
+
+msgid ""
+"%s: Texture detected as used in 3D. Enabling mipmap generation and setting "
+"the texture compression mode to %s."
+msgstr "%s:检测到纹ç†è¢«ç”¨äºŽ 3D。å¯ç”¨ mipmap 生æˆå¹¶å°†çº¹ç†åŽ‹ç¼©æ¨¡å¼è®¾ç½®ä¸º %s。"
+
+msgid "2D/3D (Auto-Detect)"
+msgstr "2D/3D(自动检测)"
+
msgid "2D"
msgstr "2D"
msgid "3D"
msgstr "3D"
+msgid "<Unnamed Material>"
+msgstr "<未命åæè´¨>"
+
+msgid "Import ID: %s"
+msgstr "导入 ID:%s"
+
+msgid ""
+"Type: %s\n"
+"Import ID: %s"
+msgstr ""
+"类型:%s\n"
+"导入 ID:%s"
+
+msgid "Error opening scene"
+msgstr "打开场景出错"
+
+msgid "Advanced Import Settings for AnimationLibrary '%s'"
+msgstr "动画库“%sâ€é«˜çº§å¯¼å…¥è®¾ç½®"
+
+msgid "Advanced Import Settings for Scene '%s'"
+msgstr "场景“%sâ€é«˜çº§å¯¼å…¥è®¾ç½®"
+
+msgid "Select folder to extract material resources"
+msgstr "选择文件夹以æå–æ质资æº"
+
+msgid "Select folder where mesh resources will save on import"
+msgstr "选择导入时ä¿å­˜ç½‘格资æºçš„文件夹"
+
+msgid "Select folder where animations will save on import"
+msgstr "选择导入时ä¿å­˜åŠ¨ç”»çš„文件夹"
+
+msgid "Existing file with the same name will be replaced."
+msgstr "已存在的åŒå文件将被替æ¢ã€‚"
+
+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 ""
+"该æ质已引用一个外部文件,故ä¸é‡‡å–任何æ“作。\n"
+"ç¦ç”¨è¯¥å¤–部属性以å†æ¬¡æå–它。"
+
+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 ""
+"æ质没有å称,也没有任何其他å¯åœ¨é‡æ–°å¯¼å…¥æ—¶è¯†åˆ«çš„æ–¹å¼ã€‚\n"
+"请命å它或确ä¿å®ƒä½¿ç”¨å”¯ä¸€çš„ ID 导出。"
+
+msgid "Extract Materials to Resource Files"
+msgstr "æå–æ质到资æºæ–‡ä»¶"
+
+msgid "Extract"
+msgstr "æå–"
+
+msgid ""
+"This mesh already saves to an external resource, no action will be taken."
+msgstr "这个网格已ç»ä¿å­˜åˆ°ä¸€ä¸ªå¤–部资æºï¼Œæ•…ä¸é‡‡å–任何行动。"
+
+msgid "Existing file with the same name will be replaced on import."
+msgstr "现有的åŒå文件将在导入时被替æ¢ã€‚"
+
+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 "设置路径"
+
+msgid ""
+"This animation already saves to an external resource, no action will be "
+"taken."
+msgstr "这个动画已ç»ä¿å­˜åˆ°ä¸€ä¸ªå¤–部资æºï¼Œå°†ä¸é‡‡å–任何行动。"
+
+msgid "Set paths to save animations as resource files on Reimport"
+msgstr "设置路径以在é‡æ–°å¯¼å…¥æ—¶å°†åŠ¨ç”»å¦å­˜ä¸ºèµ„æºæ–‡ä»¶"
+
+msgid "Can't make material external to file, write error:"
+msgstr "无法将æè´¨ä¿å­˜åˆ°å¤–部文件中,写入错误:"
+
+msgid "Actions..."
+msgstr "动作..."
+
+msgid "Extract Materials"
+msgstr "æå–æè´¨"
+
+msgid "Set Animation Save Paths"
+msgstr "设置动画ä¿å­˜è·¯å¾„"
+
+msgid "Set Mesh Save Paths"
+msgstr "设置网格ä¿å­˜è·¯å¾„"
+
msgid "Meshes"
msgstr "网格"
msgid "Materials"
msgstr "æè´¨"
+msgid "Save Extension:"
+msgstr "ä¿å­˜æ‰©å±•å:"
+
+msgid "Text: *.tres"
+msgstr "文本:*.tres"
+
+msgid "Binary: *.res"
+msgstr "二进制:*.res"
+
+msgid "Text Resource"
+msgstr "文本资æº"
+
+msgid "Binary Resource"
+msgstr "二进制资æº"
+
msgid "Select Importer"
msgstr "选择导入器"
@@ -3287,6 +5093,9 @@ msgstr "导入为:"
msgid "Preset"
msgstr "预设"
+msgid "Advanced..."
+msgstr "高级..."
+
msgid "Save Scenes, Re-Import, and Restart"
msgstr "ä¿å­˜åœºæ™¯ã€é‡æ–°å¯¼å…¥ï¼Œç„¶åŽé‡å¯"
@@ -3295,19 +5104,68 @@ msgstr "改å˜è¿™ä¸ªå¯¼å…¥çš„文件类型åŽéœ€è¦é‡å¯ç¼–辑器。"
msgid ""
"WARNING: Assets exist that use this resource, they may stop loading properly."
-msgstr "警告:存在使用本资æºçš„ç´ æ,将会åœæ­¢åŠ è½½ã€‚"
+msgstr "警告:存在使用本资æºçš„资产,将会åœæ­¢åŠ è½½ã€‚"
msgid ""
"Select a resource file in the filesystem or in the inspector to adjust "
"import settings."
msgstr "è¦è°ƒæ•´å¯¼å…¥è®¾ç½®ï¼Œè¯·åœ¨æ–‡ä»¶ç³»ç»Ÿæˆ–检查器中选中资æºæ–‡ä»¶ã€‚"
+msgid "No Event Configured"
+msgstr "未é…置事件"
+
+msgid "Keyboard Keys"
+msgstr "键盘按键"
+
+msgid "Mouse Buttons"
+msgstr "鼠标按键"
+
+msgid "Joypad Buttons"
+msgstr "手柄按键"
+
+msgid "Joypad Axes"
+msgstr "游æˆæ‰‹æŸ„è½´"
+
+msgid "Event Configuration"
+msgstr "事件é…ç½®"
+
+msgid "Manual Selection"
+msgstr "手动选择"
+
+msgid "Filter Inputs"
+msgstr "筛选输入"
+
+msgid "Additional Options"
+msgstr "é¢å¤–选项"
+
msgid "Device:"
msgstr "设备:"
+msgid "Command / Control (auto)"
+msgstr "Command / Ctrl(自动)"
+
+msgid ""
+"Automatically remaps between 'Meta' ('Command') and 'Control' depending on "
+"current platform."
+msgstr "æ ¹æ®å½“å‰å¹³å°ï¼Œåœ¨â€œMetaâ€ï¼ˆâ€œCommandâ€ï¼‰å’Œâ€œCtrlâ€ä¹‹é—´è‡ªåŠ¨é‡æ˜ å°„。"
+
+msgid ""
+"The following resources will be duplicated and embedded within this resource/"
+"object."
+msgstr "以下资æºå°†è¢«å¤åˆ¶å¹¶åµŒå…¥è¯¥èµ„æº/对象中。"
+
+msgid "This object has no resources."
+msgstr "这个对象没有资æºã€‚"
+
msgid "Failed to load resource."
msgstr "加载资æºå¤±è´¥ã€‚"
+msgid "(Current)"
+msgstr "(当å‰ï¼‰"
+
+msgid "Expand Non-Default"
+msgstr "展开éžé»˜è®¤é¡¹"
+
msgid "Property Name Style"
msgstr "属性å称样å¼"
@@ -3356,15 +5214,27 @@ msgstr "å¤åˆ¶èµ„æº"
msgid "Make Resource Built-In"
msgstr "将资æºè½¬ä¸ºå†…ç½®"
+msgid "Go to previous edited object in history."
+msgstr "å‰å¾€åŽ†å²è®°å½•ä¸­ä¸Šä¸€ä¸ªç¼–辑的对象。"
+
+msgid "Go to next edited object in history."
+msgstr "å‰å¾€åŽ†å²è®°å½•ä¸­ä¸‹ä¸€ä¸ªç¼–辑的对象。"
+
msgid "History of recently edited objects."
msgstr "最近编辑历å²å¯¹è±¡ã€‚"
msgid "Open documentation for this object."
msgstr "打开该对象的文档。"
+msgid "Filter Properties"
+msgstr "筛选属性"
+
msgid "Manage object properties."
msgstr "管ç†å¯¹è±¡å±žæ€§ã€‚"
+msgid "This cannot be undone. Are you sure?"
+msgstr "这个æ“作无法撤消。你确定å—?"
+
msgid "Add %d Translations"
msgstr "添加 %d 个翻译"
@@ -3386,6 +5256,18 @@ msgstr "移除资æºé‡å®šå‘"
msgid "Remove Resource Remap Option"
msgstr "移除资æºé‡å®šå‘选项"
+msgid "Add %d file(s) for POT generation"
+msgstr "å‘ POT 生æˆä¸­æ·»åŠ  %d 个文件"
+
+msgid "Remove file from POT generation"
+msgstr "从 POT 生æˆä¸­ç§»é™¤æ–‡ä»¶"
+
+msgid "Removed"
+msgstr "已移除"
+
+msgid "%s cannot be found."
+msgstr "无法找到 %s。"
+
msgid "Translations"
msgstr "翻译"
@@ -3404,9 +5286,36 @@ msgstr "按区域é‡å®šå‘:"
msgid "Locale"
msgstr "区域"
+msgid "POT Generation"
+msgstr "POT 生æˆ"
+
+msgid "Files with translation strings:"
+msgstr "包å«å¯ç¿»è¯‘字符串的文件:"
+
+msgid "Generate POT"
+msgstr "ç”Ÿæˆ POT"
+
+msgid "Set %s on %d nodes"
+msgstr "设置 %s 共 %d 个节点"
+
+msgid "%s (%d Selected)"
+msgstr "%s(选中 %d 个)"
+
msgid "Select a single node to edit its signals and groups."
msgstr "选择一个节点以编辑其信å·å’Œåˆ†ç»„。"
+msgid "Plugin name cannot be blank."
+msgstr "æ’件å称ä¸èƒ½ä¸ºç©ºã€‚"
+
+msgid "Script extension must match chosen language extension (.%s)."
+msgstr "脚本扩展å必须与所选语言的扩展å一致(.%s)。"
+
+msgid "Subfolder name is not a valid folder name."
+msgstr "å­æ–‡ä»¶å¤¹å称ä¸æ˜¯æœ‰æ•ˆçš„文件夹å。"
+
+msgid "Subfolder cannot be one which already exists."
+msgstr "å­æ–‡ä»¶å¤¹ä¸èƒ½å·²å­˜åœ¨ã€‚"
+
msgid "Edit a Plugin"
msgstr "编辑æ’件"
@@ -3476,9 +5385,15 @@ msgstr "加载..."
msgid "Move Node Point"
msgstr "移动节点顶点"
+msgid "Change BlendSpace1D Config"
+msgstr "修改 BlendSpace1D é…ç½®"
+
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 "此类型的节点ä¸èƒ½è¢«ä½¿ç”¨ã€‚ä»…å…许使用根节点。"
@@ -3508,7 +5423,13 @@ msgid "Select and move points, create points with RMB."
msgstr "选择并移动点,使用鼠标å³é”®åˆ›å»ºç‚¹ã€‚"
msgid "Enable snap and show grid."
-msgstr "å¯ç”¨å¸é™„并显示网格。"
+msgstr "å¯ç”¨å¸é™„并显示栅格。"
+
+msgid "Sync:"
+msgstr "åŒæ­¥ï¼š"
+
+msgid "Blend:"
+msgstr "æ··åˆï¼š"
msgid "Point"
msgstr "点"
@@ -3525,6 +5446,9 @@ msgstr "三角形已ç»å­˜åœ¨ã€‚"
msgid "Add Triangle"
msgstr "添加三角形"
+msgid "Change BlendSpace2D Config"
+msgstr "修改 BlendSpace2D é…ç½®"
+
msgid "Change BlendSpace2D Labels"
msgstr "修改 BlendSpace2D 标签"
@@ -3541,7 +5465,7 @@ msgid "No triangles exist, so no blending can take place."
msgstr "ä¸å­˜åœ¨ä»»ä½•ä¸‰è§’形,因此ä¸ä¼šæœ‰ä»»ä½•æ··æ•ˆæžœåˆäº§ç”Ÿã€‚"
msgid "Toggle Auto Triangles"
-msgstr "打开ï¼å…³é—­è‡ªåŠ¨ä¸‰è§’å½¢"
+msgstr "开关自动三角形"
msgid "Create triangles by connecting points."
msgstr "通过连接点æ¥åˆ›å»ºä¸‰è§’形。"
@@ -3552,14 +5476,11 @@ msgstr "擦除点和三角形。"
msgid "Generate blend triangles automatically (instead of manually)"
msgstr "自动生æˆæ··åˆä¸‰è§’形(而éžæ‰‹åŠ¨ï¼‰"
-msgid "Blend:"
-msgstr "æ··åˆï¼š"
-
msgid "Parameter Changed:"
msgstr "修改å‚数:"
-msgid "Edit Filters"
-msgstr "编辑筛选器"
+msgid "Inspect Filters"
+msgstr "查看筛选器"
msgid "Output node can't be added to the blend tree."
msgstr "输出节点ä¸èƒ½è¢«æ·»åŠ åˆ°æ··åˆæ ‘。"
@@ -3614,6 +5535,9 @@ msgstr "音频剪辑"
msgid "Functions"
msgstr "函数"
+msgid "Inspect Filtered Tracks:"
+msgstr "查看轨é“过滤器:"
+
msgid "Edit Filtered Tracks:"
msgstr "编辑轨é“过滤器:"
@@ -3626,23 +5550,172 @@ msgstr "添加节点..."
msgid "Enable Filtering"
msgstr "å¯ç”¨ç­›é€‰"
+msgid "Library Name:"
+msgstr "库å称:"
+
+msgid "Animation name can't be empty."
+msgstr "动画å称ä¸èƒ½ä¸ºç©ºã€‚"
+
+msgid "Animation name contains invalid characters: '/', ':', ',' or '['."
+msgstr "动画å称中存在无效字符:“/â€ã€â€œ:â€ã€â€œ,â€æˆ–“[â€ã€‚"
+
+msgid "Animation with the same name already exists."
+msgstr "已存在åŒå动画。"
+
+msgid "Enter a library name."
+msgstr "输入库å称。"
+
+msgid "Library name contains invalid characters: '/', ':', ',' or '['."
+msgstr "库å称包å«æ— æ•ˆå­—符:“/â€ã€â€œ:â€ã€â€œ,â€æˆ–“[â€ã€‚"
+
+msgid "Library with the same name already exists."
+msgstr "已存在åŒå库。"
+
+msgid "Animation name is valid."
+msgstr "动画å称有效。"
+
+msgid "Global library will be created."
+msgstr "全局库将被创建。"
+
+msgid "Library name is valid."
+msgstr "库å称有效。"
+
+msgid "Add Animation to Library: %s"
+msgstr "添加动画到库:%s"
+
+msgid "Add Animation Library: %s"
+msgstr "添加动画库:%s"
+
msgid "Load Animation"
msgstr "加载动画"
+msgid ""
+"This animation library can't be saved because it does not belong to the "
+"edited scene. Make it unique first."
+msgstr "无法ä¿å­˜æ­¤åŠ¨ç”»åº“,因为它ä¸å±žäºŽç¼–辑的场景。请先唯一化此资æºã€‚"
+
+msgid ""
+"This animation library can't be saved because it was imported from another "
+"file. Make it unique first."
+msgstr "无法ä¿å­˜æ­¤åŠ¨ç”»åº“,因为它是从å¦ä¸€ä¸ªæ–‡ä»¶å¯¼å…¥çš„。请先唯一化它。"
+
+msgid "Save Library"
+msgstr "ä¿å­˜åº“"
+
+msgid "Make Animation Library Unique: %s"
+msgstr "使动画库唯一:%s"
+
+msgid ""
+"This animation can't be saved because it does not belong to the edited "
+"scene. Make it unique first."
+msgstr "无法ä¿å­˜æ­¤åŠ¨ç”»ï¼Œå› ä¸ºå®ƒä¸å±žäºŽå·²ç¼–辑的场景。请先唯一化。"
+
+msgid ""
+"This animation can't be saved because it was imported from another file. "
+"Make it unique first."
+msgstr "无法ä¿å­˜æ­¤åŠ¨ç”»ï¼Œå› ä¸ºå®ƒæ˜¯ä»Žå¦ä¸€ä¸ªæ–‡ä»¶å¯¼å…¥çš„。请先唯一化。"
+
+msgid "Save Animation"
+msgstr "ä¿å­˜åŠ¨ç”»"
+
+msgid "Make Animation Unique: %s"
+msgstr "使动画唯一:%s"
+
+msgid "Invalid AnimationLibrary file."
+msgstr "无效的 AnimationLibrary 文件。"
+
+msgid "This library is already added to the player."
+msgstr "这个库已ç»è¢«æ·»åŠ åˆ°æ’­æ”¾å™¨ä¸­ã€‚"
+
+msgid "Invalid Animation file."
+msgstr "无效的动画文件。"
+
+msgid "This animation is already added to the library."
+msgstr "这个动画已ç»è¢«æ·»åŠ åˆ°åº“中。"
+
+msgid "Load Animation into Library: %s"
+msgstr "将动画加载到库中:%s"
+
+msgid "Save Animation library to File: %s"
+msgstr "ä¿å­˜åŠ¨ç”»åº“到文件:%s"
+
+msgid "Save Animation to File: %s"
+msgstr "ä¿å­˜åŠ¨ç”»åˆ°æ–‡ä»¶ï¼š%s"
+
+msgid "Rename Animation Library: %s"
+msgstr "é‡å‘½å动画库:%s"
+
+msgid "[Global]"
+msgstr "[全局]"
+
+msgid "Rename Animation: %s"
+msgstr "é‡å‘½å动画:%s"
+
msgid "Animation Name:"
msgstr "动画å称:"
+msgid "No animation resource in clipboard!"
+msgstr "剪贴æ¿ä¸­æ²¡æœ‰åŠ¨ç”»èµ„æºï¼"
+
msgid "Pasted Animation"
msgstr "已粘贴的动画"
msgid "Open in Inspector"
msgstr "在检查器中打开"
+msgid "Remove Animation Library: %s"
+msgstr "移除动画库:%s"
+
+msgid "Remove Animation from Library: %s"
+msgstr "从库中移除动画:%s"
+
+msgid "[built-in]"
+msgstr "[内置]"
+
+msgid "[foreign]"
+msgstr "[外部]"
+
+msgid "[imported]"
+msgstr "[已导入]"
+
+msgid "Add Animation to Library"
+msgstr "添加动画到库"
+
+msgid "Load animation from file and add to library"
+msgstr "从文件中加载动画并添加到库中"
+
+msgid "Paste Animation to Library from clipboard"
+msgstr "将动画从剪贴æ¿ç²˜è´´åˆ°åº“中"
+
+msgid "Save animation library to resource on disk"
+msgstr "将动画库ä¿å­˜ä¸ºç£ç›˜ä¸Šçš„资æº"
+
+msgid "Remove animation library"
+msgstr "移除动画库"
+
+msgid "Copy animation to clipboard"
+msgstr "将动画å¤åˆ¶åˆ°å‰ªè´´æ¿"
+
+msgid "Save animation to resource on disk"
+msgstr "将动画ä¿å­˜ä¸ºç£ç›˜ä¸Šçš„资æº"
+
+msgid "Remove animation from Library"
+msgstr "从库中移除动画"
+
+msgid "Edit Animation Libraries"
+msgstr "编辑动画库"
+
+msgid "Add Library"
+msgstr "添加库"
+
+msgid "Load Library"
+msgstr "加载库"
+
msgid "Storage"
msgstr "存储"
msgid "Toggle Autoplay"
-msgstr "打开ï¼å…³é—­è‡ªåŠ¨æ’­æ”¾"
+msgstr "开关自动播放"
msgid "Create New Animation"
msgstr "创建新动画"
@@ -3656,12 +5729,18 @@ msgstr "é‡å‘½å动画"
msgid "Change Animation Name:"
msgstr "修改动画å称:"
+msgid "Delete Animation '%s'?"
+msgstr "是å¦åˆ é™¤åŠ¨ç”»â€œ%sâ€ï¼Ÿ"
+
msgid "Remove Animation"
msgstr "移除动画"
msgid "Invalid animation name!"
msgstr "无效的动画å称ï¼"
+msgid "Animation '%s' already exists!"
+msgstr "动画“%sâ€å·²å­˜åœ¨ï¼"
+
msgid "Duplicate Animation"
msgstr "å¤åˆ¶åŠ¨ç”»"
@@ -3671,15 +5750,18 @@ msgstr "æ··åˆä¸‹ä¸€æ­¥å˜æ›´"
msgid "Change Blend Time"
msgstr "修改混åˆæ—¶é—´"
+msgid "[Global] (create)"
+msgstr "[全局](创建)"
+
+msgid "Duplicated Animation Name:"
+msgstr "é‡å¤çš„动画å称:"
+
msgid "Play selected animation backwards from current pos. (A)"
msgstr "从当å‰ä½ç½®å€’放选中动画(A)"
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "从结æŸæ—¶é—´å€’放选中动画(Shift+A)"
-msgid "Stop animation playback. (S)"
-msgstr "åœæ­¢åŠ¨ç”»æ’­æ”¾ã€‚(S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "从头播放选中动画(Shift+D)"
@@ -3698,6 +5780,9 @@ msgstr "动画工具"
msgid "Animation"
msgstr "动画"
+msgid "Manage Animations..."
+msgstr "管ç†åŠ¨ç”»..."
+
msgid "Edit Transitions..."
msgstr "编辑过渡方å¼..."
@@ -3743,6 +5828,9 @@ msgstr "强制用白色调和"
msgid "Include Gizmos (3D)"
msgstr "包括å°å·¥å…·ï¼ˆ3D)"
+msgid "Onion Skinning temporarily disabled due to rendering bug."
+msgstr "洋葱皮由于渲染错误而暂时ç¦ç”¨ã€‚"
+
msgid "Pin AnimationPlayer"
msgstr "固定 AnimationPlayer"
@@ -3767,6 +5855,9 @@ msgstr "过渡已存在ï¼"
msgid "To"
msgstr "终点"
+msgid "Add Node and Transition"
+msgstr "添加节点和过渡"
+
msgid "Add Transition"
msgstr "添加过渡"
@@ -3794,6 +5885,17 @@ msgstr "节点已移除"
msgid "Transition Removed"
msgstr "过渡已移除"
+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 ""
+"选择和移动节点。\n"
+"å³é”®ï¼šåœ¨ç‚¹å‡»çš„ä½ç½®æ·»åŠ èŠ‚点。\n"
+"Shift+左键+拖动:将选定节点与å¦ä¸€ä¸ªèŠ‚点连接,如果你选择一个没有节点的区域,则"
+"创建一个新节点。"
+
msgid "Create new nodes."
msgstr "创建新节点。"
@@ -3803,18 +5905,27 @@ msgstr "连接节点。"
msgid "Group Selected Node(s)"
msgstr "编组所选节点"
+msgid "Ungroup Selected Node"
+msgstr "å–消选定节点的分组"
+
msgid "Remove selected node or transition."
msgstr "移除选中的节点或过渡动画。"
msgid "Transition:"
msgstr "过渡:"
+msgid "New Transitions Should Auto Advance"
+msgstr "新的过渡应当自动推进"
+
msgid "Play Mode:"
msgstr "播放模å¼ï¼š"
msgid "Delete Selected"
msgstr "删除选中项"
+msgid "Delete All"
+msgstr "全部删除"
+
msgid "Root"
msgstr "æ ¹"
@@ -3888,7 +5999,10 @@ msgid "Failed SHA-256 hash check"
msgstr "SHA-256 哈希值校验失败"
msgid "Asset Download Error:"
-msgstr "ç´ æ下载出错:"
+msgstr "资产下载出错:"
+
+msgid "Ready to install!"
+msgstr "准备安装ï¼"
msgid "Downloading (%s / %s)..."
msgstr "下载中 (%s / %s)..."
@@ -3960,6 +6074,23 @@ msgstr "末页"
msgid "All"
msgstr "全部"
+msgid "No results for \"%s\" for support level(s): %s."
+msgstr "没有找到结果“%sâ€åœ¨æ”¯æŒçš„级别中:%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 ""
+"支æŒçº§åˆ« %s 中没有与 %s %s 兼容的结果。\n"
+"请检查å³ä¸Šè§’“支æŒâ€æŒ‰é’®æ‰€å¯ç”¨çš„支æŒçº§åˆ«ã€‚"
+
+msgid "Search Templates, Projects, and Demos"
+msgstr "æœç´¢æ¨¡æ¿ã€é¡¹ç›®å’Œæ¼”示"
+
+msgid "Search Assets (Excluding Templates, Projects, and Demos)"
+msgstr "æœç´¢èµ„产(ä¸åŒ…å«æ¨¡æ¿ã€é¡¹ç›®å’Œæ¼”示)"
+
msgid "Import..."
msgstr "导入..."
@@ -3982,11 +6113,17 @@ msgid "Failed to get repository configuration."
msgstr "获å–仓库é…置失败。"
msgid "Assets ZIP File"
-msgstr "ç´ æ ZIP 文件"
+msgstr "资产 ZIP 文件"
msgid "Audio Preview Play/Pause"
msgstr "音频预览播放/æš‚åœ"
+msgid "Bone Picker:"
+msgstr "骨骼拾å–器:"
+
+msgid "Clear mappings in current group."
+msgstr "清除当å‰ç»„中的映射。"
+
msgid "Preview"
msgstr "预览"
@@ -3994,10 +6131,10 @@ msgid "Configure Snap"
msgstr "设置å¸é™„"
msgid "Grid Offset:"
-msgstr "网格å移:"
+msgstr "æ …æ ¼å移:"
msgid "Grid Step:"
-msgstr "网格步长:"
+msgstr "栅格步长:"
msgid "Primary Line Every:"
msgstr "主线间隔:"
@@ -4014,6 +6151,9 @@ msgstr "旋转步长:"
msgid "Scale Step:"
msgstr "缩放步长:"
+msgid "Move Node(s) to Position"
+msgstr "移动节点到ä½ç½®"
+
msgid "Move Vertical Guide"
msgstr "移动垂直å‚考线"
@@ -4074,6 +6214,27 @@ msgstr "已分组"
msgid "Add Node Here"
msgstr "在此处添加节点"
+msgid "Instantiate Scene Here"
+msgstr "在此处实例化场景"
+
+msgid "Paste Node(s) Here"
+msgstr "在此处粘贴节点"
+
+msgid "Move Node(s) Here"
+msgstr "移动节点到此处"
+
+msgid "px"
+msgstr "px"
+
+msgid "units"
+msgstr "å•ä½"
+
+msgid "Moving:"
+msgstr "移动:"
+
+msgid "Rotating:"
+msgstr "旋转:"
+
msgid "Scaling:"
msgstr "缩放:"
@@ -4110,6 +6271,9 @@ msgstr "粘贴姿势"
msgid "Clear Guides"
msgstr "清除å‚考线"
+msgid "Create Custom Bone2D(s) from Node(s)"
+msgstr "从节点创建自定义 Bone2D"
+
msgid "Zoom to 3.125%"
msgstr "缩放至 3.125%"
@@ -4173,12 +6337,19 @@ msgstr "缩放模å¼"
msgid "Shift: Scale proportionally."
msgstr "Shift:按比例缩放。"
+msgid "Show list of selectable nodes at position clicked."
+msgstr "在点击的ä½ç½®æ˜¾ç¤ºå¯é€‰æ‹©çš„节点列表。"
+
msgid "Click to change object's rotation pivot."
msgstr "点击更改对象的旋转轴心。"
msgid "Pan Mode"
msgstr "平移模å¼"
+msgid ""
+"You can also use Pan View shortcut (Space by default) to pan in any mode."
+msgstr "您还å¯ä»¥ä½¿ç”¨å¹³ç§»è§†å›¾å¿«æ·é”®ï¼ˆé»˜è®¤ä¸ºç©ºæ ¼ï¼‰åœ¨ä»»ä½•æ¨¡å¼ä¸‹å¹³ç§»ã€‚"
+
msgid "Ruler Mode"
msgstr "标尺模å¼"
@@ -4189,10 +6360,10 @@ msgid "Use Smart Snap"
msgstr "使用智能å¸é™„"
msgid "Toggle grid snapping."
-msgstr "开关网格å¸é™„。"
+msgstr "开关栅格å¸é™„。"
msgid "Use Grid Snap"
-msgstr "使用网格å¸é™„"
+msgstr "使用栅格å¸é™„"
msgid "Snapping Options"
msgstr "å¸é™„选项"
@@ -4233,12 +6404,24 @@ 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 "解é”所选节点"
+msgid "Make selected node's children not selectable."
+msgstr "使所选节点的å­èŠ‚点ä¸å¯é€‰æ‹©ã€‚"
+
+msgid "Make selected node's children selectable."
+msgstr "使所选节点的å­èŠ‚点å¯é€‰ã€‚"
+
msgid "Ungroup Selected Node(s)"
msgstr "解组所选节点"
@@ -4248,6 +6431,9 @@ msgstr "骨架选项"
msgid "Show Bones"
msgstr "显示骨骼"
+msgid "Make Bone2D Node(s) from Node(s)"
+msgstr "从节点创建 Bone2D 节点"
+
msgid "View"
msgstr "视图"
@@ -4261,10 +6447,10 @@ msgid "Hide"
msgstr "éšè—"
msgid "Toggle Grid"
-msgstr "切æ¢ç½‘æ ¼"
+msgstr "切æ¢æ …æ ¼"
msgid "Grid"
-msgstr "网格"
+msgstr "æ …æ ¼"
msgid "Show Helpers"
msgstr "显示辅助信æ¯"
@@ -4284,6 +6470,9 @@ msgstr "显示视å£"
msgid "Show Group And Lock Icons"
msgstr "显示分组和é”定图标"
+msgid "Show Transformation Gizmos"
+msgstr "显示å˜æ¢å°å·¥å…·"
+
msgid "Center Selection"
msgstr "居中显示所选项"
@@ -4331,29 +6520,85 @@ msgid "Clear Pose"
msgstr "清除姿势"
msgid "Multiply grid step by 2"
-msgstr "网格步进乘以 2"
+msgstr "栅格步进乘以 2"
msgid "Divide grid step by 2"
-msgstr "网格步进除以 2"
+msgstr "栅格步进除以 2"
msgid "Adding %s..."
msgstr "正在添加 %s..."
+msgid "Drag and drop to add as child of current scene's root node."
+msgstr "拖放以添加为当å‰åœºæ™¯æ ¹èŠ‚点的å­èŠ‚点。"
+
+msgid "Hold Ctrl when dropping to add as child of selected node."
+msgstr "æ”¾ä¸‹æ—¶æŒ‰ä½ Ctrl 以添加为所选节点的å­èŠ‚点。"
+
+msgid "Hold Shift when dropping to add as sibling of selected node."
+msgstr "æ”¾ä¸‹æ—¶æŒ‰ä½ Shift 以添加为所选节点的åŒçº§èŠ‚点。"
+
+msgid "Hold Alt when dropping to add as a different node type."
+msgstr "æ”¾ä¸‹æ—¶æŒ‰ä½ Alt 以添加为ä¸åŒçš„节点类型。"
+
msgid "Cannot instantiate multiple nodes without root."
msgstr "没有根节点无法实例化多个节点。"
msgid "Create Node"
msgstr "创建节点"
+msgid "Error instantiating scene from %s"
+msgstr "从 %s 实例化场景时出错"
+
msgid "Change Default Type"
msgstr "修改默认类型"
+msgid "Set target_position"
+msgstr "设置 target_position"
+
msgid "Set Handle"
msgstr "设置处ç†ç¨‹åº"
+msgid "This node doesn't have a control parent."
+msgstr "这个节点没有父控件。"
+
+msgid ""
+"Use the appropriate layout properties depending on where you are going to "
+"put it."
+msgstr "æ ¹æ®è¦æ”¾ç½®çš„ä½ç½®ä½¿ç”¨é€‚当的布局属性。"
+
+msgid "This node is a child of a container."
+msgstr "这个节点是容器的å­èŠ‚点。"
+
+msgid "Use container properties for positioning."
+msgstr "使用容器属性进行定ä½ã€‚"
+
+msgid "This node is a child of a regular control."
+msgstr "这个节点是普通控件的å­èŠ‚点。"
+
+msgid "Use anchors and the rectangle for positioning."
+msgstr "使用锚点和矩形进行定ä½ã€‚"
+
+msgid "Collapse positioning hint."
+msgstr "折å å®šä½æ示。"
+
+msgid "Expand positioning hint."
+msgstr "展开定ä½æ示。"
+
+msgid "Container Default"
+msgstr "容器默认"
+
msgid "Fill"
msgstr "å¡«å……"
+msgid "Shrink Begin"
+msgstr "始端收缩"
+
+msgid "Shrink Center"
+msgstr "居中收缩"
+
+msgid "Shrink End"
+msgstr "末端收缩"
+
msgid "Custom"
msgstr "自定义"
@@ -4408,9 +6653,63 @@ msgstr "å³ä¾§å…¨å¹…"
msgid "Full Rect"
msgstr "整个矩形"
+msgid ""
+"Enable to also set the Expand flag.\n"
+"Disable to only set Shrink/Fill flags."
+msgstr ""
+"å¯ç”¨ï¼ŒåŒæ—¶è®¾ç½®æ‰©å±•æ ‡å¿—。\n"
+"ç¦ç”¨ï¼Œåªè®¾ç½®æ”¶ç¼©/填充标志。"
+
+msgid "Some parents of the selected nodes do not support the Expand flag."
+msgstr "所选节点的æŸäº›çˆ¶èŠ‚点ä¸æ”¯æŒæ‰©å±•æ ‡å¿—。"
+
+msgid "Align with Expand"
+msgstr "对é½å±•å¼€"
+
+msgid "Change Anchors, Offsets, Grow Direction"
+msgstr "更改锚点ã€å移ã€å¢žé•¿æ–¹å‘"
+
+msgid "Change Anchors, Offsets (Keep Ratio)"
+msgstr "改å˜é”šç‚¹ã€å移é‡ï¼ˆä¿æŒæ¯”例)"
+
+msgid "Change Vertical Size Flags"
+msgstr "更改垂直大å°æ ‡å¿—"
+
+msgid "Change Horizontal Size Flags"
+msgstr "更改水平大å°æ ‡å¿—"
+
+msgid "Presets for the anchor and offset values of a Control node."
+msgstr "控制节点的锚点和å移值的预设。"
+
+msgid "Anchor preset"
+msgstr "锚点预设"
+
+msgid "Set to Current Ratio"
+msgstr "设为当å‰æ¯”例"
+
+msgid "Adjust anchors and offsets to match the current rect size."
+msgstr "调整锚点和å移é‡ä»¥åŒ¹é…当å‰çš„矩形尺寸。"
+
+msgid ""
+"When active, moving Control nodes changes their anchors instead of their "
+"offsets."
+msgstr "激活åŽï¼Œç§»åŠ¨ Control 节点会更改å˜é”šç‚¹ï¼Œè€Œéžè¾¹è·ã€‚"
+
+msgid "Sizing settings for children of a Container node."
+msgstr "Container 节点的å­èŠ‚点的大å°è®¾ç½®ã€‚"
+
+msgid "Horizontal alignment"
+msgstr "水平对é½"
+
+msgid "Vertical alignment"
+msgstr "垂直对é½"
+
msgid "Load Emission Mask"
msgstr "加载å‘å°„é®ç½©"
+msgid "CPUParticles2D"
+msgstr "CPUParticles2D"
+
msgid "Generated Point Count:"
msgstr "生æˆé¡¶ç‚¹è®¡æ•°ï¼š"
@@ -4432,6 +6731,9 @@ msgstr "从åƒç´ æ•èŽ·"
msgid "Emission Colors"
msgstr "å‘射色彩"
+msgid "CPUParticles3D"
+msgstr "CPUParticles3D"
+
msgid "Create Emission Points From Node"
msgstr "从节点创建å‘射点"
@@ -4518,8 +6820,8 @@ msgid ""
msgstr ""
"å¯ç”¨è¯¥é€‰é¡¹æ—¶ï¼Œä¸€é”®éƒ¨ç½²åˆ° Android 时所导出的å¯æ‰§è¡Œæ–‡ä»¶å°†ä¸åŒ…å«é¡¹ç›®æ•°æ®ã€‚\n"
"文件系统将由编辑器基于项目通过网络æ供。\n"
-"在 Android å¹³å°ï¼Œéƒ¨ç½²å°†é€šè¿‡ USB 线缆进行以æ高性能。如果项目中包å«è¾ƒå¤§çš„ç´ "
-"æ,该选项å¯æ高测试速度。"
+"在 Android å¹³å°ï¼Œéƒ¨ç½²å°†é€šè¿‡ USB 线缆进行以æ高性能。如果项目中包å«è¾ƒå¤§çš„资"
+"产,该选项å¯æ高测试速度。"
msgid "Visible Collision Shapes"
msgstr "显示碰撞区域"
@@ -4529,6 +6831,14 @@ msgid ""
"3D) will be visible in the running project."
msgstr "å¯ç”¨è¯¥é€‰é¡¹æ—¶ï¼Œç¢°æ’žåŒºåŸŸå’Œå…‰çº¿æŠ•å°„节点(2D å’Œ 3D)将在项目è¿è¡Œæ—¶å¯è§ã€‚"
+msgid "Visible Paths"
+msgstr "显示路径"
+
+msgid ""
+"When this option is enabled, curve resources used by path nodes will be "
+"visible in the running project."
+msgstr "å¯ç”¨è¯¥é€‰é¡¹æ—¶ï¼Œè·¯å¾„节点的曲线资æºå°†åœ¨é¡¹ç›®è¿è¡Œæ—¶å¯è§ã€‚"
+
msgid "Visible Navigation"
msgstr "显示导航"
@@ -4561,15 +6871,61 @@ msgstr ""
"å¯ç”¨è¯¥é€‰é¡¹æ—¶ï¼Œä»»ä½•ä¿å­˜çš„脚本都会被正在è¿è¡Œçš„项目é‡æ–°åŠ è½½ã€‚\n"
"当使用于远程设备时,å¯ç”¨ç½‘络文件系统能æ高编辑效率。"
+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 "è¿è¡Œå¤šä¸ªå®žä¾‹"
+
+msgid "Overrides (%d)"
+msgstr "覆盖(%d)"
+
+msgid "Add Locale"
+msgstr "添加区域"
+
+msgid "Variation Coordinates (%d)"
+msgstr "å˜ä½“å标(%d)"
+
+msgid "No supported features"
+msgstr "ä¸æ”¯æŒçš„特性"
+
+msgid "Features (%d of %d set)"
+msgstr "功能(%d / %d)"
+
+msgid "Add Feature"
+msgstr "添加特性"
+
+msgid " - Variation"
+msgstr " - å˜ä½“"
+
+msgid "Unable to preview font"
+msgstr "无法预览字体"
+
msgid "Convert to CPUParticles2D"
msgstr "转æ¢ä¸º CPUParticles2D"
+msgid "Generating Visibility Rect (Waiting for Particle Simulation)"
+msgstr "正在生æˆå¯è§†çŸ©å½¢ï¼ˆç­‰å¾…ç²’å­æ¨¡æ‹Ÿï¼‰"
+
msgid "Generate Visibility Rect"
-msgstr "生æˆå¯è§†åŒ–区域"
+msgstr "生æˆå¯è§†çŸ©å½¢"
+
+msgid "Can only set point into a ParticleProcessMaterial process material"
+msgstr "åªå¯è®¾ä¸ºæŒ‡å‘ ParticleProcessMaterial 处ç†æè´¨"
msgid "Clear Emission Mask"
msgstr "清除å‘å°„é®ç½©"
+msgid "GPUParticles2D"
+msgstr "GPUParticles2D"
+
msgid "Generation Time (sec):"
msgstr "生æˆæ—¶é—´ï¼ˆç§’):"
@@ -4579,6 +6935,9 @@ msgstr "几何(é¢ï¼‰ä¸åŒ…å«ä»»ä½•åŒºåŸŸã€‚"
msgid "The geometry doesn't contain any faces."
msgstr "几何体ä¸åŒ…å«ä»»ä½•é¢ã€‚"
+msgid "\"%s\" doesn't inherit from Node3D."
+msgstr "“%sâ€æœªç»§æ‰¿ Node3D。"
+
msgid "\"%s\" doesn't contain geometry."
msgstr "“%s†ä¸åŒ…å«å‡ ä½•ä½“。"
@@ -4603,12 +6962,62 @@ msgstr "体积"
msgid "Emission Source:"
msgstr "å‘å°„æºï¼š"
+msgid "A processor material of type 'ParticleProcessMaterial' is required."
+msgstr "需è¦â€œParticleProcessMaterialâ€ç±»åž‹çš„处ç†æ质。"
+
+msgid "Convert to CPUParticles3D"
+msgstr "转æ¢ä¸º CPUParticles3D"
+
+msgid "Generating Visibility AABB (Waiting for Particle Simulation)"
+msgstr "正在生æˆå¯è§ AABB(等待粒å­æ¨¡æ‹Ÿï¼‰"
+
msgid "Generate Visibility AABB"
-msgstr "生æˆå¯è§çš„ AABB"
+msgstr "生æˆå¯è§ AABB"
+
+msgid "GPUParticles3D"
+msgstr "GPUParticles3D"
+
+msgid "Generate AABB"
+msgstr "ç”Ÿæˆ AABB"
+
+msgid "Low"
+msgstr "低"
+
+msgid "Moderate"
+msgstr "中"
+
+msgid "High"
+msgstr "高"
+
+msgid "Subdivisions: %s"
+msgstr "细分:%s"
+
+msgid "Cell size: %s"
+msgstr "å•å…ƒæ ¼å¤§å°ï¼š%s"
+
+msgid "Video RAM size: %s MB (%s)"
+msgstr "显存大å°ï¼š%s MB(%s)"
+
+msgid "Bake SDF"
+msgstr "烘焙 SDF"
+
+msgid ""
+"No faces detected during GPUParticlesCollisionSDF3D bake.\n"
+"Check whether there are visible meshes matching the bake mask within its "
+"extents."
+msgstr ""
+"烘焙 GPUParticlesCollisionSDF3D 时没有检测到é¢ã€‚\n"
+"请检查是å¦æœ‰ç¬¦åˆçƒ˜ç„™æŽ©ç çš„å¯è§ç½‘格在其范围内。"
+
+msgid "Select path for SDF Texture"
+msgstr "为 SDF 纹ç†é€‰æ‹©è·¯å¾„"
msgid "Gradient Edited"
msgstr "编辑æ¸å˜"
+msgid "Reverse/mirror gradient."
+msgstr "å转/é•œåƒæ¸å˜ã€‚"
+
msgid "Swap GradientTexture2D Fill Points"
msgstr "äº¤æ¢ GradientTexture2D 填充点"
@@ -4616,7 +7025,10 @@ msgid "Swap Gradient Fill Points"
msgstr "äº¤æ¢ Gradient 填充点"
msgid "Toggle Grid Snap"
-msgstr "切æ¢ç½‘æ ¼å¸é™„"
+msgstr "切æ¢æ …æ ¼å¸é™„"
+
+msgid "Configure"
+msgstr "é…ç½®"
msgid "Create Occluder Polygon"
msgstr "创建é®å…‰å¤šè¾¹å½¢"
@@ -4629,9 +7041,21 @@ msgstr ""
"请先ä¿å­˜åœºæ™¯ï¼ˆå…‰ç…§è´´å›¾å°†è¢«å­˜åœ¨åŒä¸€ç›®å½•ä¸‹ï¼‰æˆ–从属性é¢æ¿ä¸­æ‰‹åŠ¨ä¿å­˜ "
"BakedLightmap 属性。"
+msgid ""
+"No meshes to bake. Make sure they contain an UV2 channel and that the 'Bake "
+"Light' flag is on."
+msgstr ""
+"没有å¯çƒ˜ç„™çš„网格。请确ä¿ç½‘æ ¼åŒ…å« UV2 通é“,并且“Bake Lightâ€é€‰é¡¹å·²å¯ç”¨ã€‚"
+
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 "烘焙光照贴图"
@@ -4680,18 +7104,52 @@ msgstr "创建多个凸形状"
msgid "Create Navigation Mesh"
msgstr "创建导航网格"
+msgid "Create Debug Tangents"
+msgstr "创建调试切线"
+
msgid "Contained Mesh is not of type ArrayMesh."
msgstr "包å«çš„ Mesh ä¸æ˜¯ ArrayMesh 类型。"
+msgid ""
+"Mesh cannot unwrap UVs because it does not belong to the edited scene. Make "
+"it unique first."
+msgstr "网格无法展开 UV,因为它ä¸å±žäºŽè¢«ç¼–辑的场景。请先将其唯一化。"
+
+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 "网格无法展开 UV,因为它是从其他文件类型导入的。请先将其唯一化。"
+
msgid "UV Unwrap failed, mesh may not be manifold?"
msgstr "UV 展开失败,å¯èƒ½è¯¥ç½‘格并éžæµå½¢ï¼Ÿ"
+msgid "Unwrap UV2"
+msgstr "展开 UV2"
+
msgid "No mesh to debug."
msgstr "没有å¯è°ƒè¯•çš„网格。"
msgid "Mesh has no UV in layer %d."
msgstr "网格在层 %d 上没有 UV。"
+msgid "MeshInstance3D lacks a Mesh."
+msgstr "MeshInstance3D 缺少网格。"
+
+msgid "Mesh has no surface to create outlines from."
+msgstr "网格没有å¯ç”¨æ¥åˆ›å»ºè½®å»“的表é¢ã€‚"
+
+msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES."
+msgstr "网格的图元类型ä¸æ˜¯ PRIMITIVE_TRIANGLES。"
+
+msgid "Could not create outline."
+msgstr "无法创建轮廓。"
+
msgid "Create Outline"
msgstr "创建轮廓"
@@ -4701,6 +7159,14 @@ msgstr "网格"
msgid "Create Trimesh Static Body"
msgstr "创建三角网格é™æ€å®žä½“"
+msgid ""
+"Creates a StaticBody3D and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"创建 StaticBody3D 并自动为其分é…基于多边形的碰撞形状。\n"
+"这是最准确(但是最慢)的碰撞检测手段。"
+
msgid "Create Trimesh Collision Sibling"
msgstr "创建三角网格碰撞åŒçº§"
@@ -4746,6 +7212,15 @@ msgstr ""
msgid "Create Outline Mesh..."
msgstr "创建轮廓网格..."
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the StandardMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+"创建一个é™æ€è½®å»“网格。轮廓网格会自动翻转法线。\n"
+"å¯ä»¥ç”¨æ¥åœ¨å¿…è¦æ—¶ä»£æ›¿ StandardMaterial çš„ Grow 属性。"
+
msgid "View UV1"
msgstr "查看 UV1"
@@ -4807,6 +7282,9 @@ msgstr "未指定网格æºï¼ˆä¸” MultiMesh ä¸åŒ…å« Mesh)。"
msgid "Mesh source is invalid (invalid path)."
msgstr "网格æºæ— æ•ˆï¼ˆè·¯å¾„无效)。"
+msgid "Mesh source is invalid (not a MeshInstance3D)."
+msgstr "网格æºæ— æ•ˆï¼ˆä¸æ˜¯ MeshInstance3D)。"
+
msgid "Mesh source is invalid (contains no Mesh resource)."
msgstr "网格æºæ— æ•ˆï¼ˆä¸åŒ…å« Mesh 资æºï¼‰ã€‚"
@@ -4888,17 +7366,17 @@ msgstr "修改摄åƒæœºå°ºå¯¸"
msgid "Change Sphere Shape Radius"
msgstr "修改çƒä½“åŠå¾„"
+msgid "Change Box Shape Size"
+msgstr "修改立方体大å°"
+
msgid "Change Notifier AABB"
msgstr "修改通知器 AABB"
msgid "Change Particles AABB"
msgstr "ä¿®æ”¹ç²’å­ AABB"
-msgid "Change Box Shape Extents"
-msgstr "修改立方体大å°"
-
-msgid "Change Probe Extents"
-msgstr "修改探针范围"
+msgid "Change Radius"
+msgstr "修改åŠå¾„"
msgid "Change Capsule Shape Radius"
msgstr "修改胶囊体åŠå¾„"
@@ -4912,8 +7390,17 @@ msgstr "修改圆柱体åŠå¾„"
msgid "Change Cylinder Shape Height"
msgstr "修改圆柱体高度"
+msgid "Change Separation Ray Shape Length"
+msgstr "修改分离射线形状长度"
+
+msgid "Start Location"
+msgstr "开始ä½ç½®"
+
+msgid "End Location"
+msgstr "结æŸä½ç½®"
+
msgid "Transform Aborted."
-msgstr "已忽略å˜æ¢ã€‚"
+msgstr "å˜æ¢ä¸­æ­¢ã€‚"
msgid "Orthogonal"
msgstr "正交"
@@ -4972,12 +7459,51 @@ msgstr "Z è½´å˜æ¢ã€‚"
msgid "View Plane Transform."
msgstr "视图平é¢å˜æ¢ã€‚"
+msgid "YZ-Plane Transform."
+msgstr "YZ å¹³é¢å˜æ¢ã€‚"
+
+msgid "XZ-Plane Transform."
+msgstr "XZ å¹³é¢å˜æ¢ã€‚"
+
+msgid "XY-Plane Transform."
+msgstr "XY å¹³é¢å˜æ¢ã€‚"
+
msgid "Keying is disabled (no key inserted)."
msgstr "å·²ç¦ç”¨å…³é”®å¸§æ’入(未æ’入关键帧)。"
msgid "Animation Key Inserted."
msgstr "æ’入动画键。"
+msgid "X: %s\n"
+msgstr "X:%s\n"
+
+msgid "Y: %s\n"
+msgstr "Y:%s\n"
+
+msgid "Z: %s\n"
+msgstr "Z:%s\n"
+
+msgid "Size: %s (%.1fMP)\n"
+msgstr "大å°ï¼š%s(%.1fMP)\n"
+
+msgid "Objects: %d\n"
+msgstr "对象数:%d\n"
+
+msgid "Primitive Indices: %d\n"
+msgstr "图元索引:%d\n"
+
+msgid "Draw Calls: %d"
+msgstr "绘制调用:%d"
+
+msgid "CPU Time: %s ms"
+msgstr "CPU 时间:%s ms"
+
+msgid "GPU Time: %s ms"
+msgstr "GPU 时间:%s ms"
+
+msgid "FPS: %d"
+msgstr "FPS:%d"
+
msgid "Top View."
msgstr "顶视图。"
@@ -5002,6 +7528,15 @@ msgstr "å°†å˜æ¢ä¸Žè§†å›¾å¯¹é½"
msgid "Align Rotation with View"
msgstr "将旋转与视图对é½"
+msgid "Set Surface %d Override Material"
+msgstr "è®¾ç½®è¡¨é¢ %d 覆盖æè´¨"
+
+msgid "Set Material Override"
+msgstr "设置æ质覆盖"
+
+msgid "Cannot drag and drop into multiple selected nodes."
+msgstr "ä¸èƒ½æ‹–放到多个选定的节点。"
+
msgid "None"
msgstr "æ— "
@@ -5032,15 +7567,78 @@ msgstr "显示线框"
msgid "Display Overdraw"
msgstr "显示é‡å¤ç»˜åˆ¶"
+msgid "Display Lighting"
+msgstr "显示光照"
+
msgid "Display Unshaded"
msgstr "显示无阴影"
+msgid "Directional Shadow Splits"
+msgstr "æ–¹å‘阴影拆分"
+
+msgid "Normal Buffer"
+msgstr "法线缓冲"
+
msgid "Shadow Atlas"
msgstr "阴影图集"
+msgid "Directional Shadow Map"
+msgstr "æ–¹å‘阴影图"
+
+msgid "Decal Atlas"
+msgstr "贴花图集"
+
+msgid "VoxelGI Lighting"
+msgstr "VoxelGI 光照"
+
+msgid "VoxelGI Albedo"
+msgstr "VoxelGI å照率"
+
+msgid "VoxelGI Emission"
+msgstr "VoxelGI 自å‘å…‰"
+
+msgid "SDFGI Cascades"
+msgstr "SDFGI 层å "
+
+msgid "SDFGI Probes"
+msgstr "SDFGI 探针"
+
+msgid "Scene Luminance"
+msgstr "场景亮度"
+
msgid "SSAO"
msgstr "SSAO"
+msgid "SSIL"
+msgstr "SSIL"
+
+msgid "VoxelGI/SDFGI Buffer"
+msgstr "VoxelGI/SDFGI 缓冲区"
+
+msgid "Disable Mesh LOD"
+msgstr "ç¦ç”¨ç½‘æ ¼ LOD"
+
+msgid "OmniLight3D Cluster"
+msgstr "OmniLight3D 集群"
+
+msgid "SpotLight3D Cluster"
+msgstr "SpotLight3D 集群"
+
+msgid "Decal Cluster"
+msgstr "贴花集群"
+
+msgid "ReflectionProbe Cluster"
+msgstr "å射探针集群"
+
+msgid "Occlusion Culling Buffer"
+msgstr "é®æŒ¡å‰”除缓冲"
+
+msgid "Motion Vectors"
+msgstr "è¿åŠ¨å‘é‡"
+
+msgid "Display Advanced..."
+msgstr "显示高级..."
+
msgid "View Environment"
msgstr "查看环境"
@@ -5050,6 +7648,9 @@ msgstr "查看å°å·¥å…·"
msgid "View Information"
msgstr "查看信æ¯"
+msgid "View Frame Time"
+msgstr "查看帧时间"
+
msgid "Half Resolution"
msgstr "åŠåˆ†è¾¨çŽ‡"
@@ -5062,6 +7663,9 @@ msgstr "å¯ç”¨å¤šæ™®å‹’效应"
msgid "Cinematic Preview"
msgstr "效果预览"
+msgid "Not available when using the OpenGL renderer."
+msgstr "使用 OpenGL 渲染器时ä¸å¯ç”¨ã€‚"
+
msgid "Freelook Left"
msgstr "自由观看å‘å·¦"
@@ -5086,6 +7690,36 @@ msgstr "自由观看加速调整"
msgid "Freelook Slow Modifier"
msgstr "自由观看å‡é€Ÿè°ƒæ•´"
+msgid "Lock Transformation to X axis"
+msgstr "å°†å˜æ¢é”定至 X è½´"
+
+msgid "Lock Transformation to Y axis"
+msgstr "å°†å˜æ¢é”定至 Y è½´"
+
+msgid "Lock Transformation to Z axis"
+msgstr "å°†å˜æ¢é”定至 Z è½´"
+
+msgid "Lock Transformation to YZ plane"
+msgstr "å°†å˜æ¢é”定至 YZ å¹³é¢"
+
+msgid "Lock Transformation to XZ plane"
+msgstr "å°†å˜æ¢é”定至 XZ å¹³é¢"
+
+msgid "Lock Transformation to XY plane"
+msgstr "å°†å˜æ¢é”定至 XY å¹³é¢"
+
+msgid "Cancel Transformation"
+msgstr "å–消å˜æ¢"
+
+msgid "Begin Translate Transformation"
+msgstr "开始平移å˜æ¢"
+
+msgid "Begin Rotate Transformation"
+msgstr "开始旋转å˜æ¢"
+
+msgid "Begin Scale Transformation"
+msgstr "开始缩放å˜æ¢"
+
msgid "Toggle Camera Preview"
msgstr "开关摄åƒæœºé¢„览"
@@ -5096,6 +7730,16 @@ msgid ""
"To zoom further, change the camera's clipping planes (View -> Settings...)"
msgstr "修改相机的è£å‰ªå¹³é¢åŽæ‰èƒ½è¿›ä¸€æ­¥ç¼©æ”¾ï¼ˆè§†å›¾ -> 设置...)"
+msgid "Overriding material..."
+msgstr "覆盖æè´¨..."
+
+msgid ""
+"Drag and drop to override the material of any geometry node.\n"
+"Hold Ctrl when dropping to override a specific surface."
+msgstr ""
+"拖放以覆盖任æ„几何体节点的æ质。\n"
+"æ”¾ä¸‹æ—¶æŒ‰ä½ Ctrl 键,å¯ä»¥è¦†ç›–一个特定的é¢ã€‚"
+
msgid "XForm Dialog"
msgstr "å˜æ¢å¯¹è¯æ¡†"
@@ -5118,12 +7762,58 @@ msgstr "将节点å¸é™„至地é¢"
msgid "Couldn't find a solid floor to snap the selection to."
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 ""
+"Toggle preview environment.\n"
+"If a WorldEnvironment node is added to the scene, preview environment is "
+"disabled."
+msgstr ""
+"切æ¢é¢„览环境。\n"
+"如果一个 WorldEnvironment 节点被添加到场景中,预览环境将被ç¦ç”¨ã€‚"
+
+msgid "Edit Sun and Environment settings."
+msgstr "编辑太阳和环境设置。"
+
msgid "Bottom View"
msgstr "底视图"
@@ -5215,7 +7905,7 @@ msgid "View Origin"
msgstr "显示原点"
msgid "View Grid"
-msgstr "显示网格"
+msgstr "显示栅格"
msgid "Settings..."
msgstr "设置..."
@@ -5265,15 +7955,102 @@ 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"
+"Hold Shift while clicking to also add the preview environment to the current "
+"scene."
+msgstr ""
+"在当å‰åœºæ™¯ä¸­æ·»åŠ ä¸€ä¸ªåŒ¹é…预览太阳设置的 DirectionalLight3D 节点。\n"
+"ç‚¹å‡»æ—¶æŒ‰ä½ Shift 键,也å¯ä»¥å°†é¢„览环境添加到当å‰åœºæ™¯ä¸­ã€‚"
+
+msgid "Preview Environment"
+msgstr "预览环境"
+
+msgid "Sky Color"
+msgstr "天空颜色"
+
+msgid "Ground Color"
+msgstr "地é¢é¢œè‰²"
+
+msgid "Sky Energy"
+msgstr "天空能é‡"
+
+msgid "AO"
+msgstr "环境光é®è”½"
+
msgid "Glow"
msgstr "辉光"
msgid "Tonemap"
msgstr "色调映射"
+msgid "GI"
+msgstr "全局光"
+
+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"
+"Hold Shift while clicking to also add the preview sun to the current scene."
+msgstr ""
+"在当å‰åœºæ™¯ä¸­æ·»åŠ ä¸€ä¸ªåŒ¹é…预览环境设置的 WorldEnvironment 节点。\n"
+"点击时按ä½Shift键,也å¯ä»¥å°†é¢„览太阳添加到当å‰åœºæ™¯ä¸­ã€‚"
+
+msgid ""
+"Can't determine a save path for the occluder.\n"
+"Save your scene and try again."
+msgstr ""
+"无法确定é®æŒ¡å™¨çš„ä¿å­˜è·¯å¾„。\n"
+"请ä¿å­˜åœºæ™¯ï¼Œç„¶åŽé‡è¯•ã€‚"
+
+msgid ""
+"No meshes to bake.\n"
+"Make sure there is at least one MeshInstance3D node in the scene whose "
+"visual layers are part of the OccluderInstance3D's Bake Mask property."
+msgstr ""
+"没有è¦çƒ˜ç„™çš„网格。\n"
+"ç¡®ä¿åœºæ™¯ä¸­è‡³å°‘有一个 MeshInstance3D 节点,其å¯è§†å±‚是 OccluderInstance3D 的烘"
+"焙掩ç å±žæ€§çš„一部分。"
+
+msgid "Could not save the new occluder at the specified path:"
+msgstr "无法在指定路径上ä¿å­˜è¯¥æ–°é®æŒ¡å™¨ï¼š"
+
+msgid "Bake Occluders"
+msgstr "烘焙é®æŒ¡å™¨"
+
+msgid "Select occluder bake file:"
+msgstr "选择é®æŒ¡å™¨çƒ˜ç„™æ–‡ä»¶ï¼š"
+
msgid "Remove Point from Curve"
msgstr "从曲线中移除顶点"
@@ -5476,7 +8253,7 @@ msgid "Clear UV"
msgstr "清除 UV"
msgid "Grid Settings"
-msgstr "网格设置"
+msgstr "栅格设置"
msgid "Snap"
msgstr "å¸é™„"
@@ -5485,22 +8262,22 @@ msgid "Enable Snap"
msgstr "å¯ç”¨å¸é™„"
msgid "Show Grid"
-msgstr "显示网格"
+msgstr "显示栅格"
msgid "Configure Grid:"
-msgstr "é…置网格:"
+msgstr "é…置栅格:"
msgid "Grid Offset X:"
-msgstr "网格 X å移:"
+msgstr "æ …æ ¼ X å移:"
msgid "Grid Offset Y:"
-msgstr "网格 Y å移:"
+msgstr "æ …æ ¼ Y å移:"
msgid "Grid Step X:"
-msgstr "网格 X 步进:"
+msgstr "栅格 X 步进:"
msgid "Grid Step Y:"
-msgstr "网格 Y 步进:"
+msgstr "栅格 Y 步进:"
msgid "Sync Bones to Polygon"
msgstr "åŒæ­¥éª¨éª¼åˆ°å¤šè¾¹å½¢"
@@ -5583,6 +8360,12 @@ msgstr "无法在以下ä½ç½®åŠ è½½æ–‡ä»¶ï¼š"
msgid "Save File As..."
msgstr "å¦å­˜ä¸º..."
+msgid "Can't obtain the script for reloading."
+msgstr "无法获å–用于é‡æ–°åŠ è½½çš„脚本。"
+
+msgid "Reload only takes effect on tool scripts."
+msgstr "é‡æ–°åŠ è½½åªå¯¹å·¥å…·è„šæœ¬ç”Ÿæ•ˆã€‚"
+
msgid "Can't obtain the script for running."
msgstr "无法获å–è¦æ‰§è¡Œçš„脚本。"
@@ -5608,6 +8391,9 @@ msgstr "ä¿å­˜å‡ºé”™"
msgid "Save Theme As..."
msgstr "主题å¦å­˜ä¸º..."
+msgid "Unsaved file."
+msgstr "未ä¿å­˜çš„文件。"
+
msgid "%s Class Reference"
msgstr "%s ç±»å‚考"
@@ -5617,6 +8403,9 @@ msgstr "查找下一个"
msgid "Find Previous"
msgstr "查找上一个"
+msgid "Filter Scripts"
+msgstr "筛选脚本"
+
msgid "Toggle alphabetical sorting of the method list."
msgstr "切æ¢æŒ‰å­—æ¯é¡ºåºæŽ’列方法。"
@@ -5641,6 +8430,9 @@ msgstr "é‡æ–°æ‰“开关闭的脚本"
msgid "Save All"
msgstr "全部ä¿å­˜"
+msgid "Soft Reload Tool Script"
+msgstr "软é‡è½½å·¥å…·è„šæœ¬"
+
msgid "Copy Script Path"
msgstr "å¤åˆ¶è„šæœ¬è·¯å¾„"
@@ -5708,12 +8500,21 @@ msgstr "清除最近的脚本"
msgid "Standard"
msgstr "标准"
+msgid "Plain Text"
+msgstr "纯文本"
+
msgid "Connections to method:"
msgstr "与方法的连接:"
+msgid "Source"
+msgstr "æ¥æº"
+
msgid "Target"
msgstr "目标"
+msgid "Error at (%d, %d):"
+msgstr "(%d, %d) 处的错误:"
+
msgid ""
"Missing connected method '%s' for signal '%s' from node '%s' to node '%s'."
msgstr "未找到方法 “%sâ€ï¼ˆè¿žæŽ¥äºŽä¿¡å·â€œ%sâ€ã€æ¥è‡ªèŠ‚点“%sâ€ã€ç›®æ ‡èŠ‚点“%sâ€ï¼‰ã€‚"
@@ -5730,6 +8531,9 @@ msgstr "转到函数"
msgid "Only resources from filesystem can be dropped."
msgstr "åªå¯æ‹–放æ¥è‡ªæ–‡ä»¶ç³»ç»Ÿä¸­çš„资æºã€‚"
+msgid "Can't drop nodes without an open scene."
+msgstr "没有打开的场景无法放置节点。"
+
msgid "Can't drop nodes because script '%s' is not used in this scene."
msgstr "无法放置该节点,因为脚本 “%s†未在该场景中使用。"
@@ -5739,6 +8543,12 @@ msgstr "查找符å·"
msgid "Pick Color"
msgstr "拾å–颜色"
+msgid "Folding"
+msgstr "折å "
+
+msgid "Indentation"
+msgstr "缩进"
+
msgid "Uppercase"
msgstr "大写"
@@ -5763,11 +8573,14 @@ msgstr "转到"
msgid "Delete Line"
msgstr "删除行"
+msgid "Unindent"
+msgstr "å–消缩进"
+
msgid "Toggle Comment"
msgstr "切æ¢æ³¨é‡Š"
msgid "Fold/Unfold Line"
-msgstr "折å ï¼å±•å¼€è¡Œ"
+msgstr "折å /展开行"
msgid "Fold All Lines"
msgstr "折å æ‰€æœ‰è¡Œ"
@@ -5818,7 +8631,7 @@ msgid "Go to Line..."
msgstr "转到行..."
msgid "Toggle Breakpoint"
-msgstr "设置ï¼ç§»é™¤æ–­ç‚¹"
+msgstr "设置/移除断点"
msgid "Remove All Breakpoints"
msgstr "移除所有断点"
@@ -5829,6 +8642,46 @@ msgstr "转到下一个断点"
msgid "Go to Previous Breakpoint"
msgstr "转到上一个断点"
+msgid "New Shader Include"
+msgstr "新建ç€è‰²å™¨å¤´æ–‡ä»¶"
+
+msgid "Load Shader File"
+msgstr "加载ç€è‰²å™¨æ–‡ä»¶"
+
+msgid "Load Shader Include File"
+msgstr "加载ç€è‰²å™¨å¤´æ–‡ä»¶"
+
+msgid "Save File"
+msgstr "ä¿å­˜"
+
+msgid "Save File As"
+msgstr "å¦å­˜ä¸º"
+
+msgid "Open File in Inspector"
+msgstr "在检查器中打开"
+
+msgid "Close File"
+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 "ç€è‰²å™¨æ–‡ä»¶"
+
msgid "This skeleton has no bones, create some children Bone2D nodes."
msgstr "该骨架没有骨骼,请创建一些 Bone2D å­èŠ‚点。"
@@ -5847,12 +8700,76 @@ msgstr "é‡ç½®ä¸ºæ”¾æ¾å§¿åŠ¿"
msgid "Overwrite Rest Pose"
msgstr "覆盖放æ¾å§¿åŠ¿"
+msgid "Set Bone Transform"
+msgstr "设置骨骼å˜æ¢"
+
+msgid "Set Bone Rest"
+msgstr "设置骨骼放æ¾"
+
+msgid "Cannot create a physical skeleton for a Skeleton3D node with no bones."
+msgstr "无法为没有骨骼的 Skeleton3D 节点创建物ç†éª¨æž¶ã€‚"
+
msgid "Create physical bones"
msgstr "创建物ç†éª¨éª¼"
+msgid "Cannot export a SkeletonProfile for a Skeleton3D node with no bones."
+msgstr "无法为没有骨骼的 Skeleton3D 节点导出 SkeletonProfile。"
+
+msgid "Export Skeleton Profile As..."
+msgstr "将骨架é…置文件导出为..."
+
+msgid "Set Bone Parentage"
+msgstr "设置骨骼父å­å…³ç³»"
+
+msgid "Skeleton3D"
+msgstr "Skeleton3D"
+
+msgid "Reset All Bone Poses"
+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 "Insert key of all bone poses."
+msgstr "æ’入所有骨骼姿势关键帧。"
+
+msgid "Insert Key (All Bones)"
+msgstr "æ’入关键帧(所有骨骼)"
+
+msgid "Bone Transform"
+msgstr "骨骼å˜æ¢"
+
msgid "Play IK"
msgstr "播放 IK"
+msgid "Create MeshInstance2D"
+msgstr "创建 MeshInstance2D"
+
+msgid "MeshInstance2D Preview"
+msgstr "MeshInstance2D 预览"
+
msgid "Create Polygon2D"
msgstr "创建 Polygon2D"
@@ -5871,6 +8788,12 @@ msgstr "创建 LightOccluder2D"
msgid "LightOccluder2D Preview"
msgstr "LightOccluder2D 预览"
+msgid "Can't convert a Sprite2D from a foreign scene."
+msgstr "æ— æ³•ä»Žå¤–éƒ¨åœºæ™¯è½¬æ¢ Sprite2D。"
+
+msgid "Sprite2D is empty!"
+msgstr "Sprite2D 为空ï¼"
+
msgid "Can't convert a sprite using animation frames to mesh."
msgstr "无法将使用动画帧的精çµè½¬æ¢ä¸ºç½‘格。"
@@ -5898,6 +8821,9 @@ msgstr "无效的几何体,无法创建é®å…‰ä½“。"
msgid "Create LightOccluder2D Sibling"
msgstr "创建 LightOccluder2D 兄弟节点"
+msgid "Sprite2D"
+msgstr "Sprite2D"
+
msgid "Simplification:"
msgstr "简化:"
@@ -5946,24 +8872,54 @@ msgstr "是å¦åˆ é™¤åŠ¨ç”»ï¼Ÿ"
msgid "Change Animation FPS"
msgstr "修改动画 FPS"
+msgid "Set Frame Duration"
+msgstr "设置帧时长"
+
msgid "(empty)"
msgstr "(空)"
msgid "Animations:"
msgstr "动画:"
-msgid "Speed:"
-msgstr "速度:"
+msgid "Filter Animations"
+msgstr "筛选动画"
-msgid "Loop"
-msgstr "循环"
+msgid "Delete Animation"
+msgstr "删除动画"
msgid "Animation Frames:"
msgstr "动画帧:"
+msgid "Frame Duration:"
+msgstr "帧æŒç»­æ—¶é—´ï¼š"
+
msgid "Zoom Reset"
msgstr "é‡ç½®ç¼©æ”¾"
+msgid "Add frame from file"
+msgstr "从文件中添加帧"
+
+msgid "Add frames from sprite sheet"
+msgstr "从精çµè¡¨ä¸­æ·»åŠ å¸§"
+
+msgid "Delete Frame"
+msgstr "删除帧"
+
+msgid "Copy Frame"
+msgstr "å¤åˆ¶å¸§"
+
+msgid "Insert Empty (Before Selected)"
+msgstr "æ’入空白帧(在所选之å‰ï¼‰"
+
+msgid "Insert Empty (After Selected)"
+msgstr "æ’入空白帧(在所选之åŽï¼‰"
+
+msgid "Move Frame Left"
+msgstr "å‘左移动帧"
+
+msgid "Move Frame Right"
+msgstr "å‘å³ç§»åŠ¨å¸§"
+
msgid "Select Frames"
msgstr "选择帧"
@@ -5985,6 +8941,25 @@ msgstr "从精çµè¡¨ä¸­åˆ›å»ºå¸§"
msgid "SpriteFrames"
msgstr "动画帧"
+msgid "Warnings should be fixed to prevent errors."
+msgstr "应修å¤è­¦å‘Šä»¥é˜²æ­¢å‡ºé”™ã€‚"
+
+msgid ""
+"This shader has been modified on disk.\n"
+"What action should be taken?"
+msgstr ""
+"这个ç€è‰²å™¨å·²åœ¨ç¡¬ç›˜ä¸Šä¿®æ”¹ã€‚\n"
+"应该采å–什么行动?"
+
+msgid "%s Mipmaps"
+msgstr "%s Mipmaps"
+
+msgid "Memory: %s"
+msgstr "内存:%s"
+
+msgid "No Mipmaps"
+msgstr "æ—  Mipmaps"
+
msgid "Set Region Rect"
msgstr "设置纹ç†åŒºåŸŸ"
@@ -5998,7 +8973,7 @@ msgid "Pixel Snap"
msgstr "åƒç´ å¸é™„"
msgid "Grid Snap"
-msgstr "网格å¸é™„"
+msgstr "æ …æ ¼å¸é™„"
msgid "Auto Slice"
msgstr "自动è£å‰ª"
@@ -6006,24 +8981,61 @@ msgstr "自动è£å‰ª"
msgid "Step:"
msgstr "步长:"
+msgid "Region Editor"
+msgstr "区域编辑器"
+
+msgid "Edit Region"
+msgstr "编辑区域"
+
msgid "Styleboxes"
msgstr "æ ·å¼ç›’"
+msgid "1 color"
+msgid_plural "{num} colors"
+msgstr[0] "{num} 个颜色"
+
msgid "No colors found."
msgstr "没有颜色。"
+msgid "1 constant"
+msgid_plural "{num} constants"
+msgstr[0] "{num} 个常é‡"
+
msgid "No constants found."
msgstr "没有常é‡ã€‚"
+msgid "1 font"
+msgid_plural "{num} fonts"
+msgstr[0] "{num} 个字体"
+
msgid "No fonts found."
msgstr "没有字体。"
+msgid "1 font size"
+msgid_plural "{num} font sizes"
+msgstr[0] "{num} 个字体大å°"
+
+msgid "No font sizes found."
+msgstr "未找到字体大å°ã€‚"
+
+msgid "1 icon"
+msgid_plural "{num} icons"
+msgstr[0] "{num} 个图标"
+
msgid "No icons found."
msgstr "没有图标。"
+msgid "1 stylebox"
+msgid_plural "{num} styleboxes"
+msgstr[0] "{num} 个样å¼ç›’"
+
msgid "No styleboxes found."
msgstr "没有样å¼ç›’。"
+msgid "{num} currently selected"
+msgid_plural "{num} currently selected"
+msgstr[0] "当å‰é€‰ä¸­ {num} 个"
+
msgid "Nothing was selected for the import."
msgstr "没有选中导入任何东西。"
@@ -6039,6 +9051,12 @@ msgstr "正在更新编辑器"
msgid "Finalizing"
msgstr "正在收尾"
+msgid "Import Theme Items"
+msgstr "导入主题项目"
+
+msgid "Filter Items"
+msgstr "筛选项目"
+
msgid "With Data"
msgstr "å«æ•°æ®"
@@ -6072,6 +9090,18 @@ msgstr "选择所有å¯è§çš„字体项目和它们的数æ®ã€‚"
msgid "Deselect all visible font items."
msgstr "å–消选择所有å¯è§çš„字体项目。"
+msgid "Font sizes"
+msgstr "字体大å°"
+
+msgid "Select all visible font size items."
+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 "选择所有å¯è§çš„图标项目。"
@@ -6149,6 +9179,9 @@ msgstr "移除所有常é‡é¡¹ç›®"
msgid "Remove All Font Items"
msgstr "移除所有字体项目"
+msgid "Remove All Font Size Items"
+msgstr "移除所有字体大å°é¡¹ç›®"
+
msgid "Remove All Icon Items"
msgstr "移除所有图标项目"
@@ -6162,12 +9195,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 "添加颜色项目"
@@ -6177,6 +9228,9 @@ msgstr "添加常é‡é¡¹ç›®"
msgid "Add Font Item"
msgstr "添加字体项目"
+msgid "Add Font Size Item"
+msgstr "添加字体大å°é¡¹ç›®"
+
msgid "Add Icon Item"
msgstr "添加图标项目"
@@ -6192,12 +9246,18 @@ msgstr "é‡å‘½å常é‡é¡¹ç›®"
msgid "Rename Font Item"
msgstr "é‡å‘½å字体项目"
+msgid "Rename Font Size Item"
+msgstr "é‡å‘½å字体大å°é¡¹ç›®"
+
msgid "Rename Icon Item"
msgstr "é‡å‘½å图标项目"
msgid "Rename Stylebox Item"
msgstr "é‡å‘½åæ ·å¼ç›’项目"
+msgid "Rename Theme Item"
+msgstr "é‡å‘½å主题项目"
+
msgid "Invalid file, not a Theme resource."
msgstr "无效文件,ä¸æ˜¯ Theme 资æºã€‚"
@@ -6294,12 +9354,48 @@ msgstr "添加项目类型"
msgid "Add Type"
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 "设置主题中的样å¼ç›’项"
+
+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 "设置基础类型"
+msgid "Add a type from a list of available types or create a new one."
+msgstr "从å¯ç”¨ç±»åž‹åˆ—表中添加类型或创建新类型。"
+
msgid "Show Default"
msgstr "显示默认"
@@ -6350,13 +9446,13 @@ msgid "Toggle Button"
msgstr "切æ¢æŒ‰é’®"
msgid "Disabled Button"
-msgstr "ä¸å¯ç”¨çš„按钮"
+msgstr "ç¦ç”¨çš„按钮"
msgid "Item"
msgstr "项目"
msgid "Disabled Item"
-msgstr "ä¸å¯ç”¨çš„项目"
+msgstr "ç¦ç”¨çš„项目"
msgid "Check Item"
msgstr "检查项目"
@@ -6421,6 +9517,90 @@ 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 "Next Line After Column"
+msgstr "列åŽçš„下一行"
+
+msgid "Please select two atlases or more."
+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 "Center View"
+msgstr "居中视图"
+
+msgid "No atlas source with a valid texture selected."
+msgstr "未选择有效纹ç†çš„图集æºã€‚"
+
+msgid "Base Tiles"
+msgstr "基础图å—"
+
+msgid "Alternative Tiles"
+msgstr "备选图å—"
+
+msgid "Reset Polygons"
+msgstr "é‡ç½®å¤šè¾¹å½¢"
+
+msgid "Clear Polygons"
+msgstr "清空多边形"
+
+msgid "Rotate Polygons Right"
+msgstr "å‘å³æ—‹è½¬å¤šè¾¹å½¢"
+
+msgid "Rotate Polygons Left"
+msgstr "å‘左旋转多边形"
+
+msgid "Flip Polygons Horizontally"
+msgstr "水平翻转多边形"
+
+msgid "Flip Polygons Vertically"
+msgstr "垂直翻转多边形"
+
+msgid "Edit Polygons"
+msgstr "编辑多边形"
+
+msgid "Add polygon tool"
+msgstr "多边形添加工具"
+
+msgid "Edit points tool"
+msgstr "点编辑工具"
+
+msgid "Delete points tool"
+msgstr "点删除工具"
+
+msgid "Reset to default tile shape"
+msgstr "é‡ç½®ä¸ºé»˜è®¤å›¾å—形状"
+
msgid "Rotate Right"
msgstr "å‘å³æ—‹è½¬"
@@ -6433,18 +9613,373 @@ msgstr "水平翻转"
msgid "Flip Vertically"
msgstr "垂直翻转"
+msgid "Snap to half-pixel"
+msgstr "å¸é™„至åŠåƒç´ "
+
+msgid "Painting Tiles Property"
+msgstr "绘制图å—属性"
+
+msgid "Painting:"
+msgstr "绘制:"
+
+msgid "No terrains"
+msgstr "没有地形"
+
+msgid "No terrain"
+msgstr "没有地形"
+
+msgid "Painting Terrain Set"
+msgstr "绘制地形集"
+
+msgid "Painting 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 模å¼"
+
+msgid "Remove TileSet patterns"
+msgstr "移除 TileSet 模å¼"
+
+msgid "Tile with Invalid Scene"
+msgstr "包å«æ— æ•ˆåœºæ™¯çš„图å—"
+
+msgid "Delete tiles"
+msgstr "删除图å—"
+
+msgid "Change selection"
+msgstr "修改选中项"
+
+msgid "Move tiles"
+msgstr "移动图å—"
+
+msgid "Paint tiles"
+msgstr "绘制图å—"
+
+msgid "Paste tiles"
+msgstr "粘贴图å—"
+
+msgid "Shift: Draw line."
+msgstr "Shift:画直线。"
+
+msgid "Shift+Ctrl: Draw rectangle."
+msgstr "Shift+Ctrl:画矩形。"
+
+msgid "Alternatively hold Ctrl with other tools to pick tile."
+msgstr "也å¯ä»¥åœ¨ä½¿ç”¨å…¶ä»–å·¥å…·æ—¶æŒ‰ä½ Ctrl é”®æ¥æŒ‘选图å—。"
+
+msgid "Alternatively use RMB to erase tiles."
+msgstr "也å¯ä»¥ç”¨é¼ æ ‡å³é”®æ“¦é™¤å›¾å—。"
+
+msgid "Contiguous"
+msgstr "è¿žç»­"
+
+msgid "Place Random Tile"
+msgstr "放置éšæœºå›¾å—"
+
+msgid ""
+"Defines the probability of painting nothing instead of a randomly selected "
+"tile."
+msgstr "定义ä¸ç»˜åˆ¶ä»»ä½•å†…容而ä¸æ˜¯ç»˜åˆ¶éšæœºé€‰æ‹©çš„图å—的概率。"
+
+msgid "Scattering:"
+msgstr "散布:"
+
msgid "Tiles"
-msgstr "ç£è´´"
+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 "æºæŽ’åº"
+
+msgid "Sort by ID (Ascending)"
+msgstr "按 ID 排åºï¼ˆå‡åºï¼‰"
+
+msgid "Sort by ID (Descending)"
+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 ""
+"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 "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 "高亮所选 TileMap 图层"
+
+msgid "Toggle grid visibility."
+msgstr "切æ¢æ …æ ¼å¯è§æ€§ã€‚"
+
+msgid "Automatically Replace Tiles with Proxies"
+msgstr "自动将图å—替æ¢ä¸ºä»£ç†"
+
+msgid "The edited TileMap node has no TileSet resource."
+msgstr "编辑的 TileMap 节点没有 TileSet 资æºã€‚"
+
+msgid "Remove Tile Proxies"
+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 "图集"
+msgid "Base Tile"
+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 "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 ""
+"Atlas setup. Add/Remove tiles tool (use the shift key to create big tiles, "
+"control for rectangle editing)."
+msgstr "图集设置。图å—添加/移除工具(Shift 键创建大图å—ã€Ctrl 键编辑矩形)。"
+
+msgid "Select tiles."
+msgstr "选择图å—。"
+
+msgid "Paint"
+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 "错误"
@@ -6455,6 +9990,12 @@ msgstr "远程仓库设置为空。使用网络的 VCS 特性å¯èƒ½æ— æ³•å·¥ä½œã
msgid "Commit"
msgstr "æ交"
+msgid "Open in editor"
+msgstr "在编辑器中打开"
+
+msgid "Discard changes"
+msgstr "丢弃修改"
+
msgid "Staged Changes"
msgstr "暂存修改"
@@ -6476,9 +10017,24 @@ msgstr "是å¦è¦ç§»é™¤ %s 分支?"
msgid "Do you want to remove the %s remote?"
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 "远程仓库登录"
@@ -6509,6 +10065,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 "暂存所有修改"
@@ -6581,6 +10143,9 @@ msgstr "类型更改"
msgid "Unmerged"
msgstr "未åˆå¹¶"
+msgid "View file diffs before committing them to the latest version"
+msgstr "在æ交到最新版本之å‰æŸ¥çœ‹æ–‡ä»¶å·®å¼‚"
+
msgid "View:"
msgstr "查看:"
@@ -6620,11 +10185,32 @@ 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 "布尔值"
msgid "Sampler"
-msgstr "采样 Sampler"
+msgstr "采样器"
+
+msgid "[default]"
+msgstr "[默认]"
msgid "Add Input Port"
msgstr "添加输入端å£"
@@ -6632,24 +10218,123 @@ 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 Comment Node Title"
+msgstr "设置注释节点标题"
+
+msgid "Set Comment Node Description"
+msgstr "设置注释节点æè¿°"
+
+msgid "Set Parameter Name"
+msgstr "设置å‚æ•°å称"
+
msgid "Set Input Default Port"
msgstr "设置输入默认端å£"
msgid "Add Node to Visual Shader"
msgstr "将节点添加到å¯è§†ç€è‰²å™¨"
+msgid "Add Varying to Visual Shader: %s"
+msgstr "å°† Varying 添加到å¯è§†ç€è‰²å™¨ï¼š%s"
+
+msgid "Remove Varying from Visual Shader: %s"
+msgstr "å°† Varying 从å¯è§†ç€è‰²å™¨ç§»é™¤ï¼š%s"
+
msgid "Node(s) Moved"
msgstr "节点已移动"
+msgid "Convert Constant Node(s) To Parameter(s)"
+msgstr "将常é‡èŠ‚点转æ¢ä¸ºå‚æ•°"
+
+msgid "Convert Parameter Node(s) To Constant(s)"
+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 "å¤åˆ¶ VisualScript 节点"
+
+msgid "Paste VisualShader Node(s)"
+msgstr "粘贴 VisualScript 节点"
+
+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 å称无效。"
+
+msgid "Varying with that name is already exist."
+msgstr "å为“%sâ€çš„ Varying 已存在。"
+
+msgid "Add Node(s) to Visual Shader"
+msgstr "将节点添加到å¯è§†ç€è‰²å™¨"
+
msgid "Vertex"
msgstr "顶点"
@@ -6662,18 +10347,48 @@ msgstr "ç¯å…‰"
msgid "Process"
msgstr "处ç†"
+msgid "Collide"
+msgstr "碰撞"
+
msgid "Sky"
msgstr "天空"
msgid "Fog"
msgstr "雾"
+msgid "Manage Varyings"
+msgstr "ç®¡ç† Varying"
+
+msgid "Add Varying"
+msgstr "添加 Varying"
+
+msgid "Remove Varying"
+msgstr "移除 Varying"
+
+msgid "Show generated shader code."
+msgstr "显示生æˆçš„ç€è‰²å™¨ä»£ç ã€‚"
+
+msgid "Generated Shader Code"
+msgstr "生æˆçš„ç€è‰²å™¨ä»£ç "
+
msgid "Add Node"
msgstr "添加节点"
+msgid "Clear Copy Buffer"
+msgstr "清除å¤åˆ¶ç¼“冲区"
+
+msgid "High-end node"
+msgstr "高端节点"
+
msgid "Create Shader Node"
msgstr "创建ç€è‰²å™¨èŠ‚点"
+msgid "Create Shader Varying"
+msgstr "创建ç€è‰²å™¨ Varying"
+
+msgid "Delete Shader Varying"
+msgstr "删除ç€è‰²å™¨ Varying"
+
msgid "Color function."
msgstr "颜色函数。"
@@ -6722,6 +10437,12 @@ msgstr "柔光è¿ç®—符。"
msgid "Color constant."
msgstr "颜色常é‡ã€‚"
+msgid "Color parameter."
+msgstr "颜色å‚数。"
+
+msgid "(Fragment/Light mode only) Derivative function."
+msgstr "(仅é™ç‰‡æ®µ/ç¯å…‰æ¨¡å¼ï¼‰å¯¼æ•°å‡½æ•°ã€‚"
+
msgid "Returns the boolean result of the %s comparison between two parameters."
msgstr "返回两个å‚数之间 %s 比较的布尔结果。"
@@ -6758,6 +10479,40 @@ msgstr "å°äºŽç­‰äºŽï¼ˆ<=)"
msgid "Not Equal (!=)"
msgstr "ä¸ç­‰äºŽï¼ˆ!=)"
+msgid ""
+"Returns an associated 3D vector if the provided boolean value is true or "
+"false."
+msgstr "如果æ供的布尔值是 true 或 false,则返回关è”çš„ 3D å‘é‡ã€‚"
+
+msgid ""
+"Returns an associated 2D vector if the provided boolean value is true or "
+"false."
+msgstr "如果æ供的布尔值是 true 或 false,则返回关è”çš„ 2D å‘é‡ã€‚"
+
+msgid ""
+"Returns an associated boolean if the provided boolean value is true or false."
+msgstr "如果æ供的布尔值是 true 或 false,则返回关è”的布尔值。"
+
+msgid ""
+"Returns an associated floating-point scalar if the provided boolean value is "
+"true or false."
+msgstr "如果æ供的布尔值是 true 或 false,则返回关è”的浮点数标é‡ã€‚"
+
+msgid ""
+"Returns an associated integer scalar if the provided boolean value is true "
+"or false."
+msgstr "如果æ供的布尔值是 true 或 false,则返回关è”çš„æ•´æ•°æ ‡é‡ã€‚"
+
+msgid ""
+"Returns an associated transform if the provided boolean value is true or "
+"false."
+msgstr "如果æ供的布尔值是 true 或 false,则返回关è”çš„å˜æ¢ã€‚"
+
+msgid ""
+"Returns an associated unsigned integer scalar if the provided boolean value "
+"is true or false."
+msgstr "如果æ供的布尔值是 true 或 false,则返回关è”的无符å·æ•´æ•°æ ‡é‡ã€‚"
+
msgid "Returns the boolean result of the comparison between two parameters."
msgstr "返回两个å‚数之间比较的布尔结果。"
@@ -6769,6 +10524,12 @@ msgstr "返回 INF(或 NaN)和标é‡å‚数之间比较的布尔结果。"
msgid "Boolean constant."
msgstr "布尔常é‡ã€‚"
+msgid "Boolean parameter."
+msgstr "布尔å‚数。"
+
+msgid "Translated to '%s' in Godot Shading Language."
+msgstr "在 Godot ç€è‰²è¯­è¨€ä¸­ç¿»è¯‘为“%sâ€ã€‚"
+
msgid "'%s' input parameter for all shader modes."
msgstr "所有ç€è‰²å™¨æ¨¡å¼çš„ “%s†输入å‚数。"
@@ -6784,12 +10545,55 @@ msgstr "片段和ç¯å…‰ç€è‰²å™¨æ¨¡å¼çš„ “%s†输入å‚数。"
msgid "'%s' input parameter for fragment shader mode."
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†输入å‚数。"
msgid "'%s' input parameter for vertex shader mode."
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 "
+"specific axis. Intended to work with emitters."
+msgstr ""
+"一个节点,用于帮助通过使用特定轴的旋转æ¥ä¹˜ä»¥ä½ç½®è¾“å…¥å‘é‡ã€‚旨在与å‘射器一起使"
+"用。"
+
+msgid "Float function."
+msgstr "浮点函数。"
+
+msgid "Float operator."
+msgstr "浮点è¿ç®—符。"
+
+msgid "Integer function."
+msgstr "整数函数。"
+
+msgid "Integer operator."
+msgstr "æ•´æ•°è¿ç®—符。"
+
+msgid "Unsigned integer function."
+msgstr "无符å·æ•´æ•°å‡½æ•°ã€‚"
+
+msgid "Unsigned integer operator."
+msgstr "无符å·æ•´æ•°è¿ç®—符。"
+
msgid "Returns the absolute value of the parameter."
msgstr "返回å‚æ•°çš„ç»å¯¹å€¼ã€‚"
@@ -6814,6 +10618,13 @@ msgstr "返回å‚æ•°çš„å正切值。"
msgid "Returns the inverse hyperbolic tangent of the parameter."
msgstr "返回å‚æ•°çš„ååŒæ›²æ­£åˆ‡å€¼ã€‚"
+msgid "Returns the result of bitwise NOT (~a) operation on the integer."
+msgstr "返回对整数进行按ä½éžï¼ˆ~a)è¿ç®—的结果。"
+
+msgid ""
+"Returns the result of bitwise NOT (~a) operation on the unsigned integer."
+msgstr "返回对无符å·æ•´æ•°è¿›è¡ŒæŒ‰ä½éžï¼ˆ~a)è¿ç®—的结果。"
+
msgid ""
"Finds the nearest integer that is greater than or equal to the parameter."
msgstr "查找最接近的大于或等于å‚数的整数。"
@@ -6870,6 +10681,9 @@ msgstr "返回两个值中较å°çš„一个。"
msgid "Linear interpolation between two scalars."
msgstr "两个标é‡ä¹‹é—´çš„线性æ’值。"
+msgid "Performs a fused multiply-add operation (a * b + c) on scalars."
+msgstr "对标é‡æ‰§è¡Œèžåˆçš„乘加è¿ç®—(a * b + c)。"
+
msgid "Returns the opposite value of the parameter."
msgstr "返回å‚数的相å值。"
@@ -6942,11 +10756,178 @@ msgstr "返回å‚æ•°çš„åŒæ›²æ­£åˆ‡å€¼ã€‚"
msgid "Finds the truncated value of the parameter."
msgstr "查找å‚数的截断值。"
+msgid "Sums two floating-point scalars."
+msgstr "对两个浮点标é‡æ±‚和。"
+
+msgid "Sums two integer scalars."
+msgstr "对两个整数标é‡æ±‚和。"
+
+msgid "Sums two unsigned integer scalars."
+msgstr "对两个无符å·æ•´æ•°æ ‡é‡æ±‚和。"
+
+msgid "Returns the result of bitwise AND (a & b) operation for two integers."
+msgstr "返回两个整数的按ä½ä¸Žï¼ˆa & b)è¿ç®—的结果。"
+
+msgid ""
+"Returns the result of bitwise AND (a & b) operation for two unsigned "
+"integers."
+msgstr "返回两个无符å·æ•´æ•°çš„按ä½ä¸Žï¼ˆa & b)è¿ç®—的结果。"
+
+msgid ""
+"Returns the result of bitwise left shift (a << b) operation on the integer."
+msgstr "返回整数按ä½å·¦ç§»ï¼ˆa << b)è¿ç®—的结果。"
+
+msgid ""
+"Returns the result of bitwise left shift (a << b) operation on the unsigned "
+"integer."
+msgstr "返回无符å·æ•´æ•°æŒ‰ä½å·¦ç§»ï¼ˆa << b)è¿ç®—的结果。"
+
+msgid "Returns the result of bitwise OR (a | b) operation for two integers."
+msgstr "返回两个整数的按ä½æˆ–(a | b)è¿ç®—的结果。"
+
+msgid ""
+"Returns the result of bitwise OR (a | b) operation for two unsigned integers."
+msgstr "返回两个无符å·æ•´æ•°çš„按ä½æˆ–(a | b)è¿ç®—的结果。"
+
+msgid ""
+"Returns the result of bitwise right shift (a >> b) operation on the integer."
+msgstr "返回整数按ä½å³ç§»ï¼ˆa >> b)è¿ç®—的结果。"
+
+msgid ""
+"Returns the result of bitwise right shift (a >> b) operation on the unsigned "
+"integer."
+msgstr "返回无符å·æ•´æ•°æŒ‰ä½å³ç§»ï¼ˆa >> b)è¿ç®—的结果。"
+
+msgid "Returns the result of bitwise XOR (a ^ b) operation on the integer."
+msgstr "返回对整数进行按ä½å¼‚或(a ^ b)è¿ç®—的结果。"
+
+msgid ""
+"Returns the result of bitwise XOR (a ^ b) operation on the unsigned integer."
+msgstr "返回无符å·æ•´æ•°æŒ‰ä½å¼‚或(a ^ b)è¿ç®—的结果。"
+
+msgid "Divides two floating-point scalars."
+msgstr "将两个浮点标é‡ç›¸é™¤ã€‚"
+
+msgid "Divides two integer scalars."
+msgstr "将两个整数标é‡ç›¸é™¤ã€‚"
+
+msgid "Divides two unsigned integer scalars."
+msgstr "将两个无符å·æ•´æ•°æ ‡é‡ç›¸é™¤ã€‚"
+
+msgid "Multiplies two floating-point scalars."
+msgstr "将两个浮点标é‡ç›¸ä¹˜ã€‚"
+
+msgid "Multiplies two integer scalars."
+msgstr "将两个整数标é‡ç›¸ä¹˜ã€‚"
+
+msgid "Multiplies two unsigned integer scalars."
+msgstr "将两个无符å·æ•´æ•°æ ‡é‡ç›¸ä¹˜ã€‚"
+
+msgid "Returns the remainder of the two floating-point scalars."
+msgstr "返回两个浮点标é‡çš„余数。"
+
+msgid "Returns the remainder of the two integer scalars."
+msgstr "返回两个整数标é‡çš„余数。"
+
+msgid "Returns the remainder of the two unsigned integer scalars."
+msgstr "返回两个无符å·æ•´æ•°æ ‡é‡çš„余数。"
+
+msgid "Subtracts two floating-point scalars."
+msgstr "将两个浮点标é‡ç›¸å‡ã€‚"
+
+msgid "Subtracts two integer scalars."
+msgstr "将两个整数标é‡ç›¸å‡ã€‚"
+
+msgid "Subtracts two unsigned integer scalars."
+msgstr "将两个无符å·æ•´æ•°æ ‡é‡ç›¸å‡ã€‚"
+
+msgid "Scalar floating-point constant."
+msgstr "æ ‡é‡æµ®ç‚¹å¸¸é‡ã€‚"
+
+msgid "Scalar integer constant."
+msgstr "æ ‡é‡æ•´æ•°å¸¸é‡ã€‚"
+
+msgid "Scalar unsigned integer constant."
+msgstr "æ ‡é‡æ— ç¬¦å·æ•´æ•°å¸¸é‡ã€‚"
+
+msgid "Scalar floating-point parameter."
+msgstr "æ ‡é‡æµ®ç‚¹å‚数。"
+
+msgid "Scalar integer parameter."
+msgstr "æ ‡é‡æ•´æ•°å‚数。"
+
+msgid "Scalar unsigned integer parameter."
+msgstr "æ ‡é‡æ— ç¬¦å·æ•´æ•°å‚数。"
+
+msgid "Converts screen UV to a SDF."
+msgstr "å°†å±å¹• UV 转æ¢ä¸º SDF。"
+
+msgid "Casts a ray against the screen SDF and returns the distance travelled."
+msgstr "å‘å±å¹•ä¸Šçš„SDF投射射线,并返回行进的è·ç¦»ã€‚"
+
+msgid "Converts a SDF to screen UV."
+msgstr "将一个 SDF 转æ¢ä¸ºå±å¹• UV。"
+
+msgid "Performs a SDF texture lookup."
+msgstr "执行 SDF 纹ç†æŸ¥æ‰¾ã€‚"
+
+msgid "Performs a SDF normal texture lookup."
+msgstr "执行 SDF 法线纹ç†æŸ¥æ‰¾ã€‚"
+
+msgid "Function to be applied on texture coordinates."
+msgstr "应用于纹ç†å标的函数。"
+
+msgid "Polar coordinates conversion applied on texture coordinates."
+msgstr "应用于纹ç†å标的æžå标转æ¢ã€‚"
+
msgid "Perform the cubic texture lookup."
msgstr "执行立方体纹ç†æŸ¥æ‰¾ã€‚"
+msgid "Perform the curve texture lookup."
+msgstr "执行曲线纹ç†æŸ¥æ‰¾ã€‚"
+
+msgid "Perform the three components curve texture lookup."
+msgstr "执行三分é‡æ›²çº¿çº¹ç†æŸ¥æ‰¾ã€‚"
+
+msgid ""
+"Returns the depth value obtained from the depth prepass in a linear space."
+msgstr "返回在线性空间中从深度预处ç†å¾—到的深度值。"
+
+msgid "Perform the 2D texture lookup."
+msgstr "执行 2D 纹ç†æŸ¥æ‰¾ã€‚"
+
+msgid "Perform the 2D-array texture lookup."
+msgstr "执行 2D 阵列纹ç†æŸ¥æ‰¾ã€‚"
+
+msgid "Perform the 3D texture lookup."
+msgstr "执行 3D 纹ç†æŸ¥æ‰¾ã€‚"
+
+msgid "Apply panning function on texture coordinates."
+msgstr "在纹ç†å标上应用平移函数。"
+
+msgid "Apply scaling function on texture coordinates."
+msgstr "在纹ç†å标上应用缩放函数。"
+
+msgid "Cubic texture parameter lookup."
+msgstr "立方体纹ç†å‚数查找。"
+
+msgid "2D texture parameter lookup."
+msgstr "2D 纹ç†å‚数查找。"
+
+msgid "2D texture parameter lookup with triplanar."
+msgstr "使用三平é¢è¿›è¡Œ 2D 纹ç†å‚数查找。"
+
+msgid "2D array of textures parameter lookup."
+msgstr "2D 阵列纹ç†å‚数查找。"
+
+msgid "3D texture parameter lookup."
+msgstr "3D 纹ç†å‚数查找。"
+
msgid "Transform function."
-msgstr "转æ¢å‡½æ•°ã€‚"
+msgstr "å˜æ¢å‡½æ•°ã€‚"
+
+msgid "Transform operator."
+msgstr "å˜æ¢è¿ç®—。"
msgid ""
"Calculate the outer product of a pair of vectors.\n"
@@ -6972,23 +10953,86 @@ msgstr "å°†å˜æ¢åˆ†è§£ä¸ºå››ä¸ªå‘é‡ã€‚"
msgid "Calculates the determinant of a transform."
msgstr "计算å˜æ¢çš„行列å¼ã€‚"
+msgid ""
+"Calculates how the object should face the camera to be applied on Model View "
+"Matrix output port for 3D objects."
+msgstr "计算物体应如何é¢å¯¹æ‘„影机,以应用于 3D 物体的模型视图矩阵输出端å£ã€‚"
+
msgid "Calculates the inverse of a transform."
-msgstr "计算å˜æ¢çš„倒数。"
+msgstr "计算å˜æ¢çš„逆。"
msgid "Calculates the transpose of a transform."
msgstr "计算å˜æ¢çš„转置。"
+msgid "Sums two transforms."
+msgstr "对两个å˜æ¢æ±‚和。"
+
+msgid "Divides two transforms."
+msgstr "将两个å˜æ¢ç›¸é™¤ã€‚"
+
+msgid "Multiplies two transforms."
+msgstr "将两个å˜æ¢ç›¸ä¹˜ã€‚"
+
+msgid "Performs per-component multiplication of two transforms."
+msgstr "执行两个å˜æ¢çš„分组件的相乘。"
+
+msgid "Subtracts two transforms."
+msgstr "将两个å˜æ¢ç›¸å‡ã€‚"
+
msgid "Multiplies vector by transform."
msgstr "用å˜æ¢ä¹˜ä»¥å‘é‡ã€‚"
msgid "Transform constant."
msgstr "å˜æ¢å¸¸æ•°ã€‚"
+msgid "Transform parameter."
+msgstr "å˜æ¢å‚数。"
+
+msgid ""
+"The distance fade effect fades out each pixel based on its distance to "
+"another object."
+msgstr "è·ç¦»æ·¡åŒ–效果是根æ®æ¯ä¸ªåƒç´ ä¸Žå¦ä¸€ä¸ªç‰©ä½“çš„è·ç¦»æ¥æ·¡åŒ–æ¯ä¸ªåƒç´ çš„。"
+
+msgid ""
+"The proximity fade effect fades out each pixel based on its distance to "
+"another object."
+msgstr "邻近淡化效果是根æ®æ¯ä¸ªåƒç´ ä¸Žå¦ä¸€ä¸ªç‰©ä½“çš„è·ç¦»æ¥æ·¡å‡ºæ¯ä¸ªåƒç´ çš„。"
+
+msgid "Returns a random value between the minimum and maximum input values."
+msgstr "返回一个介于最å°å’Œæœ€å¤§è¾“入值之间的éšæœºå€¼ã€‚"
+
+msgid "Remaps a given input from the input range to the output range."
+msgstr "将一个给定的输入从输入范围é‡æ–°æ˜ å°„到输出范围。"
+
msgid "Vector function."
msgstr "å‘é‡å‡½æ•°ã€‚"
msgid "Vector operator."
-msgstr "å‘é‡è¿ç®—符。"
+msgstr "å‘é‡è¿ç®—。"
+
+msgid "Composes vector from scalars."
+msgstr "由标é‡ç»„æˆå‘é‡ã€‚"
+
+msgid "Decomposes vector to scalars."
+msgstr "å°†å‘é‡åˆ†è§£ä¸ºæ ‡é‡ã€‚"
+
+msgid "Composes 2D vector from two scalars."
+msgstr "从两个标é‡ç»„æˆ 2D å‘é‡ã€‚"
+
+msgid "Decomposes 2D vector to two scalars."
+msgstr "å°† 2D å‘é‡åˆ†è§£ä¸ºä¸¤ä¸ªæ ‡é‡ã€‚"
+
+msgid "Composes 3D vector from three scalars."
+msgstr "从三个标é‡ç»„æˆ 3D å‘é‡ã€‚"
+
+msgid "Decomposes 3D vector to three scalars."
+msgstr "å°† 3D å‘é‡åˆ†è§£ä¸ºä¸‰ä¸ªæ ‡é‡ã€‚"
+
+msgid "Composes 4D vector from four scalars."
+msgstr "从四个标é‡ç»„æˆ 4D å‘é‡ã€‚"
+
+msgid "Decomposes 4D vector to four scalars."
+msgstr "å°† 4D å‘é‡åˆ†è§£ä¸ºå››ä¸ªæ ‡é‡ã€‚"
msgid "Calculates the cross product of two vectors."
msgstr "计算两个å‘é‡çš„å‰ç§¯ã€‚"
@@ -7032,6 +11076,9 @@ msgstr "两个å‘é‡ä¹‹é—´çš„线性æ’值。"
msgid "Linear interpolation between two vectors using scalar."
msgstr "使用标é‡åœ¨ä¸¤ä¸ªå‘é‡ä¹‹é—´è¿›è¡Œçº¿æ€§æ’值。"
+msgid "Performs a fused multiply-add operation (a * b + c) on vectors."
+msgstr "执行å‘é‡çš„乘加èžåˆè¿ç®—(a * b + c)。"
+
msgid "Calculates the normalize product of vector."
msgstr "计算å‘é‡çš„标准化积。"
@@ -7096,6 +11143,73 @@ msgid ""
"'y'."
msgstr "(仅é™ç‰‡æ®µ/光照模å¼ï¼‰ï¼ˆå‘é‡ï¼‰â€œx†和 “y†中的ç»å¯¹å¯¼æ•°ä¹‹å’Œã€‚"
+msgid "Adds 2D vector to 2D vector."
+msgstr "把 2D å‘é‡ä¸Ž 2D å‘é‡ç›¸åŠ ã€‚"
+
+msgid "Adds 3D vector to 3D vector."
+msgstr "把 3D å‘é‡ä¸Ž 3D å‘é‡ç›¸åŠ ã€‚"
+
+msgid "Adds 4D vector to 4D vector."
+msgstr "把 4D å‘é‡ä¸Ž 4D å‘é‡ç›¸åŠ ã€‚"
+
+msgid "Divides 2D vector by 2D vector."
+msgstr "把 2D å‘é‡é™¤ä»¥ 2D å‘é‡ã€‚"
+
+msgid "Divides 3D vector by 3D vector."
+msgstr "把 3D å‘é‡é™¤ä»¥ 3D å‘é‡ã€‚"
+
+msgid "Divides 4D vector by 4D vector."
+msgstr "把 4D å‘é‡é™¤ä»¥ 4D å‘é‡ã€‚"
+
+msgid "Multiplies 2D vector by 2D vector."
+msgstr "把 2D å‘é‡ä¸Ž 2D å‘é‡ç›¸ä¹˜ã€‚"
+
+msgid "Multiplies 3D vector by 3D vector."
+msgstr "把 3D å‘é‡ä¸Ž 3D å‘é‡ç›¸ä¹˜ã€‚"
+
+msgid "Multiplies 4D vector by 4D vector."
+msgstr "把 4D å‘é‡ä¸Ž 4D å‘é‡ç›¸ä¹˜ã€‚"
+
+msgid "Returns the remainder of the two 2D vectors."
+msgstr "返回两个 2D å‘é‡çš„余数。"
+
+msgid "Returns the remainder of the two 3D vectors."
+msgstr "返回两个 3D å‘é‡çš„余数。"
+
+msgid "Returns the remainder of the two 4D vectors."
+msgstr "返回两个 4D å‘é‡çš„余数。"
+
+msgid "Subtracts 2D vector from 2D vector."
+msgstr "从 2D å‘é‡ä¸­å‡åŽ» 2D å‘é‡ã€‚"
+
+msgid "Subtracts 3D vector from 3D vector."
+msgstr "从 3D å‘é‡ä¸­å‡åŽ» 3D å‘é‡ã€‚"
+
+msgid "Subtracts 4D vector from 4D vector."
+msgstr "从 4D å‘é‡ä¸­å‡åŽ» 4D å‘é‡ã€‚"
+
+msgid "2D vector constant."
+msgstr "2D å‘é‡å¸¸é‡ã€‚"
+
+msgid "2D vector parameter."
+msgstr "2D å‘é‡å‚数。"
+
+msgid "3D vector constant."
+msgstr "3D å‘é‡å¸¸é‡ã€‚"
+
+msgid "3D vector parameter."
+msgstr "3D å‘é‡å‚数。"
+
+msgid "4D vector constant."
+msgstr "4D å‘é‡å¸¸é‡ã€‚"
+
+msgid "4D vector parameter."
+msgstr "4D å‘é‡å‚数。"
+
+msgid ""
+"A rectangular area with a description string for better graph organization."
+msgstr "一个带有æ述字符串的矩形区域,以便更好地组织图形。"
+
msgid ""
"Custom Godot Shader Language expression, with custom amount of input and "
"output ports. This is a direct injection of code into the vertex/fragment/"
@@ -7104,12 +11218,45 @@ msgstr ""
"自定义 Godot ç€è‰²å™¨è¯­è¨€è¡¨è¾¾å¼ï¼Œå¯ä»¥æœ‰ä»»æ„æ•°é‡çš„输入和输出端å£ã€‚它会往顶点/片"
"段/ç¯å…‰å‡½æ•°ä¸­ç›´æŽ¥æ³¨å…¥ä»£ç ï¼Œè¯·å‹¿åœ¨å…¶ä¸­å£°æ˜Žå‡½æ•°ã€‚"
+msgid ""
+"Custom Godot Shader Language expression, which is placed on top of the "
+"resulted shader. You can place various function definitions inside and call "
+"it later in the Expressions. You can also declare varyings, parameters and "
+"constants."
+msgstr ""
+"自定义的 Godot ç€è‰²å™¨è¯­è¨€è¡¨è¾¾å¼ï¼Œä¼šè¢«æ”¾åˆ°æœ€ç»ˆçš„ç€è‰²å™¨å¼€å¤´ã€‚您å¯ä»¥åœ¨å…¶ä¸­æ”¾ç½®å„"
+"ç§å‡½æ•°å®šä¹‰ï¼Œç„¶åŽåœ¨è¡¨è¾¾å¼ä¸­è°ƒç”¨ã€‚您还å¯ä»¥å£°æ˜Ž varyingã€å‚数和常é‡ã€‚"
+
+msgid "A reference to an existing parameter."
+msgstr "对现有å‚数的引用。"
+
+msgid "Get varying parameter."
+msgstr "èŽ·å– varying å‚数。"
+
+msgid "Set varying parameter."
+msgstr "设置 varying å‚数。"
+
msgid "Edit Visual Property:"
msgstr "编辑å¯è§†å±žæ€§ï¼š"
msgid "Visual Shader Mode Changed"
msgstr "å¯è§†ç€è‰²å™¨æ¨¡å¼å·²æ›´æ”¹"
+msgid "Voxel GI data is not local to the scene."
+msgstr "体素 GI æ•°æ®ä¸æ˜¯åœºæ™¯çš„局部数æ®ã€‚"
+
+msgid "Voxel GI data is part of an imported resource."
+msgstr "体素 GI æ•°æ®æ˜¯å¯¼å…¥èµ„æºçš„一部分。"
+
+msgid "Voxel GI data is an imported resource."
+msgstr "体素 GI æ•°æ®æ˜¯ä¸€ç§å¯¼å…¥èµ„æºã€‚"
+
+msgid "Bake VoxelGI"
+msgstr "烘焙 VoxelGI"
+
+msgid "Select path for VoxelGI Data File"
+msgstr "选择 VoxelGI æ•°æ®æ–‡ä»¶è·¯å¾„"
+
msgid "The path specified doesn't exist."
msgstr "指定的路径ä¸å­˜åœ¨ã€‚"
@@ -7129,6 +11276,11 @@ msgstr "请选择 “project.godot†或 “.zip†文件。"
msgid "This directory already contains a Godot project."
msgstr "该目录已ç»åŒ…å« Godot 项目。"
+msgid ""
+"The selected path is not empty. Choosing an empty folder is highly "
+"recommended."
+msgstr "所选路径ä¸ä¸ºç©ºã€‚强烈建议选择一个空文件夹。"
+
msgid "New Game Project"
msgstr "新建游æˆé¡¹ç›®"
@@ -7147,6 +11299,48 @@ msgstr "该路径中已存在åŒå文件夹。"
msgid "It would be a good idea to name your project."
msgstr "最好为项目起个å字。"
+msgid "Supports desktop platforms only."
+msgstr "仅支æŒæ¡Œé¢å¹³å°ã€‚"
+
+msgid "Advanced 3D graphics available."
+msgstr "有先进的 3D 图形。"
+
+msgid "Can scale to large complex scenes."
+msgstr "å¯ä»¥æ‰©å±•åˆ°å¤§åž‹å¤æ‚场景。"
+
+msgid "Uses RenderingDevice backend."
+msgstr "使用 RenderingDevice åŽç«¯ã€‚"
+
+msgid "Slower rendering of simple scenes."
+msgstr "简å•åœºæ™¯çš„渲染速度较慢。"
+
+msgid "Supports desktop + mobile platforms."
+msgstr "支æŒæ¡Œé¢ + 移动平å°ã€‚"
+
+msgid "Less advanced 3D graphics."
+msgstr "ä¸å¤ªå…ˆè¿›çš„ 3D 图形。"
+
+msgid "Less scalable for complex scenes."
+msgstr "对å¤æ‚场景的å¯æ‰©å±•æ€§è¾ƒå·®ã€‚"
+
+msgid "Fast rendering of simple scenes."
+msgstr "简å•åœºæ™¯çš„渲染速度较快。"
+
+msgid "Supports desktop, mobile + web platforms."
+msgstr "支æŒæ¡Œé¢ã€ç§»åŠ¨ + 网络平å°ã€‚"
+
+msgid "Least advanced 3D graphics (currently work-in-progress)."
+msgstr "最ä¸å…ˆè¿›çš„ 3D 图形(目å‰æ­£åœ¨è¿›è¡Œçš„工作)。"
+
+msgid "Intended for low-end/older devices."
+msgstr "针对低端/较è€çš„设备。"
+
+msgid "Uses OpenGL 3 backend (OpenGL 3.3/ES 3.0/WebGL2)."
+msgstr "使用 OpenGL 3 åŽç«¯ï¼ˆOpenGL 3.3/ES 3.0/WebGL2)。"
+
+msgid "Fastest rendering of simple scenes."
+msgstr "简å•åœºæ™¯çš„渲染速度最快。"
+
msgid "Invalid project path (changed anything?)."
msgstr "项目路径无效(被外部修改?)。"
@@ -7157,9 +11351,26 @@ msgstr "无法加载ä½äºŽâ€œ%sâ€çš„项目(错误 %d)。项目å¯èƒ½ç¼ºå¤±æ
msgid "Couldn't save project at '%s' (error %d)."
msgstr "无法ä¿å­˜ä½äºŽâ€œ%sâ€çš„项目(错误 %d)。"
+msgid "Warning: This folder is not empty"
+msgstr "警告:该文件夹éžç©º"
+
+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"
+"\n"
+"Are you sure you wish to continue?"
+msgstr ""
+"你将在éžç©ºçš„文件夹中创建 Godot 项目。\n"
+"这个文件夹中的所有内容都将作为项目资æºå¯¼å…¥!\n"
+"\n"
+"你确定è¦ç»§ç»­å—?"
+
msgid "Couldn't create project.godot in project path."
msgstr "无法在项目路径下创建 project.godot 文件。"
+msgid "Couldn't create icon.svg in project path."
+msgstr "无法在项目路径下创建 icon.svg 文件。"
+
msgid "Error opening package file, not in ZIP format."
msgstr "æ‰“å¼€åŒ…æ–‡ä»¶æ—¶å‡ºé”™ï¼Œéž ZIP æ ¼å¼ã€‚"
@@ -7202,6 +11413,12 @@ msgstr "项目安装路径:"
msgid "Renderer:"
msgstr "渲染器:"
+msgid "The renderer can be changed later, but scenes may need to be adjusted."
+msgstr "渲染器å¯ä»¥ç¨åŽæ›´æ”¹ï¼Œä½†å¯èƒ½éœ€è¦è°ƒæ•´åœºæ™¯ã€‚"
+
+msgid "Version Control Metadata:"
+msgstr "版本控制元数æ®ï¼š"
+
msgid "Missing Project"
msgstr "缺失项目"
@@ -7215,12 +11432,150 @@ msgid "Local Projects"
msgstr "本地项目"
msgid "Asset Library Projects"
-msgstr "ç´ æ库项目"
+msgstr "资产库项目"
msgid "Can't open project at '%s'."
msgstr "无法打开ä½äºŽâ€œ%sâ€çš„项目。"
msgid ""
+"You requested to open %d projects in parallel. Do you confirm?\n"
+"Note that usual checks for engine version compatibility will be bypassed."
+msgstr ""
+"你请求åŒæ—¶æ‰“å¼€ %d 个项目。是å¦ç¡®è®¤ï¼Ÿ\n"
+"注æ„,将跳过对引擎版本兼容性的常规检查。"
+
+msgid ""
+"The selected project \"%s\" does not specify its supported Godot version in "
+"its configuration file (\"project.godot\").\n"
+"\n"
+"Project path: %s\n"
+"\n"
+"If you proceed with opening it, it will be converted to Godot's current "
+"configuration file format.\n"
+"\n"
+"Warning: You won't be able to open the project with previous versions of the "
+"engine anymore."
+msgstr ""
+"所选项目“%sâ€æ²¡æœ‰åœ¨é…置文件(“project.godotâ€ï¼‰ä¸­æŒ‡å®šå…¶æ”¯æŒçš„ Godot 版本。\n"
+"\n"
+"项目路径:%s\n"
+"\n"
+"如果继续打开,该项目会转æ¢ä¸º Godot 当å‰çš„é…置文件格å¼ã€‚\n"
+"\n"
+"警告:将无法å†ä½¿ç”¨ä»¥å‰ç‰ˆæœ¬çš„引擎打开该项目。"
+
+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â€æ˜¯ç”± Godot 3.x 生æˆçš„,需è¦è½¬æ¢è‡³ Godot 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 double precision floats, but this version of\n"
+"Godot uses single precision floats. Opening this project may cause data "
+"loss.\n"
+"\n"
+msgstr ""
+"警告:这个项目使用åŒç²¾åº¦æµ®ç‚¹æ•°ï¼Œä½†è¿™ä¸ªç‰ˆæœ¬çš„\n"
+"Godot 使用å•ç²¾åº¦æµ®ç‚¹æ•°ã€‚打开这个项目å¯èƒ½ä¼šå¯¼è‡´æ•°æ®ä¸¢å¤±ã€‚\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 ""
+"警告:该项目使用 C#,但 Godot 的这个版本没有\n"
+"Mono 模å—。如果继续,你将无法使用任何 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 ""
+"警告:这个项目是在 Godot %s 中构建的。\n"
+"打开åŽå°†å‡çº§æˆ–é™çº§è¯¥é¡¹ç›®åˆ° Godot %s。\n"
+"\n"
+
+msgid ""
+"Warning: This project uses the following features not supported by this "
+"build of Godot:\n"
+"\n"
+"%s\n"
+"\n"
+msgstr ""
+"警告:这个项目使用了如下该 Godot 构建ä¸æ”¯æŒçš„功能:\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."
@@ -7232,7 +11587,7 @@ msgid ""
"Can't run project: Assets need to be imported.\n"
"Please edit the project to trigger the initial import."
msgstr ""
-"无法è¿è¡Œé¡¹ç›®ï¼š 需è¦å¯¼å…¥ç´ æ。\n"
+"无法è¿è¡Œé¡¹ç›®ï¼š 需è¦å¯¼å…¥èµ„产。\n"
"请编辑项目æ¥è§¦å‘首次导入。"
msgid "Are you sure to run %d projects at once?"
@@ -7269,6 +11624,9 @@ 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 "
@@ -7280,6 +11638,9 @@ msgstr ""
msgid "Loading, please wait..."
msgstr "正在加载,请ç¨å€™â€¦â€¦"
+msgid "Last Edited"
+msgstr "最近编辑"
+
msgid "New Project"
msgstr "新建项目"
@@ -7316,6 +11677,26 @@ msgstr "移除全部"
msgid "Also delete project contents (no undo!)"
msgstr "åŒæ—¶åˆ é™¤é¡¹ç›®å†…容(无法撤销ï¼ï¼‰"
+msgid ""
+"This option will perform full project conversion, updating scenes, resources "
+"and scripts from Godot 3.x to work in Godot 4.0.\n"
+"\n"
+"Note that this is a best-effort conversion, i.e. it makes upgrading the "
+"project easier, but it will not open out-of-the-box and will still require "
+"manual adjustments.\n"
+"\n"
+"IMPORTANT: Make sure to backup your project before converting, as this "
+"operation makes it impossible to open it in older versions of Godot."
+msgstr ""
+"该选项将执行完整的项目转æ¢ï¼Œæ›´æ–° Godot 3.x 的场景ã€èµ„æºå’Œè„šæœ¬ï¼Œä»¥ä¾¿åœ¨ Godot "
+"4.0 中è¿è¡Œã€‚\n"
+"\n"
+"注æ„,转æ¢æ˜¯å°½åŠ›è€Œä¸ºçš„,也就是说,它å¯ä»¥è®©é¡¹ç›®çš„å‡çº§æ›´å®¹æ˜“,但无法åšåˆ°å¼€ç®±å³"
+"用,ä»ç„¶éœ€è¦æ‰‹åŠ¨è°ƒæ•´ã€‚\n"
+"\n"
+"é‡è¦ï¼šè½¬æ¢å‰è¯·ä¸€å®šè¦å¤‡ä»½ä½ çš„项目,因为这个æ“作会使它无法在旧版本的 Godot 中打"
+"开。"
+
msgid "Can't run project"
msgstr "无法è¿è¡Œé¡¹ç›®"
@@ -7324,35 +11705,56 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
"ç›®å‰æ²¡æœ‰ä»»ä½•é¡¹ç›®ã€‚\n"
-"是å¦æŸ¥çœ‹ç´ æ库中的官方示例项目?"
+"是å¦æŸ¥çœ‹èµ„产库中的官方示例项目?"
+
+msgid "Add Project Setting"
+msgstr "添加项目设置"
msgid "Delete Item"
msgstr "删除æ¡ç›®"
+msgid "(All)"
+msgstr "(全部)"
+
msgid "Add Input Action"
msgstr "添加输入动作"
msgid "Change Action deadzone"
msgstr "修改动作死区"
-msgid "Add Input Action Event"
-msgstr "添加输入动作事件"
-
msgid "Erase Input Action"
msgstr "擦除输入动作"
msgid "Rename Input Action Event"
-msgstr "é‡å‘½å输入事件"
+msgstr "é‡å‘½å输入动作事件"
+
+msgid "Update Input Action Order"
+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 "é”®ä½æ˜ å°„"
+msgstr "输入映射"
msgid "Localization"
msgstr "本地化"
+msgid "Autoload"
+msgstr "自动加载"
+
+msgid "Shader Globals"
+msgstr "ç€è‰²å™¨å…¨å±€é‡"
+
msgid "Plugins"
msgstr "æ’件"
@@ -7365,9 +11767,6 @@ msgstr "选择属性"
msgid "Select Virtual Method"
msgstr "选择虚方法"
-msgid "Select Method"
-msgstr "选择方法"
-
msgid "Batch Rename"
msgstr "批é‡é‡å‘½å"
@@ -7386,6 +11785,21 @@ msgstr "高级选项"
msgid "Substitute"
msgstr "替æ¢"
+msgid "Node name."
+msgstr "节点å称。"
+
+msgid "Node's parent name, if available."
+msgstr "父节点的å称,如果有的è¯ã€‚"
+
+msgid "Node type."
+msgstr "节点类型。"
+
+msgid "Current scene name."
+msgstr "当å‰åœºæ™¯å称。"
+
+msgid "Root node name."
+msgstr "根节点å称。"
+
msgid ""
"Sequential integer counter.\n"
"Compare counter options."
@@ -7399,9 +11813,15 @@ msgstr "å„级å•ç‹¬è®¡æ•°"
msgid "If set, the counter restarts for each group of child nodes."
msgstr "如果å¯ç”¨ï¼Œè®¡æ•°å™¨å°†ä¸ºæ¯ç»„å­èŠ‚点é‡ç½®ã€‚"
+msgid "Initial value for the counter."
+msgstr "计数器的åˆå§‹å€¼ã€‚"
+
msgid "Step"
msgstr "步长"
+msgid "Amount by which counter is incremented for each node."
+msgstr "æ¯ä¸ªèŠ‚点的计数器的递增é‡ã€‚"
+
msgid "Padding"
msgstr "å¡«å……"
@@ -7445,12 +11865,39 @@ msgstr "ä½äºŽå­—符 %s"
msgid "Reparent Node"
msgstr "é‡è®¾çˆ¶èŠ‚点"
+msgid "Select new parent:"
+msgstr "选择新父级:"
+
msgid "Keep Global Transform"
msgstr "ä¿æŒå…¨å±€å˜æ¢"
msgid "Reparent"
msgstr "é‡è®¾çˆ¶èŠ‚点"
+msgid "Pick Root Node Type"
+msgstr "选å–根节点类型"
+
+msgid "Pick"
+msgstr "选å–"
+
+msgid "Scene name is valid."
+msgstr "场景å称有效。"
+
+msgid "Scene name is empty."
+msgstr "场景å称为空。"
+
+msgid "File name invalid."
+msgstr "文件å无效。"
+
+msgid "File already exists."
+msgstr "文件已ç»å­˜åœ¨ã€‚"
+
+msgid "Invalid root node name."
+msgstr "根节点å称无效。"
+
+msgid "Root Type:"
+msgstr "根类型:"
+
msgid "2D Scene"
msgstr "2D 场景"
@@ -7460,12 +11907,41 @@ msgstr "3D 场景"
msgid "User Interface"
msgstr "用户界é¢"
+msgid "Scene Name:"
+msgstr "场景å称:"
+
+msgid "Root Name:"
+msgstr "æ ¹å称:"
+
+msgid "Leave empty to use scene name"
+msgstr "留空以使用场景å称"
+
+msgid "Create New Scene"
+msgstr "新建场景"
+
+msgid "No parent to instantiate a child at."
+msgstr "没有父节点å¯ç”¨äºŽå®žä¾‹åŒ–一个å­åœºæ™¯ã€‚"
+
+msgid "No parent to instantiate the scenes at."
+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 "Instantiate Scene(s)"
+msgstr "实例化场景"
+
msgid "Replace with Branch Scene"
msgstr "替æ¢ä¸ºåˆ†æ”¯åœºæ™¯"
+msgid "Instantiate Child Scene"
+msgstr "实例化å­åœºæ™¯"
+
msgid "Detach Script"
msgstr "分离脚本"
@@ -7518,6 +11994,25 @@ msgid ""
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 the branch of an already instantiated scene.\n"
+"To create a variation of a scene, you can make an inherited scene based on "
+"the instantiated scene using Scene > New Inherited Scene... instead."
+msgstr ""
+"无法ä¿å­˜å·²å®žä¾‹åŒ–的场景的分支。\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\"."
@@ -7568,18 +12063,30 @@ msgstr "新建场景根"
msgid "Create Root Node:"
msgstr "创建根节点:"
+msgid "Switch to Favorite Nodes"
+msgstr "切æ¢åˆ°æ”¶è—节点"
+
msgid "Other Node"
msgstr "其他节点"
+msgid "Paste From Clipboard"
+msgstr "从剪贴æ¿ç²˜è´´"
+
msgid "Can't operate on nodes from a foreign scene!"
msgstr "无法æ“作外部场景的节点ï¼"
msgid "Can't operate on nodes the current scene inherits from!"
msgstr "无法æ“作此节点,因为当å‰åœºæ™¯ç»§æ‰¿è‡ªè¯¥èŠ‚点ï¼"
+msgid "This operation can't be done on instantiated scenes."
+msgstr "æ­¤æ“作ä¸èƒ½åº”用于实例化的场景。"
+
msgid "Attach Script"
msgstr "添加脚本"
+msgid "Set Shader"
+msgstr "设置ç€è‰²å™¨"
+
msgid "Cut Node(s)"
msgstr "剪切节点"
@@ -7603,9 +12110,18 @@ msgstr "ä¿å­˜åœºæ™¯å‡ºé”™ã€‚"
msgid "Error duplicating scene to save it."
msgstr "å¤åˆ¶åœºæ™¯å‡ºé”™ã€‚"
+msgid "Instantiate Script"
+msgstr "实例化脚本"
+
msgid "Sub-Resources"
msgstr "å­èµ„æº"
+msgid "Revoke Unique Name"
+msgstr "撤销唯一å称"
+
+msgid "Access as Unique Name"
+msgstr "作为唯一å称访问"
+
msgid "Clear Inheritance"
msgstr "清除继承"
@@ -7615,9 +12131,28 @@ msgstr "å­èŠ‚点å¯ç¼–辑"
msgid "Load As Placeholder"
msgstr "加载为å ä½ç¬¦"
+msgid "Auto Expand to Selected"
+msgstr "自动展开至选定项"
+
msgid "Filters"
msgstr "过滤"
+msgid "Filter by Type"
+msgstr "按类型过滤"
+
+msgid "Filter by Group"
+msgstr "按组过滤"
+
+msgid "Selects all Nodes of the given type."
+msgstr "选择给定类型的所有节点。"
+
+msgid ""
+"Selects all Nodes belonging to the given group.\n"
+"If empty, selects any Node belonging to any group."
+msgstr ""
+"选择属于给定组的所有节点。\n"
+"如果为空,则选择属于任何组的任何节点。"
+
msgid ""
"Cannot attach a script: there are no languages registered.\n"
"This is probably because this editor was built with all language modules "
@@ -7635,8 +12170,11 @@ msgstr "粘贴节点"
msgid "Add Child Node"
msgstr "添加å­èŠ‚点"
+msgid "Expand/Collapse Branch"
+msgstr "展开/折å åˆ†æ”¯"
+
msgid "Change Type"
-msgstr "修改类型"
+msgstr "更改类型"
msgid "Reparent to New Node"
msgstr "é‡è®¾çˆ¶èŠ‚点为新节点"
@@ -7644,18 +12182,29 @@ msgstr "é‡è®¾çˆ¶èŠ‚点为新节点"
msgid "Make Scene Root"
msgstr "设为场景根节点"
+msgid "Toggle Access as Unique Name"
+msgstr "切æ¢ä½œä¸ºå”¯ä¸€å称访问"
+
msgid "Delete (No Confirm)"
msgstr "删除(无确认)"
msgid "Add/Create a New Node."
msgstr "添加/创建新节点。"
+msgid ""
+"Instantiate a scene file as a Node. Creates an inherited scene if no root "
+"node exists."
+msgstr "将场景文件实例化为节点。如果没有根节点则创建继承场景。"
+
msgid "Attach a new or existing script to the selected node."
msgstr "为选中节点创建或设置脚本。"
msgid "Detach the script from the selected node."
msgstr "从选中节点分离脚本。"
+msgid "Extra scene options."
+msgstr "更多场景选项。"
+
msgid "Remote"
msgstr "远程"
@@ -7696,6 +12245,23 @@ msgstr ""
"这个节点å¯ä»¥åœ¨åœºæ™¯ä¸­çš„ä»»æ„ä½ç½®é€šè¿‡åœ¨èŠ‚点路径中为其加上“%sâ€å‰ç¼€æ¥è®¿é—®ã€‚\n"
"点击ç¦ç”¨ã€‚"
+msgid "Node has one connection."
+msgid_plural "Node has {num} connections."
+msgstr[0] "节点有 {num} 个连接。"
+
+msgid "Node is in this group:"
+msgid_plural "Node is in the following groups:"
+msgstr[0] "节点属于分组:"
+
+msgid "Click to show signals dock."
+msgstr "点击显示信å·é¢æ¿ã€‚"
+
+msgid "This script is currently running in the editor."
+msgstr "这个脚本正在编辑器中è¿è¡Œã€‚"
+
+msgid "This script is a custom type."
+msgstr "这个脚本是自定义类型。"
+
msgid "Open Script:"
msgstr "打开脚本:"
@@ -7707,12 +12273,22 @@ msgstr ""
"点击å¯è§£é”。"
msgid ""
+"Children are not selectable.\n"
+"Click to make them selectable."
+msgstr ""
+"å­èŠ‚点无法选择。\n"
+"å•å‡»ä½¿å…¶å¯é€‰ã€‚"
+
+msgid ""
"AnimationPlayer is pinned.\n"
"Click to unpin."
msgstr ""
"动画播放器被固定。\n"
"点击å–消固定。"
+msgid "\"%s\" is not a known filter."
+msgstr "“%sâ€ä¸æ˜¯å·²çŸ¥ç­›é€‰å™¨ã€‚"
+
msgid "Invalid node name, the following characters are not allowed:"
msgstr "节点å称无效,ä¸å…许包å«ä»¥ä¸‹å­—符:"
@@ -7737,9 +12313,15 @@ msgstr "路径为空。"
msgid "Filename is empty."
msgstr "文件å为空。"
+msgid "Filename is invalid."
+msgstr "文件å无效。"
+
msgid "Path is not local."
msgstr "路径ä¸æ˜¯æœ¬åœ°çš„。"
+msgid "Base path is invalid."
+msgstr "基本路径无效。"
+
msgid "A directory with the same name exists."
msgstr "存在åŒå目录。"
@@ -7749,6 +12331,9 @@ msgstr "文件ä¸å­˜åœ¨ã€‚"
msgid "Invalid extension."
msgstr "扩展å无效。"
+msgid "Extension doesn't match chosen language."
+msgstr "扩展å与所选语言ä¸åŒ¹é…。"
+
msgid "Template:"
msgstr "模æ¿ï¼š"
@@ -7764,6 +12349,12 @@ msgstr "打开脚本/选择ä½ç½®"
msgid "Open Script"
msgstr "打开脚本"
+msgid "Inherit %s"
+msgstr "继承 %s"
+
+msgid "Inherit"
+msgstr "继承"
+
msgid "File exists, it will be reused."
msgstr "文件存在,将被é‡ç”¨ã€‚"
@@ -7791,12 +12382,21 @@ msgstr "内置脚本(到场景文件中)。"
msgid "Will create a new script file."
msgstr "将创建新脚本文件。"
+msgid "Using existing script file."
+msgstr "使用现有脚本文件。"
+
msgid "Will load an existing script file."
msgstr "将加载现有的脚本文件。"
msgid "Script file already exists."
msgstr "脚本文件已存在。"
+msgid "No suitable template."
+msgstr "没有åˆé€‚的模æ¿ã€‚"
+
+msgid "Empty"
+msgstr "空"
+
msgid ""
"Note: Built-in scripts have some limitations and can't be edited using an "
"external editor."
@@ -7816,12 +12416,66 @@ msgstr "内置脚本:"
msgid "Attach Node Script"
msgstr "设置节点的脚本"
+msgid "Error - Could not create shader include in filesystem."
+msgstr "错误 - 无法在文件系统中创建ç€è‰²å™¨å¤´æ–‡ä»¶ã€‚"
+
+msgid "Error - Could not create shader in filesystem."
+msgstr "错误 - 无法在文件系统中创建ç€è‰²å™¨ã€‚"
+
+msgid "Error loading shader from %s"
+msgstr "从 %s 加载ç€è‰²å™¨æ—¶å‡ºé”™"
+
+msgid "Open Shader / Choose Location"
+msgstr "打开ç€è‰²å™¨ / 选择ä½ç½®"
+
msgid "Invalid base path."
msgstr "无效的基本路径。"
msgid "Wrong extension chosen."
msgstr "选择了错误的扩展å。"
+msgid "Shader path/name is valid."
+msgstr "ç€è‰²å™¨è·¯å¾„/å称有效。"
+
+msgid "Built-in shader (into scene file)."
+msgstr "内置ç€è‰²å™¨ï¼ˆåˆ°åœºæ™¯æ–‡ä»¶ä¸­ï¼‰ã€‚"
+
+msgid "Will create a new shader file."
+msgstr "将新建ç€è‰²å™¨æ–‡ä»¶ã€‚"
+
+msgid "Will load an existing shader file."
+msgstr "将加载现有的ç€è‰²å™¨æ–‡ä»¶ã€‚"
+
+msgid "Shader file already exists."
+msgstr "ç€è‰²å™¨æ–‡ä»¶å·²å­˜åœ¨ã€‚"
+
+msgid "Note: Built-in shaders can't be edited using an external editor."
+msgstr "注æ„:内置ç€è‰²å™¨ä¸èƒ½ä½¿ç”¨å¤–部编辑器编辑。"
+
+msgid "Mode:"
+msgstr "模å¼ï¼š"
+
+msgid "Built-in Shader:"
+msgstr "内置ç€è‰²å™¨ï¼š"
+
+msgid "Create Shader"
+msgstr "创建ç€è‰²å™¨"
+
+msgid "Set Shader Global Variable"
+msgstr "设置ç€è‰²å™¨å…¨å±€å˜é‡"
+
+msgid "Please specify a valid shader uniform identifier name."
+msgstr "请指定有效的ç€è‰²å™¨ Uniform 标识符å称。"
+
+msgid "Global shader parameter '%s' already exists'"
+msgstr "全局ç€è‰²å™¨å‚数“%sâ€å·²å­˜åœ¨"
+
+msgid "Name '%s' is a reserved shader language keyword."
+msgstr "å称“%sâ€æ˜¯ä¸ºç€è‰²å™¨è¯­è¨€ä¿ç•™çš„关键字。"
+
+msgid "Add Shader Global Parameter"
+msgstr "添加ç€è‰²å™¨å…¨å±€å‚æ•°"
+
msgid "Change Cylinder Radius"
msgstr "修改圆柱体åŠå¾„"
@@ -7861,6 +12515,60 @@ msgstr "实例字典格å¼ä¸æ­£ç¡®ï¼ˆ@path 的脚本无效)"
msgid "Invalid instance dictionary (invalid subclasses)"
msgstr "实例字典无效(派生类无效)"
+msgid "Value of type '%s' can't provide a length."
+msgstr "类型为“%sâ€çš„值无法æ供长度。"
+
+msgid "Export Scene to glTF 2.0 File"
+msgstr "将场景导出为 glTF 2.0 文件"
+
+msgid "glTF 2.0 Scene..."
+msgstr "glTF 2.0 场景..."
+
+msgid "Path does not contain a Blender installation."
+msgstr "è·¯å¾„æœªåŒ…å« Blender 安装。"
+
+msgid "Can't execute Blender binary."
+msgstr "无法执行 Blender å¯æ‰§è¡Œæ–‡ä»¶ã€‚"
+
+msgid "Unexpected --version output from Blender binary at: %s"
+msgstr "从 Blender å¯æ‰§è¡Œæ–‡ä»¶èŽ·å¾—了æ„外的 --version 输出:%s"
+
+msgid "Path supplied lacks a Blender binary."
+msgstr "æ供的路径缺少 Blender å¯æ‰§è¡Œæ–‡ä»¶ã€‚"
+
+msgid "This Blender installation is too old for this importer (not 3.0+)."
+msgstr "安装的 Blender 对这个导入器æ¥è¯´å¤ªæ—§äº†ï¼ˆä¸æ˜¯ 3.0+)。"
+
+msgid "This Blender installation is too new for this importer (not 3.x)."
+msgstr "安装的 Blender 对这个导入器æ¥è¯´å¤ªæ–°äº†ï¼ˆä¸æ˜¯ 3.x)。"
+
+msgid "Path to Blender installation is valid (Autodetected)."
+msgstr "Blender 安装路径有效(自动检测)。"
+
+msgid "Path to Blender installation is valid."
+msgstr "Blender 安装路径有效。"
+
+msgid "Configure Blender Importer"
+msgstr "é…ç½® Blender 导入器"
+
+msgid ""
+"Blender 3.0+ is required to import '.blend' files.\n"
+"Please provide a valid path to a Blender installation:"
+msgstr ""
+"è¦å¯¼å…¥â€œ.blendâ€æ–‡ä»¶ï¼Œéœ€è¦ Blender 3.0 以上版本。\n"
+"请æ供一个有效的 Blender 安装路径:"
+
+msgid "Disable '.blend' Import"
+msgstr "ç¦ç”¨â€œ.blendâ€å¯¼å…¥"
+
+msgid ""
+"Disables Blender '.blend' files import for this project. Can be re-enabled "
+"in Project Settings."
+msgstr "ç¦ç”¨æ­¤é¡¹ç›®çš„ Blender“.blendâ€æ–‡ä»¶å¯¼å…¥ã€‚å¯ä»¥åœ¨é¡¹ç›®è®¾ç½®ä¸­é‡æ–°å¯ç”¨ã€‚"
+
+msgid "Disabling '.blend' file import requires restarting the editor."
+msgstr "ç¦ç”¨â€œ.blendâ€æ–‡ä»¶å¯¼å…¥éœ€è¦é‡å¯ç¼–辑器。"
+
msgid "Next Plane"
msgstr "下一平é¢"
@@ -7895,7 +12603,7 @@ msgid "GridMap Selection"
msgstr "GridMap 选择"
msgid "Grid Map"
-msgstr "网格地图"
+msgstr "栅格地图"
msgid "Edit X Axis"
msgstr "编辑 X 轴"
@@ -7945,12 +12653,54 @@ msgstr "GridMap 设置"
msgid "Pick Distance:"
msgstr "拾å–è·ç¦»ï¼š"
+msgid "Filter Meshes"
+msgstr "筛选网格"
+
msgid "Give a MeshLibrary resource to this GridMap to use its meshes."
msgstr "å‘æ­¤ GridMap æä¾› MeshLibrary 资æºä»¥ä½¿ç”¨å…¶ç½‘格。"
+msgid "Determining optimal atlas size"
+msgstr "é‡åœ¨ç¡®å®šæœ€ä½³å›¾é›†å°ºå¯¸"
+
+msgid "Blitting albedo and emission"
+msgstr "正在å¤åˆ¶å照率和å‘å…‰"
+
+msgid "Plotting mesh into acceleration structure %d/%d"
+msgstr "正在加速结构中构造网格 %d/%d"
+
+msgid "Optimizing acceleration structure"
+msgstr "正在优化加速结构"
+
msgid "Begin Bake"
msgstr "开始烘焙"
+msgid "Preparing shaders"
+msgstr "正在准备ç€è‰²å™¨"
+
+msgid "Un-occluding geometry"
+msgstr "正在剥离é®æŒ¡å‡ ä½•ä½“"
+
+msgid "Plot direct lighting"
+msgstr "构建直接光照"
+
+msgid "Integrate indirect lighting"
+msgstr "集æˆé—´æŽ¥å…‰ç…§"
+
+msgid "Bounce %d/%d: Integrate indirect lighting %d%%"
+msgstr "åå¼¹ %d/%d:集æˆé—´æŽ¥ç…§æ˜Ž %d%%"
+
+msgid "Baking lightprobes"
+msgstr "正在烘焙光照探针"
+
+msgid "Integrating light probes %d%%"
+msgstr "正在集æˆå…‰ç…§æŽ¢é’ˆ %d%%"
+
+msgid "Denoising"
+msgstr "正在é™å™ª"
+
+msgid "Retrieving textures"
+msgstr "正在获å–纹ç†"
+
msgid "Class name can't be a reserved keyword"
msgstr "ç±»åä¸èƒ½æ˜¯ä¿ç•™å…³é”®å­—"
@@ -7960,6 +12710,9 @@ msgstr "构建解决方案"
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr "解ç å­—节数ä¸å¤Ÿï¼Œæˆ–æ ¼å¼æ— æ•ˆã€‚"
+msgid "%d (%s)"
+msgstr "%d(%s)"
+
msgid "%s/s"
msgstr "%s/秒"
@@ -7969,6 +12722,9 @@ msgstr "ä¼ å…¥ RPC"
msgid "Outgoing RPC"
msgstr "传出 RPC"
+msgid "Synchronizer"
+msgstr "åŒæ­¥å™¨"
+
msgid "Config"
msgstr "é…ç½®"
@@ -7981,9 +12737,90 @@ msgstr "大å°"
msgid "Network Profiler"
msgstr "网络分æžå™¨"
+msgid "Replication"
+msgstr "å¤åˆ¶"
+
+msgid "Select a replicator node in order to pick a property to add to it."
+msgstr "请选择一个å¤åˆ¶å™¨èŠ‚点,以便选å–属性进行添加。"
+
+msgid "Not possible to add a new property to synchronize without a root."
+msgstr "ä¸å¯èƒ½åœ¨æ²¡æœ‰æ ¹çš„情况下添加一个新的属性æ¥è¿›è¡ŒåŒæ­¥ã€‚"
+
+msgid "Property is already being synchronized."
+msgstr "属性已被åŒæ­¥ã€‚"
+
+msgid "Add property to synchronizer"
+msgstr "将属性添加至åŒæ­¥å™¨"
+
+msgid "Pick a node to synchronize:"
+msgstr "选择一个节点进行åŒæ­¥ï¼š"
+
+msgid "Add property to sync..."
+msgstr "添加åŒæ­¥å±žæ€§..."
+
+msgid "Add from path"
+msgstr "从路径添加"
+
+msgid "Spawn"
+msgstr "出生"
+
+msgid ""
+"Add properties using the buttons above or\n"
+"drag them them from the inspector and drop them here."
+msgstr ""
+"请使用上é¢çš„按钮添加属性或\n"
+"将属性从检查器中拖放到这里。"
+
+msgid "Please select a MultiplayerSynchronizer first."
+msgstr "请先选择一个 MultiplayerSynchronizer。"
+
+msgid "The MultiplayerSynchronizer needs a root path."
+msgstr "该 MultiplayerSynchronizer 需è¦æ ¹è·¯å¾„。"
+
+msgid "Set spawn property"
+msgstr "设置出生属性"
+
+msgid "Set sync property"
+msgstr "设置åŒæ­¥å±žæ€§"
+
+msgid "Delete Property?"
+msgstr "删除属性?"
+
+msgid "Remove 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 valid NodePath must be set in the \"Root Path\" property in order for "
+"MultiplayerSynchronizer to be able to synchronize properties."
+msgstr ""
+"è¦è®© MultiplayerSynchronizer 能够åŒæ­¥å±žæ€§ï¼Œå¿…须在“Root Pathâ€å±žæ€§ä¸­è®¾ç½®æœ‰æ•ˆçš„ "
+"NodePath。"
+
msgid "A NavigationMesh resource must be set or created for this node to work."
msgstr "此节点需è¦è®¾ç½® NavigationMesh 资æºæ‰èƒ½æ­£å¸¸å·¥ä½œã€‚"
+msgid ""
+"Cannot generate navigation mesh because it does not belong to the edited "
+"scene. Make it unique first."
+msgstr "无法生æˆå¯¼èˆªç½‘格,因为它ä¸å±žäºŽå·²ç¼–辑的场景。请先将其唯一化。"
+
+msgid ""
+"Cannot generate navigation mesh because it belongs to a resource which was "
+"imported."
+msgstr "无法生æˆå¯¼èˆªç½‘格,因为它属于一个导入的资æºã€‚"
+
+msgid ""
+"Cannot generate navigation mesh because the resource was imported from "
+"another type."
+msgstr "无法生æˆå¯¼èˆªç½‘格,因为该资æºæ˜¯ä»Žå…¶ä»–类型导入的。"
+
msgid "Bake NavMesh"
msgstr "烘焙导航网格"
@@ -7994,7 +12831,7 @@ msgid "Setting up Configuration..."
msgstr "正在设置é…ç½®..."
msgid "Calculating grid size..."
-msgstr "正在计算网格大å°..."
+msgstr "正在计算栅格大å°..."
msgid "Creating heightfield..."
msgstr "正在创建高度图..."
@@ -8029,9 +12866,105 @@ msgstr "解æžå¤šè¾¹å½¢ä¸­..."
msgid "Done!"
msgstr "完æˆï¼"
+msgid "Toggles whether the noise preview is computed in 3D space."
+msgstr "切æ¢æ˜¯å¦åœ¨ 3D 空间中计算噪声预览。"
+
+msgid "Rename Action"
+msgstr "é‡å‘½å动作"
+
+msgid "Rename Actions Localized name"
+msgstr "é‡å‘½å动作本地化å称"
+
+msgid "Change Action Type"
+msgstr "修改动作类型"
+
+msgid "Remove action"
+msgstr "移除动作"
+
+msgid "Add action set"
+msgstr "添加动作集"
+
+msgid "Remove action set"
+msgstr "移除动作集"
+
+msgid "Add interaction profile"
+msgstr "添加交互é…置文件"
+
+msgid "Error saving file %s: %s"
+msgstr "ä¿å­˜æ–‡ä»¶ %s 时出错:%s"
+
+msgid "Error loading %s: %s."
+msgstr "加载 %s 时出错:%s。"
+
+msgid "OpenXR Action map:"
+msgstr "OpenXR 动作映射:"
+
+msgid "Remove interaction profile"
+msgstr "移除交互é…置文件"
+
+msgid "Action Map"
+msgstr "动作映射"
+
+msgid "Add Action Set"
+msgstr "添加动作集"
+
+msgid "Add an action set."
+msgstr "添加一个动作集。"
+
+msgid "Add profile"
+msgstr "添加é…置文件"
+
+msgid "Add an interaction profile."
+msgstr "添加一个交互é…置文件。"
+
+msgid "Save this OpenXR action map."
+msgstr "ä¿å­˜è¿™ä¸ª OpenXR 动作映射。"
+
+msgid "Reset to default OpenXR action map."
+msgstr "é‡ç½®ä¸ºé»˜è®¤çš„ OpenXR 动作映射。"
+
+msgid "Action Sets"
+msgstr "动作集"
+
+msgid "Rename Action Set"
+msgstr "é‡å‘½å动作集"
+
+msgid "Rename Action Sets Localized name"
+msgstr "é‡å‘½å动作集本地化å称"
+
+msgid "Change Action Sets priority"
+msgstr "更改动作集优先级"
+
+msgid "Add action"
+msgstr "添加动作"
+
+msgid "Delete action"
+msgstr "删除动作"
+
+msgid "OpenXR Action Map"
+msgstr "OpenXR 动作映射"
+
+msgid "Remove action from interaction profile"
+msgstr "从交互é…置中移除动作"
+
+msgid "Add binding"
+msgstr "添加绑定"
+
+msgid "Remove binding"
+msgstr "移除绑定"
+
msgid "Pose"
msgstr "姿势"
+msgid "Haptic"
+msgstr "触摸"
+
+msgid "Unknown"
+msgstr "未知"
+
+msgid "Select an action"
+msgstr "选择一个动作"
+
msgid "Package name is missing."
msgstr "包å缺失。"
@@ -8050,6 +12983,11 @@ msgstr "包段中的第一个字符ä¸èƒ½æ˜¯ “%sâ€ã€‚"
msgid "The package must have at least one '.' separator."
msgstr "包必须至少有一个 “.†分隔符。"
+msgid ""
+"The project name does not meet the requirement for the package name format. "
+"Please explicitly specify the package name."
+msgstr "项目å称ä¸ç¬¦åˆåŒ…åæ ¼å¼çš„è¦æ±‚。请显å¼æŒ‡å®šåŒ…å。"
+
msgid "Select device from the list"
msgstr "从列表中选择设备"
@@ -8122,19 +13060,12 @@ msgstr "APK 扩展的公钥无效。"
msgid "Invalid package name:"
msgstr "无效的包å称:"
-msgid "\"Use Custom Build\" must be enabled to use the plugins."
-msgstr "å¿…é¡»å¯ç”¨ “使用自定义构建†æ‰èƒ½ä½¿ç”¨æ’件。"
+msgid "\"Hand Tracking\" is only valid when \"XR Mode\" is \"OpenXR\"."
+msgstr "“手部跟踪â€åªæœ‰åœ¨å½““XR Modeâ€æ˜¯â€œOpenXRâ€æ—¶æ‰æœ‰æ•ˆã€‚"
msgid "\"Passthrough\" is only valid when \"XR Mode\" is \"OpenXR\"."
msgstr "“穿é€â€åªæœ‰åœ¨å½““XR Modeâ€æ˜¯â€œOpenXRâ€æ—¶æ‰æœ‰æ•ˆã€‚"
-msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled."
-msgstr "“Export AABâ€åªæœ‰åœ¨å½“å¯ç”¨â€œä½¿ç”¨è‡ªå®šä¹‰æž„建â€æ—¶æ‰æœ‰æ•ˆã€‚"
-
-msgid ""
-"\"Min SDK\" can only be overridden when \"Use Custom Build\" is enabled."
-msgstr "ä¿®æ”¹â€œæœ€å° SDKâ€åªæœ‰åœ¨å½“å¯ç”¨â€œä½¿ç”¨è‡ªå®šä¹‰æž„建â€æ—¶æ‰æœ‰æ•ˆã€‚"
-
msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid."
msgstr "â€œæœ€å° SDKâ€åº”当为有效的整数,但获得了无效的“%sâ€ã€‚"
@@ -8144,10 +13075,6 @@ msgid ""
msgstr "â€œæœ€å° SDKâ€ä¸èƒ½ä½ŽäºŽ %d,这是 Godot 库所需è¦çš„版本。"
msgid ""
-"\"Target SDK\" can only be overridden when \"Use Custom Build\" is enabled."
-msgstr "修改“目标 SDKâ€åªæœ‰åœ¨å½“å¯ç”¨â€œä½¿ç”¨è‡ªå®šä¹‰æž„建â€æ—¶æ‰æœ‰æ•ˆã€‚"
-
-msgid ""
"\"Target SDK\" should be a valid integer, but got \"%s\" which is invalid."
msgstr "“目标 SDKâ€åº”当为有效的整数,但获得了无效的“%sâ€ã€‚"
@@ -8165,6 +13092,14 @@ msgid "Code Signing"
msgstr "代ç ç­¾å"
msgid ""
+"All 'apksigner' tools located in Android SDK 'build-tools' directory failed "
+"to execute. Please check that you have the correct version installed for "
+"your target sdk version. The resulting %s is unsigned."
+msgstr ""
+"ä½äºŽ Android SDK“build-toolsâ€ç›®å½•ä¸‹çš„所有“apksignerâ€å·¥å…·éƒ½æœªèƒ½æˆåŠŸæ‰§è¡Œã€‚请检"
+"查你是å¦ä¸ºç›®æ ‡ SDK 版本安装了正确的版本。生æˆçš„ %s 未签å。"
+
+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 ""
@@ -8186,6 +13121,13 @@ msgstr "无法å¯åŠ¨ apksigner å¯æ‰§è¡Œæ–‡ä»¶ã€‚"
msgid "'apksigner' returned with error #%d"
msgstr "“apksignerâ€è¿”回错误 #%d"
+msgid ""
+"output: \n"
+"%s"
+msgstr ""
+"输出:\n"
+"%s"
+
msgid "Verifying %s..."
msgstr "正在校验 %s……"
@@ -8208,12 +13150,6 @@ msgid "Unsupported export format!"
msgstr "ä¸æ”¯æŒçš„导出格å¼ï¼"
msgid ""
-"Trying to build from a custom built template, but no version info for it "
-"exists. Please reinstall from the 'Project' menu."
-msgstr ""
-"å°è¯•ä»Žè‡ªå®šä¹‰æž„建的模æ¿æž„建,但是ä¸å­˜åœ¨å…¶ç‰ˆæœ¬ä¿¡æ¯ã€‚请从“项目â€èœå•ä¸­é‡æ–°å®‰è£…。"
-
-msgid ""
"Android build version mismatch: Template installed: %s, Godot version: %s. "
"Please reinstall Android build template from 'Project' menu."
msgstr ""
@@ -8286,6 +13222,23 @@ msgstr "准备模æ¿"
msgid "Export template not found."
msgstr "找ä¸åˆ°å¯¼å‡ºæ¨¡æ¿ã€‚"
+msgid "Code signing failed, see editor log for details."
+msgstr "代ç ç­¾å失败,详è§ç¼–辑器日志。"
+
+msgid "Xcode Build"
+msgstr "Xcode 构建"
+
+msgid "Xcode project build failed, see editor log for details."
+msgstr "Xcode 项目构建失败,详è§ç¼–辑器日志。"
+
+msgid ".ipa export failed, see editor log for details."
+msgstr ".ipa 导出失败,详è§ç¼–辑器日志。"
+
+msgid ""
+".ipa can only be built on macOS. Leaving Xcode project without building the "
+"package."
+msgstr ".ipa åªèƒ½åœ¨ macOS 上构建。正在离开 Xcode 项目,未构建包。"
+
msgid "App Store Team ID not specified - cannot configure the project."
msgstr "未指定 App Store Team ID - 无法é…置项目。"
@@ -8298,6 +13251,15 @@ msgstr "缺少标识符。"
msgid "The character '%s' is not allowed in Identifier."
msgstr "标识符中ä¸å…许使用字符“%sâ€ã€‚"
+msgid "Debug Script Export"
+msgstr "调试脚本导出"
+
+msgid "Could not open file \"%s\"."
+msgstr "无法打开文件“%sâ€ã€‚"
+
+msgid "Could not create console script."
+msgstr "无法创建命令行脚本。"
+
msgid "Failed to open executable file \"%s\"."
msgstr "打开å¯æ‰§è¡Œæ–‡ä»¶â€œ%sâ€å¤±è´¥ã€‚"
@@ -8310,6 +13272,39 @@ msgstr "32 ä½å¯æ‰§è¡Œæ–‡ä»¶æ— æ³•å†…嵌 >= 4 GiB çš„æ•°æ®ã€‚"
msgid "Executable \"pck\" section not found."
msgstr "å¯æ‰§è¡Œæ–‡ä»¶â€œpckâ€åŒºæœªæ‰¾åˆ°ã€‚"
+msgid "Stop and uninstall"
+msgstr "åœæ­¢å¹¶å¸è½½"
+
+msgid "Run on remote Linux/BSD system"
+msgstr "在远程 Linux/BSD 系统上è¿è¡Œ"
+
+msgid "Stop and uninstall running project from the remote system"
+msgstr "åœæ­¢å¹¶å¸è½½æ­£åœ¨è¿œç¨‹ç³»ç»Ÿä¸Šè¿è¡Œçš„项目"
+
+msgid "Run exported project on remote Linux/BSD system"
+msgstr "在远程 Linux/BSD 系统上è¿è¡Œå¯¼å‡ºçš„项目"
+
+msgid "Running..."
+msgstr "正在è¿è¡Œ..."
+
+msgid "Could not create temp directory:"
+msgstr "无法创建临时目录:"
+
+msgid "Exporting project..."
+msgstr "正在导出项目..."
+
+msgid "Creating temporary directory..."
+msgstr "正在创建临时目录..."
+
+msgid "Uploading archive..."
+msgstr "正在上传归档..."
+
+msgid "Uploading scripts..."
+msgstr "正在上传脚本..."
+
+msgid "Starting project..."
+msgstr "正在å¯åŠ¨é¡¹ç›®..."
+
msgid "Can't get filesystem access."
msgstr "无法访问文件系统。"
@@ -8329,7 +13324,7 @@ msgid "Failed to create \"%s\" subfolder."
msgstr "创建“%sâ€å­æ–‡ä»¶å¤¹å¤±è´¥ã€‚"
msgid "Failed to extract thin binary."
-msgstr "æå–瘦二进制文件失败。"
+msgstr "æå–精简二进制文件失败。"
msgid "Invalid binary format."
msgstr "二进制格å¼æ— æ•ˆã€‚"
@@ -8373,9 +13368,31 @@ 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 "App Store Connect issuer ID name not specified."
+msgstr "未指定 App Store Connect å‘行者 ID å称。"
+
+msgid "App Store Connect API key ID not specified."
+msgstr "未指定 App Store Connect API 密钥 ID。"
+
+msgid "Could not start rcodesign executable."
+msgstr "无法å¯åŠ¨ 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:"
@@ -8386,6 +13403,23 @@ msgid ""
"application (optional):"
msgstr "è¿è¡Œä»¥ä¸‹å‘½ä»¤å°†å…¬è¯ç¥¨è¯è£…订到导出的应用中(å¯é€‰ï¼‰ï¼š"
+msgid "Xcode command line tools are not installed."
+msgstr "未安装 Xcode 命令行工具。"
+
+msgid ""
+"Neither Apple ID name nor App Store Connect issuer ID name not specified."
+msgstr "Apple ID å称和 App Store Connect å‘行者 ID å称å‡æœªæŒ‡å®šã€‚"
+
+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 å称和 App Store Connect å‘行商 ID å称,åªåº”åŒæ—¶è®¾ç½®ä¸€"
+"个。"
+
+msgid "Apple ID password not specified."
+msgstr "未指定 Apple ID 密ç ã€‚"
+
msgid "Could not start xcrun executable."
msgstr "无法å¯åŠ¨ xcrun å¯æ‰§è¡Œæ–‡ä»¶ã€‚"
@@ -8401,6 +13435,13 @@ msgid "Built-in CodeSign require regex module."
msgstr "内置 CodeSign éœ€è¦ regex 模å—。"
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 "无法å¯åŠ¨ codesign å¯æ‰§è¡Œæ–‡ä»¶ï¼Œè¯·ç¡®ä¿å·²å®‰è£… Xcode 命令行工具。"
@@ -8432,11 +13473,23 @@ msgstr "无法找到导出的模æ¿åº”用:“%sâ€ã€‚"
msgid "Invalid export format."
msgstr "导出格å¼æ— æ•ˆã€‚"
+msgid "Could not create directory: \"%s\"."
+msgstr "无法创建目录:“%sâ€ã€‚"
+
+msgid "Could not create directory \"%s\"."
+msgstr "无法创建目录“%sâ€ã€‚"
+
msgid ""
"Relative symlinks are not supported on this OS, the exported project might "
"be broken!"
msgstr "该æ“作系统上ä¸æ”¯æŒç›¸å¯¹ç¬¦å·é“¾æŽ¥ï¼Œå¯¼å‡ºçš„项目å¯èƒ½æŸåï¼"
+msgid "Could not created symlink \"%s\" -> \"%s\"."
+msgstr "无法创建符å·é“¾æŽ¥ “%s†-> “%sâ€ã€‚"
+
+msgid "Could not open \"%s\"."
+msgstr "无法打开“%sâ€ã€‚"
+
msgid ""
"Requested template binary \"%s\" not found. It might be missing from your "
"template archive."
@@ -8445,11 +13498,20 @@ msgstr "未找到请求的模æ¿äºŒè¿›åˆ¶æ–‡ä»¶â€œ%sâ€ã€‚你的模æ¿å½’档中å
msgid "Making PKG"
msgstr "正在制作 PKG"
+msgid "Entitlements Modified"
+msgstr "授æƒå·²ä¿®æ”¹"
+
msgid ""
"Ad-hoc signed applications require the 'Disable Library Validation' "
"entitlement to load dynamic libraries."
msgstr "Ad-hoc ç­¾å的应用需è¦â€œDisable Library Validationâ€æŽˆæƒæ‰èƒ½åŠ è½½åŠ¨æ€åº“。"
+msgid "Could not create entitlements file."
+msgstr "无法创建授æƒæ–‡ä»¶ã€‚"
+
+msgid "Could not create helper entitlements file."
+msgstr "无法创建帮助程åºæŽˆæƒæ–‡ä»¶ã€‚"
+
msgid "Code signing bundle"
msgstr "正在对æ†ç»‘包进行代ç ç­¾å"
@@ -8479,9 +13541,40 @@ msgstr "å…¬è¯ï¼šä¸æ”¯æŒä½¿ç”¨ Ad-hoc ç­¾å进行公è¯ã€‚"
msgid "Notarization: Code signing is required for notarization."
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 å称和 App Store Connect å‘行者 ID å称å‡æœªæŒ‡å®šã€‚"
+
+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 å称和 App Store Connect å‘行商 ID å称,åªåº”åŒæ—¶è®¾"
+"置一个。"
+
msgid "Notarization: Apple ID password not specified."
msgstr "å…¬è¯ï¼šæœªæŒ‡å®š Apple ID 密ç ã€‚"
+msgid "Notarization: App Store Connect API key ID not specified."
+msgstr "å…¬è¯ï¼šæœªæŒ‡å®š App Store Connect API 密钥 ID。"
+
+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 å‘行者 ID å称。"
+
+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."
@@ -8497,6 +13590,21 @@ msgstr ""
"Silicon çš„ Mac 上è¿è¡Œã€‚"
msgid ""
+"Code signing: Using ad-hoc signature. The exported project will be blocked "
+"by Gatekeeper"
+msgstr "代ç ç­¾å:使用临时签å。导出的项目将被 Gatekeeper 阻止"
+
+msgid "Code signing: Xcode command line tools are not installed."
+msgstr "代ç ç­¾å:未安装 Xcode 命令行工具。"
+
+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 "éšç§ï¼šå·²å¯ç”¨éº¦å…‹é£Žè®¿é—®ï¼Œä½†æœªæŒ‡å®šç”¨é€”æ述。"
@@ -8524,6 +13632,12 @@ msgid ""
"specified."
msgstr "éšç§ï¼šå·²å¯ç”¨ç…§ç‰‡åº“访问,但未指定用途æ述。"
+msgid "Run on remote macOS system"
+msgstr "在远程 MacOS 系统上è¿è¡Œ"
+
+msgid "Run exported project on remote macOS system"
+msgstr "在远程 MacOS 系统上è¿è¡Œå¯¼å‡ºçš„项目"
+
msgid "Invalid package short name."
msgstr "无效的包短å称。"
@@ -8599,6 +13713,9 @@ msgstr "使用默认æµè§ˆå™¨æ‰“开导出的 HTML 文件。"
msgid "Resources Modification"
msgstr "资æºä¿®æ”¹"
+msgid "Icon size \"%d\" is missing."
+msgstr "缺少图标尺寸“%dâ€ã€‚"
+
msgid "Failed to rename temporary file \"%s\"."
msgstr "é‡å‘½å临时文件“%sâ€å¤±è´¥ã€‚"
@@ -8608,6 +13725,17 @@ msgstr "无法在“%sâ€æ‰¾åˆ° rcedit å¯æ‰§è¡Œæ–‡ä»¶ã€‚"
msgid "Could not find wine executable at \"%s\"."
msgstr "无法在“%sâ€æ‰¾åˆ° wine å¯æ‰§è¡Œæ–‡ä»¶ã€‚"
+msgid "Invalid icon file \"%s\"."
+msgstr "无效的图标文件“%sâ€ã€‚"
+
+msgid ""
+"Could not start rcedit executable. Configure rcedit path in the Editor "
+"Settings (Export > Windows > rcedit), or disable \"Application > Modify "
+"Resources\" in the export preset."
+msgstr ""
+"无法å¯åŠ¨ rcedit å¯æ‰§è¡Œæ–‡ä»¶ã€‚请在编辑器设置中é…ç½® rcedit 路径(导出 > Windows "
+"> Rcedit),或在导出预设中ç¦ç”¨â€œåº”用 > 修改资æºâ€ã€‚"
+
msgid "rcedit failed to modify executable: %s."
msgstr "rcedit 修改å¯æ‰§è¡Œæ–‡ä»¶å¤±è´¥ï¼š%s。"
@@ -8626,12 +13754,35 @@ 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 路径(导出 > "
+"Windows > Signtool),或在导出预设中ç¦ç”¨â€œä»£ç ç­¾åâ€ã€‚"
+
+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 路径(导出 > "
+"Windows > Signtool),或在导出预设中ç¦ç”¨â€œä»£ç ç­¾åâ€ã€‚"
+
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 "图标路径无效:"
@@ -8644,6 +13795,26 @@ msgstr "产å“版本无效:"
msgid "Windows executables cannot be >= 4 GiB."
msgstr "Windows å¯æ‰§è¡Œæ–‡ä»¶ä¸èƒ½ >= 4GiB。"
+msgid "Run on remote Windows system"
+msgstr "在远程 Windows 系统上è¿è¡Œ"
+
+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 ""
+"必须在“Framesâ€å±žæ€§ä¸­åˆ›å»ºæˆ–设置 SpriteFrames 资æºï¼Œè®© AnimatedSprite2D 显示"
+"帧。"
+
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instantiated "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+"æ¯ä¸ªåœºæ™¯ï¼ˆæˆ–一组实例化的场景)åªå…许一个å¯è§çš„CanvasModulate。第一个创建的将"
+"会起作用,而其他的将会被忽略。"
+
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 "
@@ -8653,6 +13824,15 @@ msgstr ""
"请添加一个 CollisionShape2D 或 CollisionPolygon2D 类型的å­èŠ‚点æ¥å®šä¹‰å®ƒçš„å½¢"
"状。"
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, CharacterBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon2D 节点åªèƒ½ä¸º CollisionObject2D 的派生类æ供碰撞形状,请将其"
+"作为 Area2Dã€StaticBody2Dã€RigidBody2D 或 CharacterBody2D çš„å­èŠ‚点以æ供形"
+"状。"
+
msgid "An empty CollisionPolygon2D has no effect on collision."
msgstr "空的 CollisionPolygon2D ä¸èµ·ä»»ä½•ç¢°æ’žæ£€æµ‹ä½œç”¨ã€‚"
@@ -8667,6 +13847,14 @@ msgid ""
msgstr "父节点为 Area2D 时将忽略 One Way Collision 属性。"
msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, CharacterBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionShape2D 节点åªèƒ½ä¸º CollisionObject2D 的派生类æ供碰撞形状,请将其作"
+"为 Area2Dã€StaticBody2Dã€RigidBody2D 或 CharacterBody2D çš„å­èŠ‚点以æ供形状。"
+
+msgid ""
"A shape must be provided for CollisionShape2D to function. Please create a "
"shape resource for it!"
msgstr "CollisionShape2D 必须有形状æ‰èƒ½å·¥ä½œã€‚请先为其创建形状资æºï¼"
@@ -8733,6 +13921,13 @@ msgid ""
msgstr "NavigationObstacle2D åªèƒ½ç”¨äºŽä¸º Node2D 对象é¿å…碰撞。"
msgid ""
+"A NavigationMesh resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+"必须为这个节点设置或创建 NavigationMesh 资æºï¼Œæ‰èƒ½æ­£å¸¸å·¥ä½œã€‚请设置属性或绘制"
+"多边形。"
+
+msgid ""
"ParallaxLayer node only works when set as child of a ParallaxBackground node."
msgstr ""
"ParallaxLayer 类型的节点必须作为 ParallaxBackground çš„å­èŠ‚点æ‰èƒ½æ­£å¸¸å·¥ä½œã€‚"
@@ -8740,9 +13935,42 @@ msgstr ""
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr "PathFollow2D 类型的节点åªæœ‰ä½œä¸º Path2D çš„å­èŠ‚点节æ‰èƒ½æ­£å¸¸å·¥ä½œã€‚"
+msgid ""
+"A PhysicalBone2D only works with a Skeleton2D or another PhysicalBone2D as a "
+"parent node!"
+msgstr ""
+"PhysicalBone2D åªæœ‰åœ¨æœ‰ Skeleton2D 或其他 PhysicalBone2D 作为父节点的情况下æ‰"
+"能工作ï¼"
+
+msgid ""
+"A PhysicalBone2D needs to be assigned to a Bone2D node in order to function! "
+"Please set a Bone2D node in the inspector."
+msgstr ""
+"PhysicalBone2D 需è¦åˆ†é…ç»™ Bone2D 节点,æ‰èƒ½å‘挥作用ï¼è¯·åœ¨æ£€æŸ¥å™¨ä¸­è®¾ç½® Bone2D "
+"节点。"
+
+msgid ""
+"A PhysicalBone2D node should have a Joint2D-based child node to keep bones "
+"connected! Please add a Joint2D-based node as a child to this node!"
+msgstr ""
+"一个 PhysicalBone2D 节点应该有一个基于 Joint2D çš„å­èŠ‚点æ¥ä¿æŒéª¨éª¼çš„连接ï¼è¯·æ·»"
+"加一个基于 Joint2D 的节点作为其å­èŠ‚点ï¼"
+
+msgid ""
+"Size changes to RigidBody2D will be overridden by the physics engine when "
+"running.\n"
+"Change the size in children collision shapes instead."
+msgstr ""
+"对 RigidBody2D 大å°çš„修改,将会在è¿è¡Œæ—¶è¢«ç‰©ç†å¼•æ“Žæ‰€è¦†ç›–。\n"
+"建议修改å­èŠ‚点的碰撞体形状大å°ã€‚"
+
msgid "Path property must point to a valid Node2D node to work."
msgstr "Path 属性必须指å‘有效的 Node2D 节点æ‰èƒ½æ­£å¸¸å·¥ä½œã€‚"
+msgid ""
+"This node cannot interact with other objects unless a Shape2D is assigned."
+msgstr "除éžæŒ‡å®š Shape2D,å¦åˆ™è¯¥èŠ‚点ä¸èƒ½ä¸Žå…¶ä»–对象交互。"
+
msgid "This Bone2D chain should end at a Skeleton2D node."
msgstr "è¿™æ¡ Bone2D 链应该以 Skeleton2D 节点结æŸã€‚"
@@ -8754,12 +13982,313 @@ msgid ""
"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."
msgstr "这根骨骼没有åˆé€‚的放æ¾å§¿åŠ¿ã€‚请到 Skeleton2D 节点中设置一个。"
+msgid ""
+"A Y-sorted layer has the same Z-index value as a not Y-sorted layer.\n"
+"This may lead to unwanted behaviors, as a layer that is not Y-sorted will be "
+"Y-sorted as a whole with tiles from Y-sorted layers."
+msgstr ""
+"Y 排åºå›¾å±‚ä¸Žéž Y 排åºå›¾å±‚具有相åŒçš„ Z 索引值。\n"
+"è¿™å¯èƒ½ä¼šå¯¼è‡´ä¸éœ€è¦çš„行为,因为未按 Y 排åºçš„层将作为一个整体,与æ¥è‡ª Y 排åºå±‚"
+"的图å—一起进行 Y 排åºã€‚"
+
+msgid ""
+"Isometric TileSet will likely not look as intended without Y-sort enabled "
+"for the TileMap and all of its layers."
+msgstr ""
+"如果ä¸å¯¹ TileMap 和它的所有层å¯ç”¨ Y-sort,Isometric TileSet å¯èƒ½çœ‹èµ·æ¥ä¸åƒé¢„"
+"期的那样。"
+
+msgid ""
+"External Skeleton3D node not set! Please set a path to an external "
+"Skeleton3D node."
+msgstr "未设置外部 Skeleton3D 节点ï¼è¯·è®¾ç½®å¤–部 Skeleton3D 节点的路径。"
+
+msgid ""
+"Parent node is not a Skeleton3D node! Please use an external Skeleton3D if "
+"you intend to use the BoneAttachment3D without it being a child of a "
+"Skeleton3D node."
+msgstr ""
+"父节点ä¸æ˜¯ Skeleton3D 节点ï¼å¦‚æžœä¸æƒ³è®© BoneAttachment3D æˆä¸º Skeleton3D 节点"
+"çš„å­èŠ‚点,请使用外部 Skeleton3D。"
+
+msgid ""
+"BoneAttachment3D node is not bound to any bones! Please select a bone to "
+"attach this node."
+msgstr "BoneAttachment3D 节点未绑定至任何骨头ï¼è¯·é€‰æ‹©è¿™ä¸ªèŠ‚点附加的骨头。"
+
+msgid ""
+"This node has no shape, so it can't collide or interact with other objects.\n"
+"Consider adding a CollisionShape3D or CollisionPolygon3D as a child to "
+"define its shape."
+msgstr ""
+"这个节点没有形状,因此无法与其他物体产生碰撞或者进行交互。\n"
+"请添加一个 CollisionShape3D 或 CollisionPolygon3D 类型的å­èŠ‚点æ¥å®šä¹‰å®ƒçš„å½¢"
+"状。"
+
+msgid ""
+"With a non-uniform scale this node will probably not function as expected.\n"
+"Please make its scale uniform (i.e. the same on all axes), and change the "
+"size in children collision shapes instead."
+msgstr ""
+"缩放ä¸ç»Ÿä¸€ï¼Œè¿™ä¸ªèŠ‚点很å¯èƒ½æ— æ³•æ­£å¸¸å·¥ä½œã€‚\n"
+"请统一其缩放(å³å„è½´å‡ç›¸åŒï¼‰ï¼Œä¿®æ”¹å­ç¢°æ’žå½¢çŠ¶èŠ‚点的大å°ã€‚"
+
+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, "
+"CharacterBody3D, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon3D 类型节点åªèƒ½ä¸º CollisionObject3D 的派生类æ供碰撞形状。\n"
+"请将其放在 Area3Dã€StaticBody3Dã€RigidBody3Dã€CharacterBody3D 等节点下æ供形"
+"状。"
+
+msgid "An empty CollisionPolygon3D has no effect on collision."
+msgstr "空的 CollisionPolygon3D ä¸å½±å“碰撞。"
+
+msgid ""
+"A non-uniformly scaled CollisionPolygon3D node will probably not function as "
+"expected.\n"
+"Please make its scale uniform (i.e. the same on all axes), and change its "
+"polygon's vertices instead."
+msgstr ""
+"CollisionPolygon3D 节点的缩放ä¸ç»Ÿä¸€ï¼Œå¾ˆå¯èƒ½æ— æ³•æ­£å¸¸å·¥ä½œã€‚\n"
+"请统一其缩放(å³å„è½´å‡ç›¸åŒï¼‰ï¼Œä¿®æ”¹å¤šè¾¹å½¢çš„顶点。"
+
+msgid ""
+"A shape must be provided for CollisionShape3D to function. Please create a "
+"shape resource for it."
+msgstr "CollisionShape3D 必须有形状æ‰èƒ½å·¥ä½œã€‚请先为其创建形状资æºã€‚"
+
+msgid ""
+"ConcavePolygonShape3D doesn't support RigidBody3D in another mode than "
+"static."
+msgstr "ConcavePolygonShape3D ä¸æ”¯æŒé™æ€æ¨¡å¼ä»¥å¤–çš„ RigidBody3D。"
+
+msgid ""
+"WorldBoundaryShape3D doesn't support RigidBody3D in another mode than static."
+msgstr "WorldBoundaryShape3D ä¸æ”¯æŒé™æ€æ¨¡å¼ä»¥å¤–çš„ RigidBody3D。"
+
+msgid ""
+"A non-uniformly scaled CollisionShape3D node will probably not function as "
+"expected.\n"
+"Please make its scale uniform (i.e. the same on all axes), and change the "
+"size of its shape resource instead."
+msgstr ""
+"缩放ä¸ä¸€è‡´çš„ CollisionShape3D 节点å¯èƒ½ä¸ä¼šåƒé¢„期地那样工作。\n"
+"请使其缩放统一(å³åœ¨æ‰€æœ‰è½´ä¸Šçš„值相等),改å˜å…¶å½¢çŠ¶èµ„æºçš„大å°è€Œä¸æ˜¯ç¼©æ”¾å€¼ã€‚"
+
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 ""
+"The decal has no textures loaded into any of its texture properties, and "
+"will therefore not be visible."
+msgstr "该贴花的所有纹ç†å±žæ€§ä¸­éƒ½æ²¡æœ‰åŠ è½½çº¹ç†ï¼Œå› æ­¤å°†ä¸å¯è§ã€‚"
+
+msgid ""
+"The decal has a Normal and/or ORM texture, but no Albedo texture is set.\n"
+"An Albedo texture with an alpha channel is required to blend the normal/ORM "
+"maps onto the underlying surface.\n"
+"If you don't want the Albedo texture to be visible, set Albedo Mix to 0."
+msgstr ""
+"该贴花设有法线和/或 ORM 纹ç†ï¼Œä½†æ²¡æœ‰è®¾ç½®å照率纹ç†ã€‚\n"
+"存在带有 Alpha 通é“çš„å照率纹ç†ï¼Œæ‰èƒ½å°†æ³•çº¿/ORM 贴图混åˆåˆ°åº•å±‚表é¢ã€‚\n"
+"如果你ä¸å¸Œæœ›å照率纹ç†å¯è§ï¼Œè¯·å°† Albedo Mix 设置为 0。"
+
+msgid ""
+"The decal's Cull Mask has no bits enabled, which means the decal will not "
+"paint objects on any layer.\n"
+"To resolve this, enable at least one bit in the Cull Mask property."
+msgstr ""
+"该贴花的 Cull Mask 没有å¯ç”¨ä»»ä½•ä½ï¼Œè¿™æ„味ç€è¯¥è´´èŠ±ä¸ä¼šåœ¨ä»»ä½•å±‚上绘制对象。\n"
+"è¦è§£å†³æ­¤é—®é¢˜ï¼Œè¯·åœ¨ Cull Mask 属性中至少å¯ç”¨ä¸€ä½ã€‚"
+
+msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
-msgstr "ç²’å­ä¸å¯è§ï¼Œå› ä¸ºæ²¡æœ‰ç½‘æ ¼æŒ‡å®šåˆ°ç»˜åˆ¶é€šé“ (Draw Pass)。"
+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 ""
+"Using Trail meshes with a skin causes Skin to override Trail poses. Suggest "
+"removing the Skin."
+msgstr "åŒæ—¶ä½¿ç”¨å°¾è¿¹ç½‘格和皮肤会导致皮肤覆盖尾迹的姿势。建议移除该皮肤。"
+
+msgid "Trails active, but neither Trail meshes or a Skin were found."
+msgstr "尾迹已激活,但未找到尾迹网格或皮肤。"
+
+msgid ""
+"Only one Trail mesh is supported. If you want to use more than a single "
+"mesh, a Skin is needed (see documentation)."
+msgstr "仅支æŒå•ä¸ªå°¾è¿¹ç½‘格。如果你想使用多个网格,则需è¦çš®è‚¤ï¼ˆè§æ–‡æ¡£ï¼‰ã€‚"
+
+msgid ""
+"Trails enabled, but one or more mesh materials are either missing or not set "
+"for trails rendering."
+msgstr "尾迹已å¯ç”¨ï¼Œä½†è‡³å°‘有一个网格æ质处于缺失状æ€ï¼Œæˆ–未设置尾迹渲染。"
+
+msgid ""
+"The Bake Mask has no bits enabled, which means baking will not produce any "
+"collision for this GPUParticlesCollisionSDF3D.\n"
+"To resolve this, enable at least one bit in the Bake Mask property."
+msgstr ""
+"Bake Mask 没有å¯ç”¨ä»»ä½•ä½ï¼Œè¿™æ„味ç€çƒ˜ç„™ä¸ä¼šä¸ºæ­¤ GPUParticlesCollisionSDF3D 生"
+"æˆä»»ä½•ç¢°æ’žã€‚\n"
+"è¦è§£å†³æ­¤é—®é¢˜ï¼Œè¯·åœ¨ Bake Mask 属性中至少å¯ç”¨ä¸€ä½ã€‚"
+
+msgid "Node A and Node B must be PhysicsBody3Ds"
+msgstr "Node A 与 Node B 必须为 PhysicsBody3D"
+
+msgid "Node A must be a PhysicsBody3D"
+msgstr "Node A 必须为 PhysicsBody3D"
+
+msgid "Node B must be a PhysicsBody3D"
+msgstr "Node B 必须为 PhysicsBody3D"
+
+msgid "Joint is not connected to any PhysicsBody3Ds"
+msgstr "Joint 未连接到任何 PhysicsBody3D"
+
+msgid "Node A and Node B must be different PhysicsBody3Ds"
+msgstr "Node A 与 Node B 必须为ä¸åŒçš„ PhysicsBody3D"
+
+msgid "A light's scale does not affect the visual size of the light."
+msgstr "ç¯å…‰çš„缩放ä¸ä¼šå½±å“ç¯å…‰çš„视觉尺寸。"
+
+msgid "Projector texture only works with shadows active."
+msgstr "投影纹ç†ä»…在阴影激活时能够正常工作。"
+
+msgid "A SpotLight3D with an angle wider than 90 degrees cannot cast shadows."
+msgstr "角度大于 90 度的 SpotLight3D 无法投射阴影。"
+
+msgid "Finding meshes, lights and probes"
+msgstr "正在查找网格ã€ç¯å…‰å’ŒæŽ¢é’ˆ"
+
+msgid "Preparing geometry %d/%d"
+msgstr "正在准备几何体 %d/%d"
+
+msgid "Creating probes"
+msgstr "正在创建探针"
+
+msgid "Creating probes from mesh %d/%d"
+msgstr "正在从网格创建探针 %d/%d"
+
+msgid "Preparing Lightmapper"
+msgstr "正在准备光照贴图器"
+
+msgid "Preparing Environment"
+msgstr "正在准备环境"
+
+msgid "Generating Probe Volumes"
+msgstr "正在生æˆæŽ¢é’ˆä½“积"
+
+msgid "Generating Probe Acceleration Structures"
+msgstr "正在生æˆæŽ¢é’ˆåŠ é€Ÿç»“æž„"
+
+msgid ""
+"The NavigationAgent3D can be used only under a Node3D inheriting parent node."
+msgstr "NavigationAgent3D åªèƒ½åœ¨ç»§æ‰¿ Node3D 的父节点下使用。"
+
+msgid ""
+"The NavigationObstacle3D only serves to provide collision avoidance to a "
+"Node3D inheriting parent object."
+msgstr "NavigationObstacle3D åªèƒ½ç”¨äºŽä¸ºç»§æ‰¿è‡ª Node3D 的父级对象é¿å…碰撞。"
+
+msgid ""
+"Occlusion culling is disabled in the Project Settings, which means occlusion "
+"culling won't be performed in the root viewport.\n"
+"To resolve this, open the Project Settings and enable Rendering > Occlusion "
+"Culling > Use Occlusion Culling."
+msgstr ""
+"“项目设置â€ä¸­ç¦ç”¨äº†é®æŒ¡å‰”除,这æ„味ç€åœ¨æ ¹è§†å£ä¸­ä¸ä¼šè¿›è¡Œé®æŒ¡å‰”除。\n"
+"è¦è§£å†³è¿™ä¸ªé—®é¢˜ï¼Œè¯·æ‰“开“项目设置â€å¹¶å¯ç”¨â€œæ¸²æŸ“ > é®æŒ¡å‰”除 > 使用é®æŒ¡å‰”除â€ã€‚"
+
+msgid ""
+"The Bake Mask has no bits enabled, which means baking will not produce any "
+"occluder meshes for this OccluderInstance3D.\n"
+"To resolve this, enable at least one bit in the Bake Mask property."
+msgstr ""
+"Bake Mask 没有å¯ç”¨ä»»ä½•ä½ï¼Œè¿™æ„味ç€çƒ˜ç„™æ—¶ä¸ä¼šä¸ºè¿™ä¸ª OccluderInstance3D 生æˆä»»"
+"何é®æŒ¡ç½‘格。\n"
+"è¦è§£å†³è¿™ä¸ªé—®é¢˜ï¼Œè¯·åœ¨ Bake Mask 属性中至少å¯ç”¨ä¸€ä¸ªä½ã€‚"
+
+msgid ""
+"No occluder mesh is defined in the Occluder property, so no occlusion "
+"culling will be performed using this OccluderInstance3D.\n"
+"To resolve this, set the Occluder property to one of the primitive occluder "
+"types or bake the scene meshes by selecting the OccluderInstance3D and "
+"pressing the Bake Occluders button at the top of the 3D editor viewport."
+msgstr ""
+"Occluder 属性中没有定义é®æŒ¡ç½‘格,所以使用这个 OccluderInstance3D ä¸ä¼šè¿›è¡Œé®æŒ¡"
+"剔除。\n"
+"è¦è§£å†³è¿™ä¸ªé—®é¢˜ï¼Œå¯ä»¥å°† Occluder 属性设置为基本é®æŒ¡å™¨ç±»åž‹ä¹‹ä¸€ï¼Œæˆ–者通过选择 "
+"OccluderInstance3D 并使用 3D 编辑器视å£é¡¶éƒ¨çš„“烘焙é®æŒ¡å™¨â€æŒ‰é’®æ¥çƒ˜ç„™åœºæ™¯ç½‘格。"
+
+msgid ""
+"The occluder mesh has less than 3 vertices, so no occlusion culling will be "
+"performed using this OccluderInstance3D.\n"
+"To generate a proper occluder mesh, select the OccluderInstance3D then use "
+"the Bake Occluders button at the top of the 3D editor viewport."
+msgstr ""
+"é®æŒ¡ç½‘格的顶点少于 3 个,所以使用这个 OccluderInstance3D ä¸ä¼šè¿›è¡Œé®æŒ¡å‰”除。\n"
+"è¦ç”Ÿæˆæ­£ç¡®çš„é®æŒ¡ç½‘格,请选择 OccluderInstance3D,然åŽä½¿ç”¨ 3D 编辑器视å£é¡¶éƒ¨"
+"的“烘焙é®æŒ¡å™¨â€æŒ‰é’®ã€‚"
+
+msgid ""
+"The polygon occluder has less than 3 vertices, so no occlusion culling will "
+"be performed using this OccluderInstance3D.\n"
+"Vertices can be added in the inspector or using the polygon editing tools at "
+"the top of the 3D editor viewport."
+msgstr ""
+"多边形é®æŒ¡å™¨çš„顶点少于 3 个,因此使用这个 OccluderInstance3D ä¸ä¼šè¿›è¡Œé®æŒ¡å‰”"
+"除。\n"
+"å¯ä»¥åœ¨æ£€æŸ¥å™¨ä¸­æ·»åŠ é¡¶ç‚¹ï¼Œä¹Ÿå¯ä»¥ä½¿ç”¨ 3D 编辑器视å£é¡¶éƒ¨çš„多边形编辑工具添加顶"
+"点。"
+
+msgid "PathFollow3D only works when set as a child of a Path3D node."
+msgstr "PathFollow3D åªæœ‰ä½œä¸º Path3D çš„å­èŠ‚点节æ‰èƒ½æ­£å¸¸å·¥ä½œã€‚"
+
+msgid ""
+"PathFollow3D's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its "
+"parent Path3D's Curve resource."
+msgstr ""
+"PathFollow3D çš„ ROTATION_ORIENTED è¦æ±‚在其父级 Path3D çš„ Curve 资æºä¸­å¯ç”¨â€œUp "
+"Vectorâ€ã€‚"
+
+msgid ""
+"Scale changes to RigidBody3D will be overridden by the physics engine when "
+"running.\n"
+"Please change the size in children collision shapes instead."
+msgstr ""
+"对 RigidBody3D 尺寸的修改将会在è¿è¡Œæ—¶è¢«ç‰©ç†å¼•æ“Žæ‰€è¦†ç›–。\n"
+"请改为修改å­èŠ‚点的碰撞形状的尺寸。"
+
+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 ""
+"ShapeCast3D does not support ConcavePolygonShape3Ds. Collisions will not be "
+"reported."
+msgstr "ShapeCast3D ä¸æ”¯æŒ ConcavePolygonShape3D。将无法汇报碰撞。"
msgid "This body will be ignored until you set a mesh."
msgstr "在设置网格之å‰ï¼Œå°†å¿½ç•¥è¯¥å®žä½“。"
@@ -8771,18 +14300,103 @@ msgstr ""
"必须在 “Frames†属性中创建或设置 SpriteFrames 资æºï¼ŒAnimatedSprite3D æ‰ä¼šæ˜¾ç¤º"
"帧。"
+msgid ""
+"VehicleWheel3D serves to provide a wheel system to a VehicleBody3D. Please "
+"use it as a child of a VehicleBody3D."
+msgstr ""
+"VehicleWheel3D 是用æ¥ä¸º VehicleBody3D æ供车轮系统的。请将它用作 "
+"VehicleBody3D çš„å­èŠ‚点。"
+
+msgid ""
+"The GeometryInstance3D visibility range's End distance is set to a non-zero "
+"value, but is lower than the Begin distance.\n"
+"This means the GeometryInstance3D will never be visible.\n"
+"To resolve this, set the End distance to 0 or to a value greater than the "
+"Begin distance."
+msgstr ""
+"GeometryInstance3D å¯è§†èŒƒå›´çš„结æŸè·ç¦»è¢«è®¾ä¸ºéžé›¶å€¼ï¼Œä½†ä½ŽäºŽå¼€å§‹è·ç¦»ã€‚\n"
+"è¿™æ„味ç€è¯¥ GeometryInstance3D 将永远ä¸å¯è§ã€‚\n"
+"è¦è§£å†³è¿™ä¸ªé—®é¢˜ï¼Œè¯·å°†ç»“æŸè·ç¦»è®¾ä¸º 0 或设为大于开始è·ç¦»çš„值。"
+
+msgid ""
+"The GeometryInstance3D is configured to fade in smoothly over distance, but "
+"the fade transition distance is set to 0.\n"
+"To resolve this, increase Visibility Range Begin Margin above 0."
+msgstr ""
+"GeometryInstance3D 被é…置为éšè·ç¦»å¹³æ»‘淡入,但淡入过渡è·ç¦»è¢«è®¾ä¸º 0。\n"
+"è¦è§£å†³è¿™ä¸ªé—®é¢˜ï¼Œè¯·å°†å¯è§åº¦èŒƒå›´èµ·å§‹è¾¹è·å¢žåŠ åˆ° 0 以上。"
+
+msgid ""
+"The GeometryInstance3D is configured to fade out smoothly over distance, but "
+"the fade transition distance is set to 0.\n"
+"To resolve this, increase Visibility Range End Margin above 0."
+msgstr ""
+"GeometryInstance3D 被é…置为éšè·ç¦»å¹³æ»‘淡出,但淡出过渡è·ç¦»è¢«è®¾ç½®ä¸º 0。\n"
+"è¦è§£å†³è¿™ä¸ªé—®é¢˜ï¼Œè¯·å°†å¯è§åº¦èŒƒå›´ç»“æŸè¾¹è·å¢žåŠ åˆ° 0 以上。"
+
msgid "Plotting Meshes"
msgstr "正在绘制网格"
msgid "Finishing Plot"
msgstr "正在完æˆç»˜åˆ¶"
+msgid "Generating Distance Field"
+msgstr "正在生æˆè·ç¦»åœº"
+
+msgid ""
+"VoxelGIs are not supported by the OpenGL video driver.\n"
+"Use a LightmapGI instead."
+msgstr ""
+"OpenGL 视频驱动ä¸æ”¯æŒ VoxelGI。\n"
+"请改用 LightmapGI。"
+
+msgid ""
+"No VoxelGI data set, so this node is disabled. Bake static objects to enable "
+"GI."
+msgstr "没有 VoxelGI æ•°æ®é›†ï¼Œæ‰€ä»¥è¿™ä¸ªèŠ‚点已ç¦ç”¨ã€‚è¦å¯ç”¨ GI,请烘焙é™æ€å¯¹è±¡ã€‚"
+
+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 ""
+"Only one WorldEnvironment is allowed per scene (or set of instantiated "
+"scenes)."
+msgstr "æ¯ä¸ªåœºæ™¯ä¸­åªå…许有一个 WorldEnvironment(å«å®žä¾‹åŒ–的场景)。"
+
+msgid "XRCamera3D must have an XROrigin3D node as its parent."
+msgstr "XRCamera3D 必须将 XROrigin3D 节点作为其父节点。"
+
+msgid "XRController3D must have an XROrigin3D node as its parent."
+msgstr "XRController3D 必须将 XROrigin3D 节点作为其父节点。"
+
+msgid "No tracker name is set."
+msgstr "未设置追踪器å称。"
+
+msgid "No pose is set."
+msgstr "未设置姿势。"
+
+msgid "XROrigin3D requires an XRCamera3D child node."
+msgstr "XROrigin3D éœ€è¦ XRCamera3D å­èŠ‚点。"
+
+msgid ""
+"XR is not enabled in rendering project settings. Stereoscopic output is not "
+"supported unless this is enabled."
+msgstr "渲染项目设置中未å¯ç”¨ XR。除éžå¯ç”¨è¯¥åŠŸèƒ½ï¼Œå¦åˆ™ä¸æ”¯æŒç«‹ä½“输出。"
+
msgid "On BlendTree node '%s', animation not found: '%s'"
msgstr "在 BlendTree 节点 “%s†上没有å‘现动画: “%sâ€"
msgid "Animation not found: '%s'"
msgstr "没有动画: “%sâ€"
+msgid "Animation Apply Reset"
+msgstr "动画应用é‡ç½®"
+
msgid "In node '%s', invalid animation: '%s'."
msgstr "在节点 “%s†上的动画无效: “%s†。"
@@ -8805,6 +14419,11 @@ msgid "The AnimationPlayer root node is not a valid node."
msgstr "AnimationPlayer 根节点ä¸æ˜¯æœ‰æ•ˆèŠ‚点。"
msgid ""
+"ButtonGroup is intended to be used only with buttons that have toggle_mode "
+"set to true."
+msgstr "ButtonGroup 的目的是åªç”¨äºŽé‚£äº›å°† toggle_mode 设置为 true 的按钮。"
+
+msgid ""
"Color: #%s\n"
"LMB: Apply color\n"
"RMB: Remove preset"
@@ -8813,9 +14432,22 @@ msgstr ""
"鼠标左键:应用颜色\n"
"é¼ æ ‡å³é”®ï¼šç§»é™¤é¢„设"
+msgid ""
+"Color: #%s\n"
+"LMB: Apply color"
+msgstr ""
+"颜色:#%s\n"
+"鼠标左键:应用颜色"
+
msgid "Pick a color from the editor window."
msgstr "从编辑器窗å£ä¸­é€‰æ‹©ä¸€ç§é¢œè‰²ã€‚"
+msgid "Select a picker shape."
+msgstr "选择选å–器形状。"
+
+msgid "Select a picker mode."
+msgstr "选择选å–器模å¼ã€‚"
+
msgid "Switch between hexadecimal and code values."
msgstr "在å六进制值和代ç å€¼ä¹‹é—´åˆ‡æ¢ã€‚"
@@ -8837,6 +14469,11 @@ msgstr ""
"由于该控件的 Mouse Filter 设置为“Ignoreâ€å› æ­¤å°†ä¸ä¼šæ˜¾ç¤ºé«˜äº®å·¥å…·æ示。将 Mouse "
"Filter 设置为“Stopâ€æˆ–“Passâ€å¯ä¿®æ­£æ­¤é—®é¢˜ã€‚"
+msgid ""
+"Changing the Z index of a control only affects the drawing order, not the "
+"input event handling order."
+msgstr "改å˜æŽ§ä»¶çš„Z索引åªå½±å“绘图顺åºï¼Œä¸å½±å“输入事件的处ç†é¡ºåºã€‚"
+
msgid "Theme Overrides"
msgstr "主题覆盖"
@@ -8846,11 +14483,94 @@ msgstr "警告ï¼"
msgid "Please Confirm..."
msgstr "请确认..."
+msgid "You don't have permission to access contents of this folder."
+msgstr "ä½ æ— æƒè®¿é—®æ­¤æ–‡ä»¶å¤¹çš„内容。"
+
+msgid "All Files"
+msgstr "所有文件"
+
msgid "Must use a valid extension."
msgstr "必须使用有效的扩展å。"
msgid "Enable grid minimap."
-msgstr "å¯ç”¨ç½‘æ ¼å°åœ°å›¾ã€‚"
+msgstr "å¯ç”¨æ …æ ¼å°åœ°å›¾ã€‚"
+
+msgid "Arrange nodes."
+msgstr "排列节点。"
+
+msgid ""
+"The current font does not support rendering one or more characters used in "
+"this Label's text."
+msgstr "当å‰å­—体ä¸æ”¯æŒæ¸²æŸ“该标签文本中使用的一个或多个字符。"
+
+msgid "Same as Layout Direction"
+msgstr "与布局方å‘一致"
+
+msgid "Auto-Detect Direction"
+msgstr "自动检测方å‘"
+
+msgid "Left-to-Right"
+msgstr "从左至å³"
+
+msgid "Right-to-Left"
+msgstr "从å³è‡³å·¦"
+
+msgid "Left-to-Right Mark (LRM)"
+msgstr "从左至å³æ ‡å¿—(LRM)"
+
+msgid "Right-to-Left Mark (RLM)"
+msgstr "从å³è‡³å·¦æ ‡å¿—(RLM)"
+
+msgid "Start of Left-to-Right Embedding (LRE)"
+msgstr "从左到å³åµŒå…¥ (LRE) 的开始"
+
+msgid "Start of Right-to-Left Embedding (RLE)"
+msgstr "开始从å³è‡³å·¦åµŒå…¥ï¼ˆRLE)"
+
+msgid "Start of Left-to-Right Override (LRO)"
+msgstr "开始从左至å³å¼ºåˆ¶ï¼ˆLRO)"
+
+msgid "Start of Right-to-Left Override (RLO)"
+msgstr "开始从å³è‡³å·¦å¼ºåˆ¶ï¼ˆRLO)"
+
+msgid "Pop Direction Formatting (PDF)"
+msgstr "退出方å‘æ ¼å¼åŒ–(PDF)"
+
+msgid "Arabic Letter Mark (ALM)"
+msgstr "阿拉伯字æ¯æ ‡è®°ï¼ˆALM)"
+
+msgid "Left-to-Right Isolate (LRI)"
+msgstr "从左至å³éš”离(LRI)"
+
+msgid "Right-to-Left Isolate (RLI)"
+msgstr "从å³è‡³å·¦éš”离(RLI)"
+
+msgid "First Strong Isolate (FSI)"
+msgstr "第一个强隔离(FSI)"
+
+msgid "Pop Direction Isolate (PDI)"
+msgstr "退出方å‘隔离(PDI)"
+
+msgid "Zero-Width Joiner (ZWJ)"
+msgstr "零宽连接符(ZWJ)"
+
+msgid "Zero-Width Non-Joiner (ZWNJ)"
+msgstr "零宽éžè¿žæŽ¥ç¬¦ï¼ˆZWNJ)"
+
+msgid "Word Joiner (WJ)"
+msgstr "文字连接符(WJ)"
+
+msgid "Soft Hyphen (SHY)"
+msgstr "软连字符(SHY)"
+
+msgid "Text Writing Direction"
+msgstr "文本书写方å‘"
+
+msgid "Display Control Characters"
+msgstr "显示控制字符"
+
+msgid "Insert Control Character"
+msgstr "æ’入控制字符"
msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0."
msgstr "如果å¯ç”¨äº† “Exp Editâ€ï¼Œåˆ™ “Min Value†必须大于 0。"
@@ -8864,15 +14584,61 @@ msgstr ""
"å­èŠ‚点应该是å•ä¸ªå®¹å™¨ï¼ˆVBoxã€HBox 等)或者使用å•ä¸ªæŽ§ä»¶å¹¶æ‰‹åŠ¨è®¾ç½®å…¶è‡ªå®šä¹‰æœ€å°å°º"
"寸。"
+msgid ""
+"This node doesn't have a SubViewport as child, so it can't display its "
+"intended content.\n"
+"Consider adding a SubViewport as a child to provide something displayable."
+msgstr ""
+"这个节点没有 SubViewport å­èŠ‚点,所以无法显示预期的内容。\n"
+"请考虑添加一个 SubViewport 作为å­èŠ‚点,æ¥æä¾›å¯æ˜¾ç¤ºçš„内容。"
+
msgid "(Other)"
msgstr "(其他)"
msgid ""
+"This node was saved as class type '%s', which was no longer available when "
+"this scene was loaded."
+msgstr "该节点被ä¿å­˜ä¸ºâ€œ%sâ€ç±»åž‹ï¼Œå½“这个场景被加载时,它ä¸å†å¯ç”¨ã€‚"
+
+msgid ""
+"Data from the original node is kept as a placeholder until this type of node "
+"is available again. It can hence be safely re-saved without risk of data "
+"loss."
+msgstr ""
+"原始节点中的数æ®å°†ä¿ç•™ä¸ºå ä½ç¬¦ï¼Œç›´åˆ°æ­¤ç±»åž‹çš„节点å†æ¬¡å¯ç”¨ã€‚因此,它å¯ä»¥å®‰å…¨åœ°"
+"é‡æ–°ä¿å­˜ï¼Œè€Œä¸ä¼šæœ‰æ•°æ®ä¸¢å¤±çš„风险。"
+
+msgid ""
+"Setting node name '%s' to be unique within scene for '%s', but it's already "
+"claimed by '%s'.\n"
+"'%s' is no longer set as having a unique name."
+msgstr ""
+"正在将场景中的唯一节点å称“%sâ€è®¾ç»™â€œ%sâ€ï¼Œä½†è¯¥å称已被“%sâ€å ç”¨ã€‚\n"
+"“%sâ€ä¸å†è®¾ç½®ä¸ºå…·æœ‰å”¯ä¸€å称。"
+
+msgid ""
+"This node is marked as deprecated and will be removed in future versions.\n"
+"Please check the Godot documentation for information about migration."
+msgstr ""
+"此节点标记为已弃用,会在将æ¥çš„版本中移除。\n"
+"请查看 Godot 文档中关于è¿ç§»çš„ä¿¡æ¯ã€‚"
+
+msgid ""
+"This node is marked as experimental and may be subject to removal or major "
+"changes in future versions."
+msgstr "此节点标记为实验性节点,å¯èƒ½ä¼šåœ¨å°†æ¥çš„版本中删除或进行é‡å¤§æ›´æ”¹ã€‚"
+
+msgid ""
"Default Environment as specified in Project Settings (Rendering -> "
"Environment -> Default Environment) could not be loaded."
msgstr "无法加载项目设置中的默认环境(渲染 -> 环境 -> 默认环境)。"
msgid ""
+"ShaderGlobalsOverride is not active because another node of the same type is "
+"in the scene."
+msgstr "ShaderGlobalsOverride 未激活,因为场景中存在å¦ä¸€ä¸ªç›¸åŒç±»åž‹çš„节点。"
+
+msgid ""
"Very low timer wait times (< 0.05 seconds) may behave in significantly "
"different ways depending on the rendered or physics frame rate.\n"
"Consider using a script's process loop instead of relying on a Timer for "
@@ -8887,6 +14653,51 @@ msgid ""
"dimensions to render anything."
msgstr "Viewport 的宽高都大于等于 2 åƒç´ æ—¶æ‰èƒ½è¿›è¡Œæ¸²æŸ“。"
+msgid "Cannot open font from file: %s."
+msgstr "无法打开字体文件:%s。"
+
+msgid "Version %d of BMFont is not supported (should be 3)."
+msgstr "ä¸æ”¯æŒç‰ˆæœ¬ä¸º %d çš„ BMFont(应该是3)。"
+
+msgid "Invalid BMFont info block size."
+msgstr "无效的 BMFont ä¿¡æ¯å—大å°ã€‚"
+
+msgid "Invalid BMFont common block size."
+msgstr "无效的 BMFont 公共å—大å°ã€‚"
+
+msgid "Can't load font texture: %s."
+msgstr "无法加载字体纹ç†ï¼š%s。"
+
+msgid "Unsupported BMFont texture format."
+msgstr "ä¸æ”¯æŒçš„ BMFont 纹ç†æ ¼å¼ã€‚"
+
+msgid "Invalid BMFont block type."
+msgstr "无效的 BMFont å—类型。"
+
+msgid ""
+"Shader keywords cannot be used as parameter names.\n"
+"Choose another name."
+msgstr ""
+"ç€è‰²å™¨å…³é”®å­—ä¸èƒ½ç”¨ä½œå‚æ•°å称。\n"
+"请选择其他å称。"
+
+msgid "This parameter type does not support the '%s' qualifier."
+msgstr "该å‚数类型ä¸æ”¯æŒâ€œ%sâ€é™å®šç¬¦ã€‚"
+
+msgid ""
+"Global parameter '%s' does not exist.\n"
+"Create it in the Project Settings."
+msgstr ""
+"全局å‚数“%sâ€ä¸å­˜åœ¨ã€‚\n"
+"在项目设置中创建它。"
+
+msgid ""
+"Global parameter '%s' has an incompatible type for this kind of node.\n"
+"Change it in the Project Settings."
+msgstr ""
+"全局å‚数“%sâ€å…·æœ‰ä¸Žæ­¤ç±»èŠ‚点ä¸å…¼å®¹çš„类型。\n"
+"在项目设置中改å˜å®ƒã€‚"
+
msgid ""
"The sampler port is connected but not used. Consider changing the source to "
"'SamplerPort'."
@@ -8898,6 +14709,9 @@ msgstr "预览的æºèµ„æºæ— æ•ˆã€‚"
msgid "Invalid source for shader."
msgstr "ç€è‰²å™¨çš„æºèµ„æºæ— æ•ˆã€‚"
+msgid "Invalid operator for that type."
+msgstr "è¿ç®—符对该类型无效。"
+
msgid "Default Color"
msgstr "默认颜色"
@@ -8910,14 +14724,660 @@ msgstr "é‡å¤"
msgid "Invalid comparison function for that type."
msgstr "该类型的比较功能无效。"
+msgid "2D Mode"
+msgstr "2D 模å¼"
+
+msgid "Use All Surfaces"
+msgstr "使用所有表é¢"
+
+msgid "Surface Index"
+msgstr "表é¢ç´¢å¼•"
+
+msgid ""
+"Invalid number of arguments when calling stage function '%s', which expects "
+"%d arguments."
+msgstr "调用阶段函数“%sâ€æ—¶å‚æ•°æ•°é‡æ— æ•ˆï¼Œé¢„期为 %d 个å‚数。"
+
+msgid ""
+"Invalid argument type when calling stage function '%s', type expected is "
+"'%s'."
+msgstr "调用阶段函数“%sâ€æ—¶å‚数类型无效,预期类型为“%sâ€ã€‚"
+
+msgid "Expected integer constant within [%d..%d] range."
+msgstr "预期为 [%d..%d] 范围内的整数常é‡ã€‚"
+
+msgid "Argument %d of function '%s' is not a variable, array, or member."
+msgstr "å‚æ•° %d ä¸æ˜¯å˜é‡ã€æ•°ç»„ã€æˆå‘˜ï¼Œå‡½æ•°ä¸ºâ€œ%sâ€ã€‚"
+
+msgid "Varyings cannot be passed for the '%s' parameter."
+msgstr "Varying ä¸èƒ½ä¼ ç»™â€œ%sâ€å‚数。"
+
+msgid "A constant value cannot be passed for the '%s' parameter."
+msgstr "常é‡å€¼ä¸èƒ½ä¼ ç»™â€œ%sâ€å‚数。"
+
+msgid ""
+"Argument %d of function '%s' can only take a local variable, array, or "
+"member."
+msgstr "å‚æ•° %d åªèƒ½æŽ¥å—å˜é‡ã€æ•°ç»„ã€æˆå‘˜ï¼Œå‡½æ•°ä¸ºâ€œ%sâ€ã€‚"
+
+msgid "Built-in function \"%s(%s)\" is only supported on high-end platforms."
+msgstr "内置函数“%s(%s)â€åªåœ¨é«˜ç«¯å¹³å°ä¸Šæ”¯æŒã€‚"
+
+msgid "Invalid arguments for the built-in function: \"%s(%s)\"."
+msgstr "内置函数的å‚数无效:“%s(%s)â€ã€‚"
+
+msgid "Recursion is not allowed."
+msgstr "ä¸å…许递归。"
+
+msgid "Function '%s' can't be called from source code."
+msgstr "函数“%sâ€ä¸èƒ½ä»Žæºä»£ç ä¸­è°ƒç”¨ã€‚"
+
+msgid ""
+"Invalid argument for \"%s(%s)\" function: argument %d should be %s but is %s."
+msgstr "“%s(%s)â€å‡½æ•°çš„å‚数无效:å‚æ•° %d 应该是 %s 但实际上是 %s。"
+
+msgid ""
+"Too few arguments for \"%s(%s)\" call. Expected at least %d but received %d."
+msgstr "“%s(%s)â€è°ƒç”¨çš„å‚数太少。预计至少 %d 个,但收到 %d 个。"
+
+msgid ""
+"Too many arguments for \"%s(%s)\" call. Expected at most %d but received %d."
+msgstr "“%s(%s)â€è°ƒç”¨çš„å‚数太多。预计至多 %d 个,但收到 %d 个。"
+
+msgid "Invalid assignment of '%s' to '%s'."
+msgstr "将“%sâ€åˆ†é…给“%sâ€æ— æ•ˆã€‚"
+
+msgid "Expected constant expression."
+msgstr "预期为常é‡è¡¨è¾¾å¼ã€‚"
+
+msgid "Expected ',' or ')' after argument."
+msgstr "å‚æ•°åŽæœŸæœ›æœ‰â€œ,â€æˆ–“)â€ã€‚"
+
msgid "Varying may not be assigned in the '%s' function."
msgstr "Varying ä¸èƒ½åœ¨â€œ%sâ€å‡½æ•°ä¸­èµ‹å€¼ã€‚"
+msgid ""
+"Varying with '%s' data type may only be assigned in the 'fragment' function."
+msgstr "æ•°æ®ç±»åž‹ä¸ºâ€œ%sâ€çš„ Varying åªèƒ½åœ¨â€œfragmentâ€å‡½æ•°ä¸­è¢«èµ‹å€¼ã€‚"
+
+msgid ""
+"Varyings which assigned in 'vertex' function may not be reassigned in "
+"'fragment' or 'light'."
+msgstr "已在“vertexâ€å‡½æ•°ä¸­èµ‹å€¼çš„ varying ä¸èƒ½åœ¨â€œfragmentâ€æˆ–“lightâ€ä¸­é‡æ–°èµ‹å€¼ã€‚"
+
+msgid ""
+"Varyings which assigned in 'fragment' function may not be reassigned in "
+"'vertex' or 'light'."
+msgstr "已在“fragmentâ€å‡½æ•°ä¸­èµ‹å€¼çš„ varying ä¸èƒ½åœ¨â€œvertexâ€æˆ–“lightâ€ä¸­é‡æ–°èµ‹å€¼ã€‚"
+
msgid "Assignment to function."
msgstr "对函数的赋值。"
+msgid "Swizzling assignment contains duplicates."
+msgstr "Swizzling 赋值包å«é‡å¤é¡¹ã€‚"
+
msgid "Assignment to uniform."
msgstr "对 Uniform 的赋值。"
msgid "Constants cannot be modified."
msgstr "ä¸å…许修改常é‡ã€‚"
+
+msgid ""
+"Sampler argument %d of function '%s' called more than once using both built-"
+"ins and uniform textures, this is not supported (use either one or the "
+"other)."
+msgstr ""
+"采样器å‚æ•° %d:函数“%sâ€æœ‰å¤šæ¬¡è°ƒç”¨ï¼ŒåŒæ—¶ä½¿ç”¨äº†å†…置和 uniform 纹ç†ï¼Œä¸æ”¯æŒè¿™ç§"
+"用法(请在其中选择一ç§ä½¿ç”¨ï¼‰ã€‚"
+
+msgid ""
+"Sampler argument %d of function '%s' called more than once using textures "
+"that differ in either filter or repeat setting."
+msgstr "采样器å‚æ•° %d:函数“%sâ€æœ‰å¤šæ¬¡è°ƒç”¨ï¼Œæ‰€ä½¿ç”¨çº¹ç†çš„过滤或é‡å¤è®¾ç½®ä¸åŒã€‚"
+
+msgid ""
+"Sampler argument %d of function '%s' called more than once using different "
+"built-ins. Only calling with the same built-in is supported."
+msgstr ""
+"采样器å‚æ•° %d:函数“%sâ€æœ‰å¤šæ¬¡è°ƒç”¨ï¼Œä½¿ç”¨çš„内置ä¸åŒã€‚仅支æŒä½¿ç”¨ç›¸åŒçš„内置进行调"
+"用。"
+
+msgid "Array size is already defined."
+msgstr "数组大å°å·²å®šä¹‰ã€‚"
+
+msgid "Unknown array size is forbidden in that context."
+msgstr "该上下文中ç¦æ­¢æœªçŸ¥æ•°ç»„大å°ã€‚"
+
+msgid "Array size expressions are not supported."
+msgstr "ä¸æ”¯æŒæ•°ç»„大å°è¡¨è¾¾å¼ã€‚"
+
+msgid "Expected a positive integer constant."
+msgstr "预期为正整数常é‡ã€‚"
+
+msgid "Invalid data type for the array."
+msgstr "数组的数æ®ç±»åž‹æ— æ•ˆã€‚"
+
+msgid "Array size mismatch."
+msgstr "数组大å°ä¸åŒ¹é…。"
+
+msgid "Expected array initialization."
+msgstr "预期为数组åˆå§‹åŒ–。"
+
+msgid "Cannot convert from '%s' to '%s'."
+msgstr "无法从“%sâ€è½¬æ¢ä¸ºâ€œ%sâ€ã€‚"
+
+msgid "Expected ')' in expression."
+msgstr "表达å¼ä¸­éœ€è¦â€œ)â€ã€‚"
+
+msgid "Void value not allowed in expression."
+msgstr "表达å¼ä¸­ä¸å…许有空值。"
+
+msgid "Expected '(' after the type name."
+msgstr "类型å称åŽé¢„期为“(â€ã€‚"
+
+msgid "No matching constructor found for: '%s'."
+msgstr "没有找到匹é…的构造函数:“%sâ€ã€‚"
+
+msgid "Expected a function name."
+msgstr "预期为函数å称。"
+
+msgid "No matching function found for: '%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 "A constant value cannot be passed for '%s' parameter."
+msgstr "常é‡å€¼ä¸èƒ½ä½œä¸ºâ€œ%sâ€å‚数传递。"
+
+msgid "Unknown identifier in expression: '%s'."
+msgstr "表达å¼ä¸­çš„标识符未知:“%sâ€ã€‚"
+
+msgid ""
+"%s has been removed in favor of using hint_%s with a uniform.\n"
+"To continue with minimal code changes add 'uniform sampler2D %s : hint_%s, "
+"filter_linear_mipmap;' near the top of your shader."
+msgstr ""
+"%s 已被移除,请改用 hint_%s 和 uniform。\n"
+"为了ä¿æŒæœ€å°çš„代ç æ”¹åŠ¨ï¼Œä½ å¯ä»¥åœ¨ç€è‰²å™¨é¡¶éƒ¨é™„近添加“uniform sampler2D %s : "
+"hint_%s, filter_linear_mipmap;â€ã€‚"
+
+msgid ""
+"Varying with '%s' data type may only be used in the 'fragment' function."
+msgstr "æ•°æ®ç±»åž‹ä¸ºâ€œ%sâ€çš„ Varying ä¸èƒ½åœ¨â€œfragmentâ€å‡½æ•°ä¸­ä½¿ç”¨ã€‚"
+
+msgid "Varying '%s' must be assigned in the 'fragment' function first."
+msgstr "Varying“%sâ€å¿…须先在“fragmentâ€å‡½æ•°ä¸­èµ‹å€¼ã€‚"
+
+msgid ""
+"Varying with integer data type must be declared with `flat` interpolation "
+"qualifier."
+msgstr "æ•´æ•°æ•°æ®ç±»åž‹çš„ Varying 必须使用 `flat` æ’值修饰符声明。"
+
+msgid "Can't use function as identifier: '%s'."
+msgstr "ä¸èƒ½ä½¿ç”¨å‡½æ•°ä½œä¸ºæ ‡è¯†ç¬¦ï¼šâ€œ%sâ€ã€‚"
+
+msgid "Only integer expressions are allowed for indexing."
+msgstr "åªå…许使用整数表达å¼è¿›è¡Œç´¢å¼•ã€‚"
+
+msgid "Index [%d] out of range [%d..%d]."
+msgstr "索引 [%d] 超出了范围 [%d...%d]。"
+
+msgid "Expected expression, found: '%s'."
+msgstr "预期为表达å¼ï¼Œå‘现:“%sâ€ã€‚"
+
+msgid "Empty statement. Remove ';' to fix this warning."
+msgstr "空语å¥ã€‚ä¿®å¤æ­¤è­¦å‘Šè¯·ç§»é™¤â€œ;â€ã€‚"
+
+msgid "Expected an identifier as a member."
+msgstr "预期为æˆå‘˜æ ‡è¯†ç¬¦ã€‚"
+
+msgid "Cannot combine symbols from different sets in expression '.%s'."
+msgstr "“.%sâ€è¡¨è¾¾å¼ä¸­ä¸èƒ½åˆå¹¶ä¸åŒé›†åˆä¸­çš„符å·ã€‚"
+
+msgid "Invalid member for '%s' expression: '.%s'."
+msgstr "“%sâ€è¡¨è¾¾å¼çš„æˆå‘˜æ— æ•ˆï¼šâ€œ.%sâ€ã€‚"
+
+msgid "An object of type '%s' can't be indexed."
+msgstr "类型为“%sâ€çš„对象ä¸èƒ½è¢«ç´¢å¼•ã€‚"
+
+msgid "Invalid base type for increment/decrement operator."
+msgstr "递增/递å‡è¿ç®—符的基础类型无效。"
+
+msgid "Invalid use of increment/decrement operator in a constant expression."
+msgstr "在常é‡è¡¨è¾¾å¼ä¸­ä½¿ç”¨é€’增/递å‡è¿ç®—符无效。"
+
+msgid "Invalid token for the operator: '%s'."
+msgstr "è¿ç®—符标记无效:“%sâ€ã€‚"
+
+msgid "Unexpected end of expression."
+msgstr "表达å¼æ„外结æŸã€‚"
+
+msgid "Invalid arguments to unary operator '%s': %s."
+msgstr "一元è¿ç®—符“%sâ€çš„å‚数无效:%s。"
+
+msgid "Missing matching ':' for select operator."
+msgstr "选择è¿ç®—符缺少匹é…的“:â€ã€‚"
+
+msgid "Invalid argument to ternary operator: '%s'."
+msgstr "三元è¿ç®—符的å‚数无效:“%sâ€ã€‚"
+
+msgid "Invalid arguments to operator '%s': '%s'."
+msgstr "è¿ç®—符“%sâ€çš„å‚数无效:“%sâ€ã€‚"
+
+msgid "A switch may only contain '%s' and '%s' blocks."
+msgstr "switch åªèƒ½åŒ…å«â€œ%sâ€å’Œâ€œ%sâ€å—。"
+
+msgid "Expected variable type after precision modifier."
+msgstr "精度修饰符åŽé¢„期为å˜é‡ç±»åž‹ã€‚"
+
+msgid "Invalid variable type (samplers are not allowed)."
+msgstr "无效的å˜é‡ç±»åž‹ï¼ˆä¸å…许使用采样器)。"
+
+msgid "Expected an identifier or '[' after type."
+msgstr "类型åŽé¢„期为标识符或“[â€ã€‚"
+
+msgid "Expected an identifier."
+msgstr "预期为标识符。"
+
+msgid "Expected array initializer."
+msgstr "预期为数组åˆå§‹åŒ–器。"
+
+msgid "Expected data type after precision modifier."
+msgstr "精度修饰符åŽé¢„期为数æ®ç±»åž‹ã€‚"
+
+msgid "Expected a constant expression."
+msgstr "预期为常é‡è¡¨è¾¾å¼ã€‚"
+
+msgid "Expected initialization of constant."
+msgstr "预期为常é‡çš„åˆå§‹åŒ–。"
+
+msgid ""
+"Expected constant expression for argument %d of function call after '='."
+msgstr "“=â€åŽé¢„期为函数调用å‚æ•° %d 的常é‡è¡¨è¾¾å¼ã€‚"
+
+msgid "Expected a boolean expression."
+msgstr "预期为布尔表达å¼ã€‚"
+
+msgid "Expected an integer expression."
+msgstr "预期为整数表达å¼ã€‚"
+
+msgid "Cases must be defined before default case."
+msgstr "必须在默认 case å‰å®šä¹‰å…¶ä»– case。"
+
+msgid "Default case must be defined only once."
+msgstr "默认 case å¿…é¡»åªå®šä¹‰ä¸€æ¬¡ã€‚"
+
+msgid "Duplicated case label: %d."
+msgstr "é‡å¤çš„ case 标签:%d。"
+
+msgid "'%s' must be placed within a '%s' block."
+msgstr "“%sâ€å¿…须放在“%sâ€å—内。"
+
+msgid "Expected an integer constant."
+msgstr "预期为整数常é‡ã€‚"
+
+msgid "Using '%s' in the '%s' processor function is incorrect."
+msgstr "“%sâ€åœ¨â€œ%sâ€å¤„ç†å™¨å‡½æ•°ä¸­çš„使用ä¸æ­£ç¡®ã€‚"
+
+msgid "Expected '%s' with an expression of type '%s'."
+msgstr "预期为“%sâ€ï¼Œæ˜¯ç±»åž‹ä¸ºâ€œ%sâ€çš„表达å¼ã€‚"
+
+msgid "Expected return with an expression of type '%s'."
+msgstr "预期为返回类型为“%sâ€çš„表达å¼ã€‚"
+
+msgid "Use of '%s' is not allowed here."
+msgstr "此处ä¸å…许使用“%sâ€ã€‚"
+
+msgid "'%s' is not allowed outside of a loop or '%s' statement."
+msgstr "循环和“%sâ€è¯­å¥ä¹‹å¤–ä¸å…许“%sâ€ã€‚"
+
+msgid "'%s' is not allowed outside of a loop."
+msgstr "循环之外ä¸å…许“%sâ€ã€‚"
+
+msgid "The middle expression is expected to be a boolean operator."
+msgstr "中间的表达å¼é¢„期为布尔è¿ç®—符。"
+
+msgid "The left expression is expected to be a variable declaration."
+msgstr "左侧的表达å¼é¢„期为å˜é‡å£°æ˜Žã€‚"
+
+msgid "The precision modifier cannot be used on structs."
+msgstr "精度修饰符ä¸èƒ½ç”¨äºŽç»“构体。"
+
+msgid "The precision modifier cannot be used on boolean types."
+msgstr "精度修饰符ä¸èƒ½ç”¨äºŽå¸ƒå°”类型。"
+
+msgid "Expected '%s' at the beginning of shader. Valid types are: %s."
+msgstr "ç€è‰²å™¨å¼€å¤´é¢„期为“%sâ€ã€‚有效的类型有:%s。"
+
+msgid ""
+"Expected an identifier after '%s', indicating the type of shader. Valid "
+"types are: %s."
+msgstr "“%sâ€åŽé¢„期为标识符,表明ç€è‰²å™¨çš„类型。有效的类型有:%s。"
+
+msgid "Invalid shader type. Valid types are: %s"
+msgstr "无效的ç€è‰²å™¨ç±»åž‹ã€‚有效的类型有:%s"
+
+msgid "Expected an identifier for render mode."
+msgstr "预期为渲染模å¼æ ‡è¯†ç¬¦ã€‚"
+
+msgid "Duplicated render mode: '%s'."
+msgstr "é‡å¤çš„渲染模å¼ï¼šâ€œ%sâ€ã€‚"
+
+msgid ""
+"Redefinition of render mode: '%s'. The '%s' mode has already been set to "
+"'%s'."
+msgstr "渲染模å¼â€œ%sâ€é‡å®šä¹‰ã€‚“%sâ€æ¨¡å¼å·²ç»è¢«è®¾ç½®ä¸ºâ€œ%sâ€ã€‚"
+
+msgid "Invalid render mode: '%s'."
+msgstr "无效的渲染模å¼ï¼šâ€œ%sâ€ã€‚"
+
+msgid "Unexpected token: '%s'."
+msgstr "æ„外的标记:“%sâ€ã€‚"
+
+msgid "Expected a struct identifier."
+msgstr "预期为结构体标识符。"
+
+msgid "Nested structs are not allowed."
+msgstr "ä¸å…许嵌套结构。"
+
+msgid "Expected data type."
+msgstr "预期的数æ®ç±»åž‹ã€‚"
+
+msgid "A '%s' data type is not allowed here."
+msgstr "这里ä¸å…许“%sâ€æ•°æ®ç±»åž‹ã€‚"
+
+msgid "Expected an identifier or '['."
+msgstr "预期为标识符或“[â€ã€‚"
+
+msgid "Empty structs are not allowed."
+msgstr "ä¸å…许空结构体。"
+
+msgid "Uniform instances are not yet implemented for '%s' shaders."
+msgstr "“%sâ€ç€è‰²å™¨å°šæœªå®žçŽ° uniform 实例。"
+
+msgid "Varyings cannot be used in '%s' shaders."
+msgstr "Varying ä¸èƒ½åœ¨â€œ%sâ€ç€è‰²å™¨ä¸­ä½¿ç”¨ã€‚"
+
+msgid "Interpolation qualifiers are not supported for uniforms."
+msgstr "Uniform ä¸æ”¯æŒæ’值修饰符。"
+
+msgid "The '%s' data type is not supported for uniforms."
+msgstr "Uniform ä¸æ”¯æŒâ€œ%sâ€æ•°æ®ç±»åž‹ã€‚"
+
+msgid "The '%s' data type is not allowed here."
+msgstr "这里ä¸å…许使用“%sâ€æ•°æ®ç±»åž‹ã€‚"
+
+msgid "Interpolation modifier '%s' cannot be used with boolean types."
+msgstr "æ’值修饰符“%sâ€ä¸èƒ½ç”¨äºŽå¸ƒå°”类型。"
+
+msgid "Invalid data type for varying."
+msgstr "Varying çš„æ•°æ®ç±»åž‹æ— æ•ˆã€‚"
+
+msgid "Global uniform '%s' does not exist. Create it in Project Settings."
+msgstr "全局 uniform“%sâ€ä¸å­˜åœ¨ã€‚请在项目设置中创建。"
+
+msgid "Global uniform '%s' must be of type '%s'."
+msgstr "全局 uniform“%sâ€çš„类型必须为“%sâ€ã€‚"
+
+msgid "The '%s' qualifier is not supported for sampler types."
+msgstr "采样器类型ä¸æ”¯æŒâ€œ%sâ€ä¿®é¥°ç¬¦ã€‚"
+
+msgid "The '%s' qualifier is not supported for matrix types."
+msgstr "矩阵类型ä¸æ”¯æŒâ€œ%sâ€ä¿®é¥°ç¬¦ã€‚"
+
+msgid "The '%s' qualifier is not supported for uniform arrays."
+msgstr "Uniform æ•°æ®ä¸æ”¯æŒâ€œ%sâ€ä¿®é¥°ç¬¦ã€‚"
+
+msgid "Expected valid type hint after ':'."
+msgstr "“:â€åŽé¢„期为有效的类型æ示。"
+
+msgid "This hint is not supported for uniform arrays."
+msgstr "这个æ示ä¸æ”¯æŒ uniform 数组。"
+
+msgid "Source color hint is for '%s', '%s' or sampler types only."
+msgstr "æºç é¢œè‰²æ示仅适用于“%sâ€â€œ%sâ€æˆ–采样器类型。"
+
+msgid "Duplicated hint: '%s'."
+msgstr "é‡å¤çš„æ示:“%sâ€ã€‚"
+
+msgid "Range hint is for '%s' and '%s' only."
+msgstr "范围æ示仅适用于“%sâ€å’Œâ€œ%sâ€ã€‚"
+
+msgid "Expected ',' after integer constant."
+msgstr "整数常é‡åŽé¢„期为“,â€ã€‚"
+
+msgid "Expected an integer constant after ','."
+msgstr "“,â€åŽé¢„期为整数常é‡ã€‚"
+
+msgid "Can only specify '%s' once."
+msgstr "åªèƒ½æŒ‡å®šä¸€æ¬¡â€œ%sâ€ã€‚"
+
+msgid "The instance index can't be negative."
+msgstr "实例索引ä¸èƒ½ä¸ºè´Ÿã€‚"
+
+msgid "Allowed instance uniform indices must be within [0..%d] range."
+msgstr "实例 uniform 索引必须在 [0...%d] 范围内。"
+
+msgid "This hint is only for sampler types."
+msgstr "这个æ示仅适用于采样器类型。"
+
+msgid "Redefinition of hint: '%s'. The hint has already been set to '%s'."
+msgstr "æ示é‡å®šä¹‰ï¼šâ€œ%sâ€ã€‚æ示已被设为“%sâ€ã€‚"
+
+msgid "Duplicated filter mode: '%s'."
+msgstr "é‡å¤çš„过滤器模å¼ï¼šâ€œ%sâ€ã€‚"
+
+msgid ""
+"Redefinition of filter mode: '%s'. The filter mode has already been set to "
+"'%s'."
+msgstr "过滤模å¼é‡å®šä¹‰ï¼šâ€œ%sâ€ã€‚过滤模å¼å·²è¢«è®¾ä¸ºâ€œ%sâ€ã€‚"
+
+msgid "Duplicated repeat mode: '%s'."
+msgstr "é‡å¤çš„é‡å¤æ¨¡å¼ï¼šâ€œ%sâ€ã€‚"
+
+msgid ""
+"Redefinition of repeat mode: '%s'. The repeat mode has already been set to "
+"'%s'."
+msgstr "é‡å¤æ¨¡å¼é‡å®šä¹‰ï¼šâ€œ%sâ€ã€‚é‡å¤æ¨¡å¼å·²è¢«è®¾ä¸ºâ€œ%sâ€ã€‚"
+
+msgid "Too many '%s' uniforms in shader, maximum supported is %d."
+msgstr "ç€è‰²å™¨ä¸­çš„“%sâ€uniform 太多,最大支æŒé‡ä¸º %d 个。"
+
+msgid "Setting default values to uniform arrays is not supported."
+msgstr "ä¸æ”¯æŒä¸º uniform 数组设置默认值。"
+
+msgid "Expected constant expression after '='."
+msgstr "“=â€åŽé¢„期为常é‡è¡¨è¾¾å¼ã€‚"
+
+msgid "Can't convert constant to '%s'."
+msgstr "无法将常é‡è½¬æ¢ä¸ºâ€œ%sâ€ã€‚"
+
+msgid "Expected an uniform subgroup identifier."
+msgstr "预期为 uniform å­åˆ†ç»„标识符。"
+
+msgid "Expected an uniform group identifier."
+msgstr "预期为 uniform 分组标识符。"
+
+msgid "Expected an uniform group identifier or `;`."
+msgstr "预期为 uniform 分组标识符或 `;`。"
+
+msgid "Group needs to be opened before."
+msgstr "分组需è¦åœ¨æ­¤ä¹‹å‰æ‰“开。"
+
+msgid "Shader type is already defined."
+msgstr "ç€è‰²å™¨ç±»åž‹å·²å®šä¹‰ã€‚"
+
+msgid "Expected constant, function, uniform or varying."
+msgstr "预期为常é‡ã€å‡½æ•°ã€uniform 或 varying。"
+
+msgid "Invalid constant type (samplers are not allowed)."
+msgstr "无效的常é‡ç±»åž‹ï¼ˆä¸å…许使用采样器)。"
+
+msgid "Invalid function type (samplers are not allowed)."
+msgstr "无效的函数类型(ä¸å…许使用采样器)。"
+
+msgid "Expected a function name after type."
+msgstr "类型åŽé¢„期为函数å。"
+
+msgid "Expected '(' after function identifier."
+msgstr "函数标识符åŽé¢„期为“(â€ã€‚"
+
+msgid ""
+"Global non-constant variables are not supported. Expected '%s' keyword "
+"before constant definition."
+msgstr "ä¸æ”¯æŒå…¨å±€éžå¸¸é‡å˜é‡ã€‚常é‡å®šä¹‰å‰é¢„期为“%sâ€å…³é”®å­—。"
+
+msgid "Expected an identifier after type."
+msgstr "类型åŽé¢„期为标识符。"
+
+msgid ""
+"The '%s' qualifier cannot be used within a function parameter declared with "
+"'%s'."
+msgstr "“%sâ€ä¿®é¥°ç¬¦ä¸èƒ½ç”¨äºŽå£°æ˜Žä¸ºâ€œ%sâ€çš„函数å‚数。"
+
+msgid "Expected a valid data type for argument."
+msgstr "å‚数预期为有效的数æ®ç±»åž‹ã€‚"
+
+msgid "Opaque types cannot be output parameters."
+msgstr "ä¸é€æ˜Žç±»åž‹ä¸èƒ½ä½œä¸ºè¾“出å‚数。"
+
+msgid "Void type not allowed as argument."
+msgstr "ä¸å…许将 void 类型作为å‚数。"
+
+msgid "Expected an identifier for argument name."
+msgstr "å‚æ•°å称预期为标识符。"
+
+msgid "Function '%s' expects no arguments."
+msgstr "函数“%sâ€é¢„期没有å‚数。"
+
+msgid "Function '%s' must be of '%s' return type."
+msgstr "函数“%sâ€çš„返回类型必须为“%sâ€ã€‚"
+
+msgid "Expected a '{' to begin function."
+msgstr "函数开头预期为“{â€ã€‚"
+
+msgid "Expected at least one '%s' statement in a non-void function."
+msgstr "éž void 函数中预期至少有一æ¡â€œ%sâ€è¯­å¥ã€‚"
+
+msgid "uniform buffer"
+msgstr "uniform 缓冲"
+
+msgid "Expected a '%s'."
+msgstr "预期为“%sâ€ã€‚"
+
+msgid "Expected a '%s' or '%s'."
+msgstr "预期为“%sâ€æˆ–“%sâ€ã€‚"
+
+msgid "Expected a '%s' after '%s'."
+msgstr "期望一个“%sâ€ï¼Œåœ¨æ­¤ä¹‹å‰æ˜¯â€œ%sâ€ã€‚"
+
+msgid "Redefinition of '%s'."
+msgstr "é‡å¤å®šä¹‰â€œ%sâ€ã€‚"
+
+msgid "Unknown directive."
+msgstr "未知指令。"
+
+msgid "Invalid macro name."
+msgstr "无效å®å称。"
+
+msgid "Macro redefinition."
+msgstr "å®é‡å®šä¹‰ã€‚"
+
+msgid "Invalid argument name."
+msgstr "å‚æ•°å称无效。"
+
+msgid "Expected a comma in the macro argument list."
+msgstr "希望在å®å‚数列表中添加一个逗å·ã€‚"
+
+msgid "Unmatched elif."
+msgstr "elif 未é…对。"
+
+msgid "Missing condition."
+msgstr "缺少æ¡ä»¶ã€‚"
+
+msgid "Condition evaluation error."
+msgstr "æ¡ä»¶è¯„估错误。"
+
+msgid "Unmatched else."
+msgstr "else 未é…对。"
+
+msgid "Unmatched endif."
+msgstr "endif 未é…对。"
+
+msgid "Invalid ifdef."
+msgstr "无效的 ifdef。"
+
+msgid "Invalid ifndef."
+msgstr "无效的 ifndef。"
+
+msgid ""
+"Shader include load failed. Does the shader include exist? Is there a cyclic "
+"dependency?"
+msgstr "ç€è‰²å™¨å¤´æ–‡ä»¶åŠ è½½å¤±è´¥ã€‚该头文件是å¦å­˜åœ¨ï¼Ÿæ˜¯å¦å­˜åœ¨å¾ªçŽ¯ä¾èµ–?"
+
+msgid "Shader include resource type is wrong."
+msgstr "ç€è‰²å™¨å¤´æ–‡ä»¶çš„资æºç±»åž‹é”™è¯¯ã€‚"
+
+msgid "Cyclic include found."
+msgstr "å‘现循环包å«ã€‚"
+
+msgid "Shader max include depth exceeded."
+msgstr "超出ç€è‰²å™¨æœ€å¤§åŒ…å«æ·±åº¦ã€‚"
+
+msgid "Invalid pragma directive."
+msgstr "无效的 pragma 指令。"
+
+msgid "Invalid undef."
+msgstr "无效的 undef。"
+
+msgid "Macro expansion limit exceeded."
+msgstr "已超出å®å±•å¼€é™åˆ¶ã€‚"
+
+msgid "Invalid macro argument count."
+msgstr "无效的å®å‚数计数。"
+
+msgid "Can't find matching branch directive."
+msgstr "无法找到é…对的分支指令。"
+
+msgid "Invalid symbols placed before directive."
+msgstr "指令å‰æ”¾ç½®çš„符å·æ— æ•ˆã€‚"
+
+msgid "Unmatched conditional statement."
+msgstr "æ¡ä»¶è¯­å¥æœªé…对。"
+
+msgid ""
+"Direct floating-point comparison (this may not evaluate to `true` as you "
+"expect). Instead, use `abs(a - b) < 0.0001` for an approximate but "
+"predictable comparison."
+msgstr ""
+"直接进行浮点比较(å¯èƒ½ä¸ä¼šåƒä½ æœŸæœ›çš„那样得到 `true`)。请改用 `abs(a - b) < "
+"0.0001` 进行近似但å¯é¢„测的比较。"
+
+msgid "The const '%s' is declared but never used."
+msgstr "常é‡â€œ%sâ€å·²å£°æ˜Žï¼Œä½†ä»Žæœªä½¿ç”¨ã€‚"
+
+msgid "The function '%s' is declared but never used."
+msgstr "函数“%sâ€å·²å£°æ˜Žï¼Œä½†ä»Žæœªä½¿ç”¨ã€‚"
+
+msgid "The struct '%s' is declared but never used."
+msgstr "结构体“%sâ€å·²å£°æ˜Žï¼Œä½†ä»Žæœªä½¿ç”¨ã€‚"
+
+msgid "The uniform '%s' is declared but never used."
+msgstr "Uniform“%sâ€å·²å£°æ˜Žï¼Œä½†ä»Žæœªä½¿ç”¨ã€‚"
+
+msgid "The varying '%s' is declared but never used."
+msgstr "Varying“%sâ€å·²å£°æ˜Žï¼Œä½†ä»Žæœªä½¿ç”¨ã€‚"
+
+msgid "The local variable '%s' is declared but never used."
+msgstr "局部å˜é‡â€œ%sâ€å·²å£°æ˜Žï¼Œä½†ä»Žæœªä½¿ç”¨ã€‚"
+
+msgid ""
+"The total size of the %s for this shader on this device has been exceeded "
+"(%d/%d). The shader may not work correctly."
+msgstr ""
+"å·²ç»è¶…出该ç€è‰²å™¨åœ¨æ­¤è®¾å¤‡ä¸Šçš„ %s 的总大å°ï¼ˆ%d/%d)。该ç€è‰²å™¨å¯èƒ½æ— æ³•æ­£å¸¸å·¥ä½œã€‚"
diff --git a/editor/translations/editor/zh_TW.po b/editor/translations/editor/zh_TW.po
index 354ff922ef..2b54cdefcc 100644
--- a/editor/translations/editor/zh_TW.po
+++ b/editor/translations/editor/zh_TW.po
@@ -12,7 +12,7 @@
# Qing <icinriiq@gmail.com>, 2018.
# Sam Pan <sampan66@gmail.com>, 2016.
# ken l <macauhome@gmail.com>, 2018.
-# Eric K <eric900601@gmail.com>, 2019.
+# Eric K <eric900601@gmail.com>, 2019, 2023.
# cnieFIT <dtotncq@gmail.com>, 2019.
# Bluesir Bruce <a5566740293@gmail.com>, 2019, 2020.
# leela <53352@protonmail.com>, 2019.
@@ -39,13 +39,14 @@
# Hugel <qihu@nfschina.com>, 2022.
# nitenook <admin@alterbaum.net>, 2022.
# Edison Lee <edisonlee@edisonlee55.com>, 2023.
+# abcabcc <xmmandxpp@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-01-14 10:06+0000\n"
-"Last-Translator: Edison Lee <edisonlee@edisonlee55.com>\n"
+"PO-Revision-Date: 2023-02-10 10:44+0000\n"
+"Last-Translator: abcabcc <xmmandxpp@outlook.com>\n"
"Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/"
"godot-engine/godot/zh_Hant/>\n"
"Language: zh_TW\n"
@@ -53,11 +54,35 @@ 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.15.1-dev\n"
+"X-Generator: Weblate 4.16-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 "Mouse Wheel Left"
+msgstr "滑鼠滾輪å‘å·¦"
+
+msgid "Mouse Wheel Right"
+msgstr "滑鼠滾輪å‘å³"
+
msgid "Button"
msgstr "按鈕"
@@ -599,6 +624,9 @@ msgstr "自訊號:"
msgid "Scene does not contain any script."
msgstr "場景中無任何腳本。"
+msgid "Select Method"
+msgstr "é¸æ“‡æ–¹æ³•"
+
msgid "Remove"
msgstr "移除"
@@ -654,9 +682,6 @@ msgstr "斷開訊號連接"
msgid "Connect a Signal to a Method"
msgstr "連接訊號至方法"
-msgid "Edit Connection:"
-msgstr "編輯連接內容:"
-
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr "確定è¦åˆ é™¤æ‰€æœ‰ä¾†è‡ªè¨Šè™Ÿã€Œ%sã€çš„連接嗎?"
@@ -800,23 +825,8 @@ msgstr "警告:"
msgid "Error:"
msgstr "錯誤:"
-msgid "C++ Error"
-msgstr "C++ 錯誤"
-
-msgid "C++ Error:"
-msgstr "C++ 錯誤:"
-
-msgid "Source"
-msgstr "來æº"
-
-msgid "C++ Source"
-msgstr "C++ 原始檔"
-
-msgid "Source:"
-msgstr "原始檔:"
-
-msgid "C++ Source:"
-msgstr "C++ 原始檔:"
+msgid "%s Error"
+msgstr "%s 錯誤"
msgid "Stack Trace"
msgstr "堆疊回溯"
@@ -827,6 +837,9 @@ msgstr "複製錯誤"
msgid "Open C++ Source on GitHub"
msgstr "於GitHub開啟C++原始碼"
+msgid "C++ Source"
+msgstr "C++ 原始檔"
+
msgid "Video RAM"
msgstr "視訊記憶體"
@@ -1290,6 +1303,9 @@ msgstr "全域變數"
msgid "Navigation"
msgstr "導航"
+msgid "Vulkan"
+msgstr "Vulkan"
+
msgid "Nodes and Classes:"
msgstr "節點與類別:"
@@ -1767,12 +1783,12 @@ msgstr "顯示所有地å€"
msgid "Show Selected Locales Only"
msgstr "僅顯示é¸å®šçš„地å€"
+msgid "Edit Filters"
+msgstr "編輯篩é¸æ¢ä»¶"
+
msgid "Language:"
msgstr "語言:"
-msgid "Script"
-msgstr "腳本"
-
msgid "Variant"
msgstr "變體"
@@ -2295,22 +2311,6 @@ msgid "Install from file"
msgstr "自檔案安è£"
msgid ""
-"This will set up your project for custom Android builds by installing the "
-"source template to \"res://android/build\".\n"
-"You can then apply modifications and build your own custom APK on export "
-"(adding modules, changing the AndroidManifest.xml, etc.).\n"
-"Note that in order to make custom builds instead of using pre-built APKs, "
-"the \"Use Custom Build\" option should be enabled in the Android export "
-"preset."
-msgstr ""
-"將於「res://android/buildã€å®‰è£åŽŸå§‹æ¨£æ¿ä»¥ç‚ºè©²é …目設定自定 Android 建置樣"
-"æ¿ã€‚\n"
-"輸出時å¯å¥—用修改並建置自定 APK(如新增模組ã€ä¿®æ”¹ AndroidManifest.xml …"
-"等)。\n"
-"請注æ„,若è¦ä½¿ç”¨è‡ªå®šå»ºç½®è€Œéžä½¿ç”¨é å…ˆå»ºç½®ä¹‹ APK,請啟用 Android 匯出é è¨­è¨­å®šä¸­"
-"çš„ [Use Custom Build] é¸é …。"
-
-msgid ""
"The Android build template is already installed in this project and it won't "
"be overwritten.\n"
"Remove the \"res://android/build\" directory manually before attempting this "
@@ -2529,9 +2529,6 @@ msgstr "å¿«æ·éµ"
msgid "Binding"
msgstr "ç¶å®š"
-msgid "%s Error"
-msgstr "%s 錯誤"
-
msgid "All Devices"
msgstr "所有è£ç½®"
@@ -3434,6 +3431,9 @@ msgstr "é¸æ“‡ä¸¦ç§»å‹•é ‚點,使用滑鼠å³éµå»ºç«‹é ‚點。"
msgid "Enable snap and show grid."
msgstr "啟用å¸é™„並顯示網格。"
+msgid "Blend:"
+msgstr "æ··åˆï¼š"
+
msgid "Point"
msgstr "點"
@@ -3476,15 +3476,9 @@ msgstr "刪除頂點與三角形。"
msgid "Generate blend triangles automatically (instead of manually)"
msgstr "自動產生混åˆä¸‰è§’形(而éžæ‰‹å‹•ï¼‰"
-msgid "Blend:"
-msgstr "æ··åˆï¼š"
-
msgid "Parameter Changed:"
msgstr "已更改åƒæ•¸ï¼š"
-msgid "Edit Filters"
-msgstr "編輯篩é¸æ¢ä»¶"
-
msgid "Output node can't be added to the blend tree."
msgstr "輸出節點無法被新增至混åˆæ¨¹ã€‚"
@@ -3601,9 +3595,6 @@ msgstr "自目å‰ä½ç½®é–‹å§‹å€’放所é¸çš„動畫。 (A)"
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "自çµå°¾å€’放所é¸å‹•ç•«ã€‚(Shift+A)"
-msgid "Stop animation playback. (S)"
-msgstr "åœæ­¢æ’­æ”¾å‹•ç•«ã€‚(S)"
-
msgid "Play selected animation from start. (Shift+D)"
msgstr "從頭播放所é¸å‹•ç•«ã€‚(Shift+D)"
@@ -4802,12 +4793,6 @@ msgstr "更改通知器 AABB"
msgid "Change Particles AABB"
msgstr "æ›´æ”¹ç²’å­ AABB"
-msgid "Change Box Shape Extents"
-msgstr "更改框形範åœ"
-
-msgid "Change Probe Extents"
-msgstr "更改探查範åœ"
-
msgid "Change Capsule Shape Radius"
msgstr "更改楕圓形åŠå¾‘"
@@ -5607,6 +5592,9 @@ msgstr "標準"
msgid "Connections to method:"
msgstr "連接至方法:"
+msgid "Source"
+msgstr "來æº"
+
msgid "Target"
msgstr "目標"
@@ -5845,12 +5833,6 @@ msgstr "(空)"
msgid "Animations:"
msgstr "動畫:"
-msgid "Speed:"
-msgstr "速度:"
-
-msgid "Loop"
-msgstr "循環"
-
msgid "Animation Frames:"
msgstr "動畫幀:"
@@ -7210,9 +7192,6 @@ msgstr "新增輸入æ“作"
msgid "Change Action deadzone"
msgstr "修改æ“作盲å€"
-msgid "Add Input Action Event"
-msgstr "新增輸入æ“作事件"
-
msgid "Erase Input Action"
msgstr "清除輸入æ“作"
@@ -7240,9 +7219,6 @@ msgstr "é¸æ“‡å±¬æ€§"
msgid "Select Virtual Method"
msgstr "é¸æ“‡è™›æ“¬æ–¹æ³•"
-msgid "Select Method"
-msgstr "é¸æ“‡æ–¹æ³•"
-
msgid "Batch Rename"
msgstr "批次é‡æ–°å‘½å"
@@ -7986,12 +7962,6 @@ msgstr "無效的 APK Expansion 公鑰。"
msgid "Invalid package name:"
msgstr "無效的套件å稱:"
-msgid "\"Use Custom Build\" must be enabled to use the plugins."
-msgstr "「使用自定建置ã€å¿…須啟用以使用本外掛。"
-
-msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled."
-msgstr "「Export AABã€åƒ…於「Use Custom Buildã€å•Ÿç”¨æ™‚å¯ç”¨ã€‚"
-
msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid."
msgstr "ã€Œæœ€å° SDKã€æ‡‰ç‚ºæœ‰æ•ˆæ•´æ•¸ï¼Œä½†ç›®å‰å€¼ç‚ºç„¡æ•ˆçš„「%sã€ã€‚"
@@ -8047,12 +8017,6 @@ msgid "Unsupported export format!"
msgstr "ä¸æ”¯æ´çš„匯出格å¼ï¼"
msgid ""
-"Trying to build from a custom built template, but no version info for it "
-"exists. Please reinstall from the 'Project' menu."
-msgstr ""
-"嘗試自自定建置樣æ¿é€²è¡Œå»ºç½®ï¼Œä½†ç„¡ç‰ˆæœ¬è³‡è¨Šå¯ç”¨ã€‚請自「專案ã€é¸å–®ä¸­é‡æ–°å®‰è£ã€‚"
-
-msgid ""
"Android build version mismatch: Template installed: %s, Godot version: %s. "
"Please reinstall Android build template from 'Project' menu."
msgstr ""
diff --git a/editor/translations/properties/de.po b/editor/translations/properties/de.po
index e919f91096..f66608bcde 100644
--- a/editor/translations/properties/de.po
+++ b/editor/translations/properties/de.po
@@ -93,16 +93,16 @@ 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-01-09 20:42+0000\n"
-"Last-Translator: So Wieso <sowieso@dukun.de>\n"
+"PO-Revision-Date: 2023-02-09 01:12+0000\n"
+"Last-Translator: co1inco <colin.meihoefer@gmx.de>\n"
"Language-Team: German <https://hosted.weblate.org/projects/godot-engine/"
-"godot/de/>\n"
+"godot-properties/de/>\n"
"Language: de\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.15.1-dev\n"
+"X-Generator: Weblate 4.16-dev\n"
msgid "Application"
msgstr "Anwendung"
@@ -113,9 +113,15 @@ msgstr "Konfiguration"
msgid "Name"
msgstr "Name"
+msgid "Description"
+msgstr "Beschreibung"
+
msgid "Run"
msgstr "Ausführen"
+msgid "Main Scene"
+msgstr "Hauptszene"
+
msgid "Disable stdout"
msgstr "Stdout deaktivieren"
@@ -143,6 +149,9 @@ msgstr "Fenster"
msgid "Size"
msgstr "Größe"
+msgid "Mode"
+msgstr "Modus"
+
msgid "Resizable"
msgstr "Verstellbar"
@@ -158,6 +167,9 @@ msgstr "Energiesparen"
msgid "Keep Screen On"
msgstr "Bildschirm an lassen"
+msgid "Audio"
+msgstr "Audio"
+
msgid "Editor"
msgstr "Editor"
@@ -179,6 +191,9 @@ msgstr "Debuggen"
msgid "Settings"
msgstr "Einstellungen"
+msgid "Compression"
+msgstr "Kompression"
+
msgid "Crash Handler"
msgstr "Absturzbehandlung"
@@ -188,6 +203,21 @@ msgstr "Nachricht"
msgid "Rendering"
msgstr "Am Rendern"
+msgid "Occlusion Culling"
+msgstr "Occlusion-Culling"
+
+msgid "Limits"
+msgstr "Grenzen"
+
+msgid "GUI"
+msgstr "GUI"
+
+msgid "Max Size (MB)"
+msgstr "Maximale Größe (MB)"
+
+msgid "Vulkan"
+msgstr "Vulkan"
+
msgid "Low Processor Usage Mode"
msgstr "Niedrige-Prozessorauslastungsmodus"
@@ -236,6 +266,9 @@ msgstr "Faktor"
msgid "Button Index"
msgstr "Tastenindex"
+msgid "Double Click"
+msgstr "Doppelklick"
+
msgid "Tilt"
msgstr "Neigung"
@@ -290,6 +323,12 @@ msgstr "Tastenkürzel"
msgid "Big Endian"
msgstr "Big-Endian"
+msgid "Network"
+msgstr "Netzwerk"
+
+msgid "Page Size"
+msgstr "Page-Größe"
+
msgid "Blocking Mode Enabled"
msgstr "Blockierender Modus aktiviert"
@@ -326,9 +365,6 @@ msgstr "Pfad"
msgid "Data Array"
msgstr "Datenliste"
-msgid "Blocking Handshake"
-msgstr "Blockierender Handshake"
-
msgid "Max Pending Connections"
msgstr "Maximale Anzahl hängender Verbindungen"
@@ -404,15 +440,6 @@ msgstr "Animation"
msgid "Easing"
msgstr "Glätten Ein-Aus"
-msgid "Interface"
-msgstr "Schnittstelle"
-
-msgid "Editors"
-msgstr "Editoren"
-
-msgid "Network"
-msgstr "Netzwerk"
-
msgid "Remote Port"
msgstr "Fern-Port"
@@ -482,8 +509,8 @@ msgstr "Ausgewählt"
msgid "Keying"
msgstr "Schlüsselwerte erzeugen"
-msgid "Main Scene"
-msgstr "Hauptszene"
+msgid "Interface"
+msgstr "Schnittstelle"
msgid "Show Update Spinner"
msgstr "Aktualisierungsrad anzeigen"
@@ -791,6 +818,9 @@ msgstr "Schriftgröße von Quellcode in der Hilfe"
msgid "Help Title Font Size"
msgstr "Schriftgröße von Titeln der Hilfe"
+msgid "Editors"
+msgstr "Editoren"
+
msgid "Grid Map"
msgstr "Gitterkarte"
@@ -1208,6 +1238,9 @@ msgstr "Umrissgröße"
msgid "Variation"
msgstr "Variation"
+msgid "Transform"
+msgstr "Transformation"
+
msgid "Collada"
msgstr "Collada"
@@ -1238,15 +1271,9 @@ msgstr "Vorladen"
msgid "Columns"
msgstr "Spalten"
-msgid "Mode"
-msgstr "Modus"
-
msgid "Lossy Quality"
msgstr "Verlustbehaftete Qualität"
-msgid "BPTC LDR"
-msgstr "BPTC LDR"
-
msgid "Mipmaps"
msgstr "Mipmaps"
@@ -1313,12 +1340,6 @@ msgstr "Optimierer"
msgid "Max Angular Error"
msgstr "Max Winkelfehler"
-msgid "Compression"
-msgstr "Kompression"
-
-msgid "Page Size"
-msgstr "Page-Größe"
-
msgid "Nodes"
msgstr "Nodes"
@@ -1427,6 +1448,9 @@ msgstr "Threads verwenden"
msgid "Available URLs"
msgstr "Verfügbare URLs"
+msgid "Unset"
+msgstr "Deaktiviert"
+
msgid "Error"
msgstr "Fehler"
@@ -1544,9 +1568,6 @@ msgstr "Threads"
msgid "Thread Model"
msgstr "Thread-Model"
-msgid "Audio"
-msgstr "Audio"
-
msgid "Handheld"
msgstr "Handgerät"
@@ -1577,15 +1598,18 @@ msgstr "iOS"
msgid "Hide Home Indicator"
msgstr "Home-Anzeiger verbergen"
+msgid "Input Devices"
+msgstr "Eingabegeräte"
+
+msgid "Pointing"
+msgstr "Zeigend"
+
msgid "Boot Splash"
msgstr "Startladebild"
msgid "BG Color"
msgstr "Hintergrundfarbe"
-msgid "Input Devices"
-msgstr "Eingabegeräte"
-
msgid "Environment"
msgstr "Umgebung"
@@ -1595,21 +1619,24 @@ msgstr "Standard Löschfarbe"
msgid "Show Image"
msgstr "Bild anzeigen"
+msgid "Image"
+msgstr "Bild"
+
msgid "Fullsize"
msgstr "Orginalgröße"
msgid "Use Filter"
msgstr "Filter verwenden"
+msgid "Icon"
+msgstr "Symbol"
+
msgid "Buffering"
msgstr "Puffern"
msgid "Agile Event Flushing"
msgstr "Bewegliches Ereignis-Flushing"
-msgid "Pointing"
-msgstr "Zeigend"
-
msgid "Emulate Touch From Mouse"
msgstr "Druckberührung mit Maus emulieren"
@@ -1637,12 +1664,15 @@ msgstr "Solution-Verzeichnis"
msgid "Main Loop Type"
msgstr "Typ der Hauptschleife"
+msgid "Stretch"
+msgstr "Strecken"
+
+msgid "Aspect"
+msgstr "Verhältnis"
+
msgid "Auto Accept Quit"
msgstr "Automatisches Beendenakzeptieren"
-msgid "GUI"
-msgstr "GUI"
-
msgid "Fonts"
msgstr "Schriftarten"
@@ -1652,6 +1682,9 @@ msgstr "Dynamische Schriftarten"
msgid "Use Oversampling"
msgstr "Oversampling verwenden"
+msgid "Textures"
+msgstr "Texturen"
+
msgid "Operation"
msgstr "Betrieb"
@@ -1835,9 +1868,6 @@ msgstr "Basispfad"
msgid "Root Nodes"
msgstr "Wurzel-Nodes"
-msgid "Textures"
-msgstr "Texturen"
-
msgid "Images"
msgstr "Bilder"
@@ -2132,9 +2162,6 @@ msgstr "IGD-Status"
msgid "Write Mode"
msgstr "Schreibmodus"
-msgid "Limits"
-msgstr "Grenzen"
-
msgid "WebRTC"
msgstr "WebRTC"
@@ -2189,12 +2216,6 @@ msgstr "Angepasster Vordergrund 432 x 432"
msgid "Adaptive Background 432 X 432"
msgstr "Angepasster Hintergrund 432 x 432"
-msgid "Custom Build"
-msgstr "Eigener Build"
-
-msgid "Use Custom Build"
-msgstr "Einen Build verwenden"
-
msgid "Export Format"
msgstr "Exportformat"
@@ -2462,9 +2483,6 @@ msgstr "Architektur"
msgid "macOS"
msgstr "macOS"
-msgid "Icon"
-msgstr "Symbol"
-
msgid "Copyright"
msgstr "Urheberrecht"
@@ -2600,9 +2618,6 @@ msgstr "Anzeigename"
msgid "Short Name"
msgstr "Kurzname"
-msgid "Description"
-msgstr "Beschreibung"
-
msgid "Publisher"
msgstr "Veröffentlicher"
@@ -2762,18 +2777,12 @@ msgstr "Dateibeschreibung"
msgid "Trademarks"
msgstr "Handelsmarken"
-msgid "Frames"
-msgstr "Frames"
-
msgid "Frame"
msgstr "Frame"
msgid "Speed Scale"
msgstr "Geschwindigkeitsskalierung"
-msgid "Playing"
-msgstr "Wird abgespielt"
-
msgid "Centered"
msgstr "Zentriert"
@@ -2819,6 +2828,9 @@ msgstr "Volumen-dB"
msgid "Pitch Scale"
msgstr "Tonhöhenskalierung"
+msgid "Playing"
+msgstr "Wird abgespielt"
+
msgid "Autoplay"
msgstr "Automatisches Abspielen"
@@ -3188,9 +3200,6 @@ msgstr "Reisekosten"
msgid "Estimate Radius"
msgstr "Radius schätzen"
-msgid "Transform"
-msgstr "Transformation"
-
msgid "Rotation Degrees"
msgstr "Rotationswinkel"
@@ -3473,9 +3482,6 @@ msgstr "Z deaktivieren"
msgid "Flatness"
msgstr "Flachheit"
-msgid "Extents"
-msgstr "Ausmaße"
-
msgid "Albedo"
msgstr "Albedo"
@@ -4034,9 +4040,6 @@ msgstr "Zufällige Zeitverzögerung"
msgid "Xfade Time"
msgstr "Ãœberblendzeit"
-msgid "Reset"
-msgstr "Zurücksetzen"
-
msgid "Active"
msgstr "Aktiv"
@@ -4046,8 +4049,8 @@ msgstr "Menge hinzufügen"
msgid "Blend Amount"
msgstr "Abbildungsmenge"
-msgid "Seek Position"
-msgstr "Position aufsuchen"
+msgid "Reset"
+msgstr "Zurücksetzen"
msgid "Switch"
msgstr "Durchwechseln"
@@ -4370,9 +4373,6 @@ msgstr "Umgebung"
msgid "Relative Index"
msgstr "Relativer Index"
-msgid "Fit Content Height"
-msgstr "An Inhaltshöhe anpassen"
-
msgid "Scroll Active"
msgstr "Scrollen möglich"
@@ -4415,9 +4415,6 @@ msgstr "Eingeklappt"
msgid "Dragger Visibility"
msgstr "Trennersichtbarkeit"
-msgid "Stretch"
-msgstr "Strecken"
-
msgid "Stretch Shrink"
msgstr "Strecken-Stauchen"
@@ -4436,6 +4433,9 @@ msgstr "Tabs sichtbar"
msgid "Syntax Highlighter"
msgstr "Syntaxhervorhebung"
+msgid "Fit Content Height"
+msgstr "An Inhaltshöhe anpassen"
+
msgid "Draw"
msgstr "Zeichnen"
@@ -4607,9 +4607,6 @@ msgstr "Kantenglättung"
msgid "Use Debanding"
msgstr "Debanding verwenden"
-msgid "Occlusion Culling"
-msgstr "Occlusion-Culling"
-
msgid "Atlas Size"
msgstr "Atlasgröße"
@@ -4691,9 +4688,6 @@ msgstr "Min Größe"
msgid "Max Size"
msgstr "Max Größe"
-msgid "Aspect"
-msgstr "Verhältnis"
-
msgid "Layer Names"
msgstr "Ebenennamen"
@@ -5591,9 +5585,6 @@ msgstr "Wachstumsanfang"
msgid "Grow End"
msgstr "Wachstumsende"
-msgid "Image"
-msgstr "Bild"
-
msgid "Load Path"
msgstr "Ladepfad"
@@ -5618,6 +5609,9 @@ msgstr "Von"
msgid "To"
msgstr "Bis"
+msgid "Frames"
+msgstr "Frames"
+
msgid "Current Frame"
msgstr "Aktueller Frame"
@@ -5675,18 +5669,6 @@ msgstr "Navigationskarte"
msgid "Direct Space State"
msgstr "Direkter Raum Zustand"
-msgid "Default Gravity"
-msgstr "Standard-Gravitation"
-
-msgid "Default Gravity Vector"
-msgstr "Standardgravitationsvektor"
-
-msgid "Default Cell Size"
-msgstr "Standardzellgröße"
-
-msgid "Default Edge Connection Margin"
-msgstr "Standard Kantenverbinungsabstand"
-
msgid "Fallback Environment"
msgstr "Ausweichumgebung"
@@ -5822,20 +5804,17 @@ msgstr "Videoverzögerungsbehandlung (ms)"
msgid "Bus Count"
msgstr "Busanzahl"
-msgid "Capture Device"
-msgstr "Aufnahmegerät"
-
msgid "Feed"
msgstr "Zufuhr"
msgid "Is Active"
msgstr "Ist aktiv"
-msgid "Sleep Threshold Linear"
-msgstr "Schlafschwelle linear"
+msgid "Default Cell Size"
+msgstr "Standardzellgröße"
-msgid "Sleep Threshold Angular"
-msgstr "Schlafschwelle Winkel"
+msgid "Default Edge Connection Margin"
+msgstr "Standard Kantenverbinungsabstand"
msgid "Inverse Mass"
msgstr "Umgekehrte Masse"
@@ -5864,6 +5843,18 @@ msgstr "Mit anderen Gebieten kollidieren"
msgid "Shape RID"
msgstr "Form RID"
+msgid "Default Gravity"
+msgstr "Standard-Gravitation"
+
+msgid "Default Gravity Vector"
+msgstr "Standardgravitationsvektor"
+
+msgid "Sleep Threshold Linear"
+msgstr "Schlafschwelle linear"
+
+msgid "Sleep Threshold Angular"
+msgstr "Schlafschwelle Winkel"
+
msgid "Physics Engine"
msgstr "Physikengine"
@@ -5897,18 +5888,6 @@ msgstr "Render-Schleife aktiviert"
msgid "VRAM Compression"
msgstr "VRAM-Kompression"
-msgid "Import BPTC"
-msgstr "BPTC importieren"
-
-msgid "Import S3TC"
-msgstr "S3TC importieren"
-
-msgid "Import ETC"
-msgstr "ETC importieren"
-
-msgid "Import ETC2"
-msgstr "ETC2 importieren"
-
msgid "Lossless Compression"
msgstr "Verlustfreie Komprimierung"
diff --git a/editor/translations/properties/es.po b/editor/translations/properties/es.po
index 363ff0a120..40a4fe1441 100644
--- a/editor/translations/properties/es.po
+++ b/editor/translations/properties/es.po
@@ -97,16 +97,16 @@ 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-01-20 10:19+0000\n"
-"Last-Translator: Daniel Miranda <danmiranda@gmail.com>\n"
+"PO-Revision-Date: 2023-02-10 14:12+0000\n"
+"Last-Translator: Damien Monasterios <monasterio13septiembre@gmail.com>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/"
-"godot/es/>\n"
+"godot-properties/es/>\n"
"Language: es\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.15.1\n"
+"X-Generator: Weblate 4.16-dev\n"
msgid "Application"
msgstr "Aplicación"
@@ -117,9 +117,15 @@ msgstr "Configuración"
msgid "Name"
msgstr "Nombre"
+msgid "Description"
+msgstr "Descripción"
+
msgid "Run"
msgstr "Ejecutar"
+msgid "Main Scene"
+msgstr "Escena Principal"
+
msgid "Disable stdout"
msgstr "Desactivar stdout"
@@ -147,6 +153,9 @@ msgstr "Ventana"
msgid "Size"
msgstr "Tamaño"
+msgid "Mode"
+msgstr "Modo"
+
msgid "Resizable"
msgstr "Redimensionable"
@@ -156,12 +165,18 @@ msgstr "Sin bordes"
msgid "Transparent"
msgstr "Transparente"
+msgid "Extend to Title"
+msgstr "Extender al Título"
+
msgid "Energy Saving"
msgstr "Ahorro de Energía"
msgid "Keep Screen On"
msgstr "Mantener la Pantalla Activa"
+msgid "Audio"
+msgstr "Audio"
+
msgid "Editor"
msgstr "Editor"
@@ -183,6 +198,9 @@ msgstr "Depurar"
msgid "Settings"
msgstr "Configuración"
+msgid "Compression"
+msgstr "Compresión"
+
msgid "Crash Handler"
msgstr "Manipulador de Colisiones"
@@ -192,6 +210,15 @@ msgstr "Mensaje"
msgid "Rendering"
msgstr "Renderización"
+msgid "Occlusion Culling"
+msgstr "Occlusion Culling"
+
+msgid "Limits"
+msgstr "Límites"
+
+msgid "GUI"
+msgstr "GUI"
+
msgid "Low Processor Usage Mode"
msgstr "Modo de Bajo Uso del Procesador"
@@ -240,6 +267,9 @@ msgstr "Factor"
msgid "Button Index"
msgstr "Ãndice de Botones"
+msgid "Double Click"
+msgstr "Doble Clic"
+
msgid "Tilt"
msgstr "Inclinar"
@@ -294,6 +324,12 @@ msgstr "Atajo"
msgid "Big Endian"
msgstr "Big Endian"
+msgid "Network"
+msgstr "Red"
+
+msgid "Page Size"
+msgstr "Tamaño de Página"
+
msgid "Blocking Mode Enabled"
msgstr "Modo de Bloqueo Activado"
@@ -330,9 +366,6 @@ msgstr "Ruta"
msgid "Data Array"
msgstr "Array de Datos"
-msgid "Blocking Handshake"
-msgstr "Bloquear Handshake"
-
msgid "Max Pending Connections"
msgstr "Máximo de Conexiones Pendientes"
@@ -408,15 +441,6 @@ msgstr "Animación"
msgid "Easing"
msgstr "Suavizar"
-msgid "Interface"
-msgstr "Interfaz"
-
-msgid "Editors"
-msgstr "Editores"
-
-msgid "Network"
-msgstr "Red"
-
msgid "Remote Port"
msgstr "Puerto Remoto"
@@ -486,8 +510,8 @@ msgstr "Chequeado"
msgid "Keying"
msgstr "Teclear"
-msgid "Main Scene"
-msgstr "Escena Principal"
+msgid "Interface"
+msgstr "Interfaz"
msgid "Show Update Spinner"
msgstr "Mostrar Spinner de Actualización"
@@ -589,7 +613,7 @@ msgid "Theme"
msgstr "Theme"
msgid "Preset"
-msgstr "Preajuste"
+msgstr "Preconfigurado"
msgid "Base Color"
msgstr "Color Base"
@@ -795,6 +819,9 @@ msgstr "Tamaño de Fuente de Código de Ayuda"
msgid "Help Title Font Size"
msgstr "Tamaño de Fuente del Título de Ayuda"
+msgid "Editors"
+msgstr "Editores"
+
msgid "Grid Map"
msgstr "Mapeo de Cuadrícula"
@@ -1206,12 +1233,18 @@ msgstr "Oversampling"
msgid "Compress"
msgstr "Comprimir"
+msgid "Language"
+msgstr "Idioma"
+
msgid "Outline Size"
msgstr "Tamaño del Contorno"
msgid "Variation"
msgstr "Variación"
+msgid "Transform"
+msgstr "Transformar"
+
msgid "Collada"
msgstr "Collada"
@@ -1242,15 +1275,9 @@ msgstr "Precarga"
msgid "Columns"
msgstr "Columnas"
-msgid "Mode"
-msgstr "Modo"
-
msgid "Lossy Quality"
msgstr "Con Pérdidas de Calidad"
-msgid "BPTC LDR"
-msgstr "BPTC LDR"
-
msgid "Mipmaps"
msgstr "Mipmaps"
@@ -1317,12 +1344,6 @@ msgstr "Optimizador"
msgid "Max Angular Error"
msgstr "Error Angular Máximo"
-msgid "Compression"
-msgstr "Compresión"
-
-msgid "Page Size"
-msgstr "Tamaño de Página"
-
msgid "Nodes"
msgstr "Nodos"
@@ -1336,7 +1357,7 @@ msgid "Root Scale"
msgstr "Escala de Raíz"
msgid "Meshes"
-msgstr "Meshes"
+msgstr "Mallas"
msgid "Ensure Tangents"
msgstr "Asegurar Tangentes"
@@ -1431,6 +1452,9 @@ msgstr "Usar Hilos"
msgid "Available URLs"
msgstr "URLs Disponibles"
+msgid "Unset"
+msgstr "Desactivar"
+
msgid "Error"
msgstr "Error"
@@ -1548,9 +1572,6 @@ msgstr "Hilos"
msgid "Thread Model"
msgstr "Modelo de Hilo"
-msgid "Audio"
-msgstr "Audio"
-
msgid "Handheld"
msgstr "Manipulador"
@@ -1581,15 +1602,18 @@ msgstr "iOS"
msgid "Hide Home Indicator"
msgstr "Ocultar Indicador de Inicio"
+msgid "Input Devices"
+msgstr "Dispositivos de Entrada"
+
+msgid "Pointing"
+msgstr "Puntero"
+
msgid "Boot Splash"
msgstr "Pantalla de Splash"
msgid "BG Color"
msgstr "Color de Fondo"
-msgid "Input Devices"
-msgstr "Dispositivos de Entrada"
-
msgid "Environment"
msgstr "Entorno"
@@ -1599,21 +1623,24 @@ msgstr "Color Claro Predeterminado"
msgid "Show Image"
msgstr "Mostrar Imagen"
+msgid "Image"
+msgstr "imagen"
+
msgid "Fullsize"
msgstr "Tamaño completo"
msgid "Use Filter"
msgstr "Usar Filtro"
+msgid "Icon"
+msgstr "Icono"
+
msgid "Buffering"
msgstr "Buffering"
msgid "Agile Event Flushing"
msgstr "Evento Ãgil de Vaciado"
-msgid "Pointing"
-msgstr "Puntero"
-
msgid "Emulate Touch From Mouse"
msgstr "Emular Toque Desde El Mouse"
@@ -1641,12 +1668,15 @@ msgstr "Directorio de Soluciones"
msgid "Main Loop Type"
msgstr "Tipo de Bucle Principal"
+msgid "Stretch"
+msgstr "Estirar"
+
+msgid "Aspect"
+msgstr "Aspecto"
+
msgid "Auto Accept Quit"
msgstr "Aceptar Cierre Del Programa Automáticamente"
-msgid "GUI"
-msgstr "GUI"
-
msgid "Fonts"
msgstr "Fuentes"
@@ -1656,6 +1686,9 @@ msgstr "Fuentes Dinámicas"
msgid "Use Oversampling"
msgstr "Usar Sobremuestreo"
+msgid "Textures"
+msgstr "Texturas"
+
msgid "Operation"
msgstr "Operación"
@@ -1839,9 +1872,6 @@ msgstr "Ruta Base"
msgid "Root Nodes"
msgstr "Nodos Raíz"
-msgid "Textures"
-msgstr "Texturas"
-
msgid "Images"
msgstr "Imágenes"
@@ -2136,9 +2166,6 @@ msgstr "Estado del IGD"
msgid "Write Mode"
msgstr "Modo de Escritura"
-msgid "Limits"
-msgstr "Límites"
-
msgid "WebRTC"
msgstr "WebRTC"
@@ -2193,12 +2220,6 @@ msgstr "Primer Plano Adaptable 432 X 432"
msgid "Adaptive Background 432 X 432"
msgstr "Fondo Adaptable 432 X 432"
-msgid "Custom Build"
-msgstr "Build Personalizada"
-
-msgid "Use Custom Build"
-msgstr "Usar Compilación Personalizada"
-
msgid "Export Format"
msgstr "Formato de Exportación"
@@ -2466,9 +2487,6 @@ msgstr "Arquitectura"
msgid "macOS"
msgstr "macOS"
-msgid "Icon"
-msgstr "Icono"
-
msgid "Copyright"
msgstr "Copyright"
@@ -2604,9 +2622,6 @@ msgstr "Nombre a Mostrar"
msgid "Short Name"
msgstr "Nombre Corto"
-msgid "Description"
-msgstr "Descripción"
-
msgid "Publisher"
msgstr "Editor"
@@ -2766,18 +2781,12 @@ msgstr "Descripción del Archivo"
msgid "Trademarks"
msgstr "Marcas comerciales"
-msgid "Frames"
-msgstr "Fotogramas"
-
msgid "Frame"
msgstr "Fotograma"
msgid "Speed Scale"
msgstr "Escala de Velocidad"
-msgid "Playing"
-msgstr "Reproducir"
-
msgid "Centered"
msgstr "Centrado"
@@ -2823,6 +2832,9 @@ msgstr "Volumen dB"
msgid "Pitch Scale"
msgstr "Escala de Tono"
+msgid "Playing"
+msgstr "Reproducir"
+
msgid "Autoplay"
msgstr "Reproducción Automática"
@@ -3192,9 +3204,6 @@ msgstr "Costo del Viaje"
msgid "Estimate Radius"
msgstr "Estimación del Radio"
-msgid "Transform"
-msgstr "Transformar"
-
msgid "Rotation Degrees"
msgstr "Grados de Rotación"
@@ -3477,9 +3486,6 @@ msgstr "Desactivar Z"
msgid "Flatness"
msgstr "Llanura"
-msgid "Extents"
-msgstr "Extensiones"
-
msgid "Albedo"
msgstr "Albedo"
@@ -4038,9 +4044,6 @@ msgstr "Retraso Aleatorio"
msgid "Xfade Time"
msgstr "Tiempo de Fundido Cruzado"
-msgid "Reset"
-msgstr "Resetear"
-
msgid "Active"
msgstr "Activo"
@@ -4050,8 +4053,8 @@ msgstr "Añadir Cantidad"
msgid "Blend Amount"
msgstr "Cantidad de Mezcla"
-msgid "Seek Position"
-msgstr "Buscar Posición"
+msgid "Reset"
+msgstr "Resetear"
msgid "Switch"
msgstr "Cambiar"
@@ -4374,9 +4377,6 @@ msgstr "Env"
msgid "Relative Index"
msgstr "Ãndice Relativo"
-msgid "Fit Content Height"
-msgstr "Ajustar Altura Del Contenido"
-
msgid "Scroll Active"
msgstr "Scroll Activo"
@@ -4419,9 +4419,6 @@ msgstr "Colapsado"
msgid "Dragger Visibility"
msgstr "Visibilidad de los Arrastradores"
-msgid "Stretch"
-msgstr "Estirar"
-
msgid "Stretch Shrink"
msgstr "Encogimiento por Estiramiento"
@@ -4440,6 +4437,9 @@ msgstr "Pestañas Visibles"
msgid "Syntax Highlighter"
msgstr "Resaltador de Sintaxis"
+msgid "Fit Content Height"
+msgstr "Ajustar Altura Del Contenido"
+
msgid "Draw"
msgstr "Dibujar"
@@ -4611,9 +4611,6 @@ msgstr "Antialias"
msgid "Use Debanding"
msgstr "Usar Debanding"
-msgid "Occlusion Culling"
-msgstr "Occlusion Culling"
-
msgid "Atlas Size"
msgstr "Tamaño de Atlas"
@@ -4695,9 +4692,6 @@ msgstr "Tamaño Mínimo"
msgid "Max Size"
msgstr "Tamaño Máximo"
-msgid "Aspect"
-msgstr "Aspecto"
-
msgid "Layer Names"
msgstr "Nombres de las Capas"
@@ -5586,9 +5580,6 @@ msgstr "Inicio de Expansión"
msgid "Grow End"
msgstr "Fin de Expansión"
-msgid "Image"
-msgstr "imagen"
-
msgid "Load Path"
msgstr "Ruta de Carga"
@@ -5613,6 +5604,9 @@ msgstr "Desde"
msgid "To"
msgstr "A"
+msgid "Frames"
+msgstr "Fotogramas"
+
msgid "Current Frame"
msgstr "Cuadro Actual"
@@ -5670,18 +5664,6 @@ msgstr "Mapa de Navegación"
msgid "Direct Space State"
msgstr "Estado de Espacio Directo"
-msgid "Default Gravity"
-msgstr "Gravedad Predeterminada"
-
-msgid "Default Gravity Vector"
-msgstr "Vector de Gravedad Predeterminado"
-
-msgid "Default Cell Size"
-msgstr "Vista Previa Predeterminada"
-
-msgid "Default Edge Connection Margin"
-msgstr "Margen de Conexión de Bordes Predeterminado"
-
msgid "Fallback Environment"
msgstr "Entorno de Retorno"
@@ -5811,20 +5793,17 @@ msgstr "Compensación de Retraso de Vídeo (ms)"
msgid "Bus Count"
msgstr "Conteo de Buses"
-msgid "Capture Device"
-msgstr "Dispositivo de Captura"
-
msgid "Feed"
msgstr "Feed"
msgid "Is Active"
msgstr "Activo"
-msgid "Sleep Threshold Linear"
-msgstr "Umbral de Sueño Lineal"
+msgid "Default Cell Size"
+msgstr "Vista Previa Predeterminada"
-msgid "Sleep Threshold Angular"
-msgstr "Umbral de Sueño Angular"
+msgid "Default Edge Connection Margin"
+msgstr "Margen de Conexión de Bordes Predeterminado"
msgid "Inverse Mass"
msgstr "Masa Inversa"
@@ -5850,6 +5829,18 @@ msgstr "Colisionar Con Ãreas"
msgid "Shape RID"
msgstr "RID de Forma"
+msgid "Default Gravity"
+msgstr "Gravedad Predeterminada"
+
+msgid "Default Gravity Vector"
+msgstr "Vector de Gravedad Predeterminado"
+
+msgid "Sleep Threshold Linear"
+msgstr "Umbral de Sueño Lineal"
+
+msgid "Sleep Threshold Angular"
+msgstr "Umbral de Sueño Angular"
+
msgid "Physics Engine"
msgstr "Motor de Física"
@@ -5883,18 +5874,6 @@ msgstr "Bucle de Renderización Activado"
msgid "VRAM Compression"
msgstr "Compresión VRAM"
-msgid "Import BPTC"
-msgstr "Importar BPTC"
-
-msgid "Import S3TC"
-msgstr "Importar S3TC"
-
-msgid "Import ETC"
-msgstr "Importar ETC"
-
-msgid "Import ETC2"
-msgstr "Importar ETC2"
-
msgid "Lossless Compression"
msgstr "Compresión Sin Pérdidas"
diff --git a/editor/translations/properties/fr.po b/editor/translations/properties/fr.po
index e2921d8586..74b674aa1c 100644
--- a/editor/translations/properties/fr.po
+++ b/editor/translations/properties/fr.po
@@ -114,16 +114,16 @@ 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-01-14 00:01+0000\n"
-"Last-Translator: slundi <slundi@gmail.com>\n"
+"PO-Revision-Date: 2023-02-10 14:12+0000\n"
+"Last-Translator: Helix Sir <vincentbarkmann@gmail.com>\n"
"Language-Team: French <https://hosted.weblate.org/projects/godot-engine/"
-"godot/fr/>\n"
+"godot-properties/fr/>\n"
"Language: fr\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.15.1-dev\n"
+"X-Generator: Weblate 4.16-dev\n"
msgid "Application"
msgstr "Application"
@@ -134,9 +134,15 @@ msgstr "Configuration"
msgid "Name"
msgstr "Nom"
+msgid "Description"
+msgstr "Description"
+
msgid "Run"
msgstr "Lancer"
+msgid "Main Scene"
+msgstr "Scène principale"
+
msgid "Disable stdout"
msgstr "Désactiver stdout"
@@ -164,33 +170,54 @@ msgstr "Fenêtre"
msgid "Size"
msgstr "Taille"
+msgid "Mode"
+msgstr "Mode"
+
msgid "Resizable"
msgstr "Redimensionnable"
msgid "Borderless"
msgstr "Sans Bordure"
+msgid "Always on Top"
+msgstr "Toujours au dessus"
+
msgid "Transparent"
msgstr "Transparent"
+msgid "Extend to Title"
+msgstr "Étirer au titre"
+
msgid "Energy Saving"
msgstr "Économie d'Énergie"
msgid "Keep Screen On"
msgstr "Garder l'écran actif"
+msgid "Audio"
+msgstr "Audio"
+
msgid "Editor"
msgstr "Éditeur"
msgid "Main Run Args"
msgstr "Paramètres d'exécution du programme principal"
+msgid "Default Signal Callback Name"
+msgstr "Nom de rappel de signal par défaut"
+
+msgid "Default Signal Callback to Self Name"
+msgstr "Nom de rappel de signal à soi-même par défaut"
+
msgid "Physics"
msgstr "Physique"
msgid "2D"
msgstr "2D"
+msgid "Run on Separate Thread"
+msgstr "Exécuter sur un thread différent"
+
msgid "3D"
msgstr "3D"
@@ -200,6 +227,9 @@ msgstr "Débogage"
msgid "Settings"
msgstr "Paramètres"
+msgid "Compression"
+msgstr "Compression"
+
msgid "Crash Handler"
msgstr "Gestionnaire de Crash"
@@ -209,6 +239,36 @@ msgstr "Message"
msgid "Rendering"
msgstr "Rendu"
+msgid "Occlusion Culling"
+msgstr "Elagage de l'occlusion"
+
+msgid "Limits"
+msgstr "Limites"
+
+msgid "Internationalization"
+msgstr "Internationalisation"
+
+msgid "Force Right to Left Layout Direction"
+msgstr "Forcer l'affichage de droite à gauche"
+
+msgid "GUI"
+msgstr "GUI"
+
+msgid "Rendering Device"
+msgstr "Matériel de rendu"
+
+msgid "Block Size (KB)"
+msgstr "Taille de bloc (Ko)"
+
+msgid "Max Size (MB)"
+msgstr "Taille Maximale (Mo)"
+
+msgid "Vulkan"
+msgstr "Vulkan"
+
+msgid "Max Descriptors per Pool"
+msgstr "Descripteurs maximums par Pool"
+
msgid "Low Processor Usage Mode"
msgstr "Mode d'utilisation du processeur bas en ressources"
@@ -218,6 +278,15 @@ msgstr "Mode d'utilisation faible du processeur Veille (µsec)"
msgid "Print Error Messages"
msgstr "Afficher les messages d'erreur"
+msgid "Physics Ticks per Second"
+msgstr "Ticks de physique par seconde"
+
+msgid "Max Physics Steps per Frame"
+msgstr "Étapes de physique maximum par trame"
+
+msgid "Max FPS"
+msgstr "FPS Max"
+
msgid "Time Scale"
msgstr "Échelle de temps"
@@ -233,9 +302,33 @@ msgstr "Utiliser l'entrée accumulée"
msgid "Device"
msgstr "Périphérique"
+msgid "Window ID"
+msgstr "ID de la fenêtre"
+
+msgid "Alt Pressed"
+msgstr "Alt pressé"
+
+msgid "Shift Pressed"
+msgstr "Shift pressé"
+
+msgid "Ctrl Pressed"
+msgstr "Ctrl pressé"
+
+msgid "Meta Pressed"
+msgstr "Meta pressé"
+
msgid "Pressed"
msgstr "Pressé"
+msgid "Keycode"
+msgstr "Keycode"
+
+msgid "Physical Keycode"
+msgstr "Keycode physique"
+
+msgid "Key Label"
+msgstr "Label de touche"
+
msgid "Unicode"
msgstr "Unicode"
@@ -257,6 +350,9 @@ msgstr "Facteur"
msgid "Button Index"
msgstr "Index du Button"
+msgid "Double Click"
+msgstr "Double clic"
+
msgid "Tilt"
msgstr "Inclinaison"
@@ -281,6 +377,9 @@ msgstr "Valeur de l'Axe"
msgid "Index"
msgstr "Index"
+msgid "Double Tap"
+msgstr "Double appui"
+
msgid "Action"
msgstr "Action"
@@ -308,9 +407,24 @@ msgstr "Valeur du controller"
msgid "Shortcut"
msgstr "Raccourci"
+msgid "Events"
+msgstr "Événements"
+
+msgid "Include Navigational"
+msgstr "Inclure navigationel"
+
+msgid "Include Hidden"
+msgstr "Inclure caché(s)"
+
msgid "Big Endian"
msgstr "Gros-boutiste"
+msgid "Network"
+msgstr "Réseau"
+
+msgid "Page Size"
+msgstr "Taille de page"
+
msgid "Blocking Mode Enabled"
msgstr "Mode de blocage activé"
@@ -326,6 +440,12 @@ msgstr "Données"
msgid "Object ID"
msgstr "Identifiant de l'Objet"
+msgid "Original Class"
+msgstr "Classe originale"
+
+msgid "Recording Properties"
+msgstr "Propriétés d'enregistrement"
+
msgid "Encode Buffer Max Size"
msgstr "Taille maximale du tampon d'encodage"
@@ -341,15 +461,15 @@ msgstr "Pair de flux"
msgid "Resource"
msgstr "Ressource"
+msgid "Local to Scene"
+msgstr "Local à la scène"
+
msgid "Path"
msgstr "Chemin"
msgid "Data Array"
msgstr "Tableau de données"
-msgid "Blocking Handshake"
-msgstr "Blocage de la poignée de main"
-
msgid "Max Pending Connections"
msgstr "Connexions Maximales en Attente"
@@ -359,6 +479,18 @@ msgstr "Décalage"
msgid "Cell Size"
msgstr "Taille des Cellules"
+msgid "Jumping Enabled"
+msgstr "Saut actif"
+
+msgid "Default Compute Heuristic"
+msgstr "Calculation heuristique par défaut"
+
+msgid "Default Estimate Heuristic"
+msgstr "Estimation heuristique par défaut"
+
+msgid "Diagonal Mode"
+msgstr "Mode diagonal"
+
msgid "Seed"
msgstr "Graine"
@@ -368,6 +500,24 @@ msgstr "État"
msgid "Source Code"
msgstr "Code Source"
+msgid "TLS"
+msgstr "TLS"
+
+msgid "Threading"
+msgstr "Tâches parallèles (Threading)"
+
+msgid "Worker Pool"
+msgstr "Pool de travailleur"
+
+msgid "Max Threads"
+msgstr "Tâches parallèles maximum"
+
+msgid "Use System Threads for Low Priority Tasks"
+msgstr "Utiliser les threads système pour les tâches de basse priorité"
+
+msgid "Low Priority Thread Ratio"
+msgstr "Ratio de threads à basse priorité"
+
msgid "Locale"
msgstr "Localisation"
@@ -377,15 +527,33 @@ msgstr "Test"
msgid "Fallback"
msgstr "Repli"
+msgid "Pseudolocalization"
+msgstr "Pseudo-localisation"
+
+msgid "Use Pseudolocalization"
+msgstr "Utiliser la pseudo-localisation"
+
+msgid "Replace With Accents"
+msgstr "Remplacer avec accents"
+
+msgid "Double Vowels"
+msgstr "Double voyelles"
+
msgid "Override"
msgstr "Redéfinition"
+msgid "Expansion Ratio"
+msgstr "Ratio d'expansion"
+
msgid "Prefix"
msgstr "Préfixe"
msgid "Suffix"
msgstr "Suffixe"
+msgid "Skip Placeholders"
+msgstr "Ignorer les substituts"
+
msgid "Rotation"
msgstr "Rotation"
@@ -425,21 +593,24 @@ msgstr "Animation"
msgid "Easing"
msgstr "Transition entrée-sortie"
-msgid "Interface"
-msgstr "Interface"
-
-msgid "Editors"
-msgstr "Éditeurs"
-
-msgid "Network"
-msgstr "Réseau"
+msgid "Debug Adapter"
+msgstr "Adaptateur de débogage"
msgid "Remote Port"
msgstr "Port distant"
+msgid "Request Timeout"
+msgstr "Délai de requête expiré (Timeout)"
+
+msgid "Sync Breakpoints"
+msgstr "Synchroniser les point d'arrêts"
+
msgid "Debugger"
msgstr "Débogueur"
+msgid "Auto Switch to Remote Scene Tree"
+msgstr "Basculer automatiquement vers l'arborescence de scène distante"
+
msgid "Remote Scene Tree Refresh Interval"
msgstr "Intervalle de rafraîchissement de l'arborescence distante"
@@ -458,6 +629,9 @@ msgstr "Accès"
msgid "Display Mode"
msgstr "Mode d'affichage"
+msgid "File Mode"
+msgstr "Mode fichier"
+
msgid "Current Dir"
msgstr "Répertoire Actuel"
@@ -479,6 +653,9 @@ msgstr "Importer"
msgid "Reimport Missing Imported Files"
msgstr "Réimporter les fichiers importés manquants"
+msgid "Use Multiple Threads"
+msgstr "Utiliser le multitâche"
+
msgid "Text Editor"
msgstr "Éditeur de texte"
@@ -500,11 +677,20 @@ msgstr "Cochable"
msgid "Checked"
msgstr "Coché"
+msgid "Draw Warning"
+msgstr "Montrer les avertissements"
+
msgid "Keying"
msgstr "En train de taper"
-msgid "Main Scene"
-msgstr "Scène principale"
+msgid "Deletable"
+msgstr "Supprimable"
+
+msgid "Interface"
+msgstr "Interface"
+
+msgid "Save on Focus Loss"
+msgstr "Enregistrer à la perte de focus"
msgid "Show Update Spinner"
msgstr "Afficher l'indicateur d'activité"
@@ -518,6 +704,9 @@ msgstr "Traduction des paramètres"
msgid "Scene Tabs"
msgstr "Onglets de scène"
+msgid "Restore Scenes on Load"
+msgstr "Rouvrir les scènes au chargement"
+
msgid "Inspector"
msgstr "Inspecteur"
@@ -539,9 +728,18 @@ msgstr "Édition horizontale de Vector2"
msgid "Horizontal Vector Types Editing"
msgstr "Édition de Types de Vecteur Horizontal"
+msgid "Open Resources in Current Inspector"
+msgstr "Ouvrir les ressources dans l'inspecteur actuel"
+
+msgid "Resources to Open in New Inspector"
+msgstr "Ressources à ouvrir dans un nouvel inspecteur"
+
msgid "Default Color Picker Mode"
msgstr "Mode par défaut du sélectionneur de couleur"
+msgid "Default Color Picker Shape"
+msgstr "Forme par défaut du sélecteur de couleur"
+
msgid "Distraction Free Mode"
msgstr "Mode Sans Distraction"
@@ -566,6 +764,15 @@ msgstr "Langue de l'éditeur"
msgid "Display Scale"
msgstr "Échelle d'affichage"
+msgid "Enable Pseudolocalization"
+msgstr "Activer la pseudo-localisation"
+
+msgid "Use Embedded Menu"
+msgstr "Utiliser le menu intégré"
+
+msgid "Expand to Title"
+msgstr "Étirer à la longueur du texte"
+
msgid "Custom Display Scale"
msgstr "Échelle personnalisée d'affichage"
@@ -575,9 +782,15 @@ msgstr "Taille de la police principale"
msgid "Code Font Size"
msgstr "Taille de la police du code"
+msgid "Font Antialiasing"
+msgstr "Anticrénelage de la police"
+
msgid "Font Hinting"
msgstr "Optimisation de rendu de police"
+msgid "Font Subpixel Positioning"
+msgstr "Positionnement sous-pixel de la police"
+
msgid "Main Font"
msgstr "Police Principale"
@@ -599,15 +812,30 @@ msgstr "Mode distraction séparée"
msgid "Automatically Open Screenshots"
msgstr "Ouvrir automatiquement les captures d'écran"
+msgid "Single Window Mode"
+msgstr "Mode fenêtre unique"
+
msgid "Mouse Extra Buttons Navigate History"
msgstr "Boutons additionnels de la souris déplacent dans l'historique"
+msgid "Save Each Scene on Quit"
+msgstr "Enregistrer chaque scène à la fermeture"
+
+msgid "Show Internal Errors in Toast Notifications"
+msgstr "Montrer les erreurs internes dans les notifications Toast"
+
+msgid "Show Low Level OpenType Features"
+msgstr "Afficher les fonctionnalités bas-niveau pour OpenType"
+
msgid "Theme"
msgstr "Thème"
msgid "Preset"
msgstr "Préréglage"
+msgid "Icon and Font Color"
+msgstr "Couleur de police et d'icône"
+
msgid "Base Color"
msgstr "Couleur de Base"
@@ -617,6 +845,12 @@ msgstr "Couleur d'accentuation"
msgid "Contrast"
msgstr "Contraste"
+msgid "Draw Extra Borders"
+msgstr "Dessiner bordures supplémentaires"
+
+msgid "Icon Saturation"
+msgstr "Saturation d'icône"
+
msgid "Relationship Line Opacity"
msgstr "Opacité des lignes de relation"
@@ -632,12 +866,36 @@ msgstr "Espacement supplémentaire"
msgid "Custom Theme"
msgstr "Thème Personnalisé"
+msgid "Display Close Button"
+msgstr "Afficher bouton Fermer"
+
+msgid "Show Thumbnail on Hover"
+msgstr "Afficher la vignette au survol"
+
+msgid "Maximum Width"
+msgstr "Largeur maximum"
+
msgid "Show Script Button"
msgstr "Afficher le bouton script"
msgid "FileSystem"
msgstr "Système de fichiers"
+msgid "External Programs"
+msgstr "Programmes externes"
+
+msgid "Raster Image Editor"
+msgstr "Éditeur d'images tramées"
+
+msgid "Vector Image Editor"
+msgstr "Éditeur d'images vectorielles"
+
+msgid "Audio Editor"
+msgstr "Éditeur audio"
+
+msgid "3D Model Editor"
+msgstr "Éditeur de modèles 3D"
+
msgid "Directories"
msgstr "Dossiers"
@@ -668,9 +926,15 @@ msgstr "Arborescence de scène"
msgid "Start Create Dialog Fully Expanded"
msgstr "Lancer le dialogue de création complètement déplié"
+msgid "Auto Expand to Selected"
+msgstr "Étirement auto à la sélection"
+
msgid "Always Show Folders"
msgstr "Toujours afficher les dossiers"
+msgid "Textfile Extensions"
+msgstr "Extensions de fichiers texte"
+
msgid "Property Editor"
msgstr "Éditeur de Propriétés"
@@ -692,12 +956,18 @@ msgstr "Caret"
msgid "Caret Blink"
msgstr "Clignotement du caret"
+msgid "Caret Blink Interval"
+msgstr "Intervalle de clignotement du caret"
+
msgid "Highlight Current Line"
msgstr "Mettre en évidence la ligne actuelle"
msgid "Highlight All Occurrences"
msgstr "Mettre en évidence toutes les occurrences"
+msgid "Guidelines"
+msgstr "Lignes de guide"
+
msgid "Show Line Length Guidelines"
msgstr "Montrer les guides de longueur de ligne"
@@ -707,6 +977,9 @@ msgstr "Colonne douce des guides de longueur de ligne"
msgid "Line Length Guideline Hard Column"
msgstr "Colonne dure des guides de longueur de ligne"
+msgid "Gutters"
+msgstr "Gouttières"
+
msgid "Show Line Numbers"
msgstr "Afficher les numéros de Ligne"
@@ -731,12 +1004,18 @@ msgstr "Afficher la minimap"
msgid "Minimap Width"
msgstr "Largeur de la mini-carte"
+msgid "Lines"
+msgstr "Lignes"
+
msgid "Code Folding"
msgstr "Rétrécir le code"
msgid "Word Wrap"
msgstr "Retour à la ligne des mots"
+msgid "Whitespace"
+msgstr "Espaces"
+
msgid "Draw Tabs"
msgstr "Montrer les tabulations"
@@ -746,15 +1025,30 @@ msgstr "Afficher les espaces"
msgid "Line Spacing"
msgstr "Espace entre les lignes"
+msgid "Behavior"
+msgstr "Comportement"
+
msgid "Navigation"
msgstr "Navigation"
+msgid "Move Caret on Right Click"
+msgstr "Déplacer le caret au clic droit"
+
+msgid "Scroll Past End of File"
+msgstr "Défiler au-delà de la fin du fichier"
+
msgid "Smooth Scrolling"
msgstr "Défilement doux"
msgid "V Scroll Speed"
msgstr "Vitesse du défilement vertical"
+msgid "Drag and Drop Selection"
+msgstr "Glisser/déposer la sélection"
+
+msgid "Stay in Script Editor on Node Selected"
+msgstr "Rester sur l’éditeur de script à la sélection d'un nœud"
+
msgid "Indent"
msgstr "Indentation"
@@ -764,9 +1058,21 @@ msgstr "Indentation automatique"
msgid "Files"
msgstr "Fichiers"
+msgid "Trim Trailing Whitespace on Save"
+msgstr "Retirer les espaces de fin de ligne à l'enregistrement"
+
msgid "Autosave Interval Secs"
msgstr "Intervalle entre les sauvegardes automatiques (en secondes)"
+msgid "Restore Scripts on Load"
+msgstr "Rouvrir les scripts au chargement"
+
+msgid "Convert Indent on Save"
+msgstr "Convertir les indentations à l'enregistrement"
+
+msgid "Auto Reload Scripts on External Change"
+msgstr "Recharger automatiquement les scripts sur changement externe"
+
msgid "Script List"
msgstr "Liste de scripts"
@@ -812,6 +1118,12 @@ msgstr "Taille de police d'origine de l'aide"
msgid "Help Title Font Size"
msgstr "Taille de police du titre de l'aide"
+msgid "Class Reference Examples"
+msgstr "Exemples de référence de classe"
+
+msgid "Editors"
+msgstr "Éditeurs"
+
msgid "Grid Map"
msgstr "Grille"
@@ -833,6 +1145,9 @@ msgstr "Manipulateurs 3D"
msgid "Gizmo Colors"
msgstr "Couleurs des manipulateurs"
+msgid "Instantiated"
+msgstr "Instancié"
+
msgid "Joint"
msgstr "Jointure"
@@ -977,9 +1292,15 @@ msgstr "Restreindre la fenêtre d'éditeur"
msgid "Simple Panning"
msgstr "Panoramique simple"
+msgid "Tiles Editor"
+msgstr "Éditeur de tuiles"
+
msgid "Display Grid"
msgstr "Afficher la grille"
+msgid "Polygon Editor"
+msgstr "Éditeur de polygones"
+
msgid "Point Grab Radius"
msgstr "Rayon de saisie de point"
@@ -1010,6 +1331,15 @@ msgstr "Éditeurs visuels"
msgid "Minimap Opacity"
msgstr "Opacité de la mini-carte"
+msgid "Lines Curvature"
+msgstr "Courbe de lignes"
+
+msgid "Visual Shader"
+msgstr "Visual Shader"
+
+msgid "Port Preview Size"
+msgstr "Taille d'aperçu"
+
msgid "Window Placement"
msgstr "Placement de la fenêtre"
@@ -1037,6 +1367,9 @@ msgstr "Taille de la Police"
msgid "Remote Host"
msgstr "Hôte distant"
+msgid "Editor TLS Certificates"
+msgstr "Certificats TLS de l’éditeur"
+
msgid "Profiler Frame History Size"
msgstr "Taille de l'historique de la trame du profileur"
@@ -1175,6 +1508,9 @@ msgstr "Zoomer"
msgid "Export"
msgstr "Exporter"
+msgid "Convert Text Resources to Binary"
+msgstr "Convertir les ressources texte en binaire lors de l'exportation"
+
msgid "Custom Template"
msgstr "Modèle Personnalisé"
@@ -1229,6 +1565,9 @@ msgstr "Taille de Contour"
msgid "Variation"
msgstr "Variation"
+msgid "Transform"
+msgstr "Transformation"
+
msgid "Collada"
msgstr "Collada"
@@ -1259,15 +1598,9 @@ msgstr "Précharger"
msgid "Columns"
msgstr "Colonnes"
-msgid "Mode"
-msgstr "Mode"
-
msgid "Lossy Quality"
msgstr "Mauvaise qualité"
-msgid "BPTC LDR"
-msgstr "BPTC LDR"
-
msgid "Mipmaps"
msgstr "Mipmaps"
@@ -1334,12 +1667,6 @@ msgstr "Optimiseur"
msgid "Max Angular Error"
msgstr "Erreur Angulaire Max"
-msgid "Compression"
-msgstr "Compression"
-
-msgid "Page Size"
-msgstr "Taille de page"
-
msgid "Nodes"
msgstr "NÅ“uds"
@@ -1448,6 +1775,9 @@ msgstr "Utiliser le multitâche"
msgid "Available URLs"
msgstr "URLs disponibles"
+msgid "Unset"
+msgstr "Vider"
+
msgid "Error"
msgstr "Erreur"
@@ -1565,9 +1895,6 @@ msgstr "Tâches Parallèles"
msgid "Thread Model"
msgstr "Modèle de Parallélisme"
-msgid "Audio"
-msgstr "Audio"
-
msgid "Handheld"
msgstr "Portable"
@@ -1598,15 +1925,18 @@ msgstr "iOS"
msgid "Hide Home Indicator"
msgstr "Masquer l'indicateur d’accueil"
+msgid "Input Devices"
+msgstr "Périphériques d'entrée"
+
+msgid "Pointing"
+msgstr "Pointage"
+
msgid "Boot Splash"
msgstr "Écran de démarrage"
msgid "BG Color"
msgstr "Couleur d'arrière-plan"
-msgid "Input Devices"
-msgstr "Périphériques d'entrée"
-
msgid "Environment"
msgstr "Environnement"
@@ -1616,21 +1946,24 @@ msgstr "Couleur d'effacement par défaut"
msgid "Show Image"
msgstr "Afficher l'image"
+msgid "Image"
+msgstr "Image"
+
msgid "Fullsize"
msgstr "Pleine taille"
msgid "Use Filter"
msgstr "Utiliser le filtrage"
+msgid "Icon"
+msgstr "Icône"
+
msgid "Buffering"
msgstr "Mise en mémoire tampon"
msgid "Agile Event Flushing"
msgstr "Purge d'événement agile"
-msgid "Pointing"
-msgstr "Pointage"
-
msgid "Emulate Touch From Mouse"
msgstr "Émuler le toucher tactile avec la souris"
@@ -1658,12 +1991,15 @@ msgstr "Choisir un répertoire pour la solution"
msgid "Main Loop Type"
msgstr "Type de boucle principale"
+msgid "Stretch"
+msgstr "Étirement"
+
+msgid "Aspect"
+msgstr "Aspect"
+
msgid "Auto Accept Quit"
msgstr "Accepter automatiquement la fermeture"
-msgid "GUI"
-msgstr "GUI"
-
msgid "Fonts"
msgstr "Polices"
@@ -1673,6 +2009,9 @@ msgstr "Polices Dynamiques"
msgid "Use Oversampling"
msgstr "Utiliser le suréchantillonnage"
+msgid "Textures"
+msgstr "Textures"
+
msgid "Operation"
msgstr "Opération"
@@ -1856,9 +2195,6 @@ msgstr "Chemin de base"
msgid "Root Nodes"
msgstr "NÅ“uds racines"
-msgid "Textures"
-msgstr "Textures"
-
msgid "Images"
msgstr "Images"
@@ -2153,9 +2489,6 @@ msgstr "État IGD"
msgid "Write Mode"
msgstr "Mode écriture"
-msgid "Limits"
-msgstr "Limites"
-
msgid "WebRTC"
msgstr "WebRTC"
@@ -2210,12 +2543,6 @@ msgstr "Avant-Plan Adaptatif 432 X 432"
msgid "Adaptive Background 432 X 432"
msgstr "Arrière-Plan Adaptatif 432 X 432"
-msgid "Custom Build"
-msgstr "Construction personnalisé"
-
-msgid "Use Custom Build"
-msgstr "Utiliser une construction personnalisé"
-
msgid "Export Format"
msgstr "Format d'exportation"
@@ -2483,9 +2810,6 @@ msgstr "Architecture"
msgid "macOS"
msgstr "macOS"
-msgid "Icon"
-msgstr "Icône"
-
msgid "Copyright"
msgstr "Copyright"
@@ -2621,9 +2945,6 @@ msgstr "Afficher le nom"
msgid "Short Name"
msgstr "Nom Abrégé"
-msgid "Description"
-msgstr "Description"
-
msgid "Publisher"
msgstr "Publicateur"
@@ -2783,18 +3104,12 @@ msgstr "Description de fichier"
msgid "Trademarks"
msgstr "Marques Déposées"
-msgid "Frames"
-msgstr "Trames"
-
msgid "Frame"
msgstr "Trame"
msgid "Speed Scale"
msgstr "Échelle de vitesse"
-msgid "Playing"
-msgstr "En train de jouer"
-
msgid "Centered"
msgstr "Centré"
@@ -2840,6 +3155,9 @@ msgstr "Volume (dB)"
msgid "Pitch Scale"
msgstr "Échelle de pitch"
+msgid "Playing"
+msgstr "En train de jouer"
+
msgid "Autoplay"
msgstr "Lecture automatique"
@@ -3209,9 +3527,6 @@ msgstr "Coût de déplacement"
msgid "Estimate Radius"
msgstr "Estimer le rayon"
-msgid "Transform"
-msgstr "Transformation"
-
msgid "Rotation Degrees"
msgstr "Degrés de Rotation"
@@ -3494,9 +3809,6 @@ msgstr "Désactiver axe Z"
msgid "Flatness"
msgstr "Platitude"
-msgid "Extents"
-msgstr "Étendues"
-
msgid "Albedo"
msgstr "Albédo"
@@ -4055,9 +4367,6 @@ msgstr "Retard aléatoire"
msgid "Xfade Time"
msgstr "Durée du fondu croisé"
-msgid "Reset"
-msgstr "Réinitialiser"
-
msgid "Active"
msgstr "Actif"
@@ -4067,8 +4376,8 @@ msgstr "Ajouter une quantité"
msgid "Blend Amount"
msgstr "Quantité de mélange"
-msgid "Seek Position"
-msgstr "Chercher la position"
+msgid "Reset"
+msgstr "Réinitialiser"
msgid "Switch"
msgstr "Switch"
@@ -4391,9 +4700,6 @@ msgstr "Alentours"
msgid "Relative Index"
msgstr "Position relative"
-msgid "Fit Content Height"
-msgstr "Ajuster à la hauteur du conteneur"
-
msgid "Scroll Active"
msgstr "Défilement actif"
@@ -4436,9 +4742,6 @@ msgstr "Réduit"
msgid "Dragger Visibility"
msgstr "Visibilité du Tireur"
-msgid "Stretch"
-msgstr "Étirement"
-
msgid "Stretch Shrink"
msgstr "Etirer-Réduire"
@@ -4457,6 +4760,9 @@ msgstr "Onglets Visibles"
msgid "Syntax Highlighter"
msgstr "Coloration syntaxique"
+msgid "Fit Content Height"
+msgstr "Ajuster à la hauteur du conteneur"
+
msgid "Draw"
msgstr "Dessiner"
@@ -4628,9 +4934,6 @@ msgstr "Anticrénelage"
msgid "Use Debanding"
msgstr "Utiliser le Debanding"
-msgid "Occlusion Culling"
-msgstr "Elagage de l'occlusion"
-
msgid "Atlas Size"
msgstr "Taille de l'Atlas"
@@ -4712,9 +5015,6 @@ msgstr "Taille Minimale"
msgid "Max Size"
msgstr "Taille maximale"
-msgid "Aspect"
-msgstr "Aspect"
-
msgid "Layer Names"
msgstr "Noms des couches"
@@ -5612,9 +5912,6 @@ msgstr "Début d'Expansion"
msgid "Grow End"
msgstr "Fin d'Expansion"
-msgid "Image"
-msgstr "Image"
-
msgid "Load Path"
msgstr "Charger chemin"
@@ -5639,6 +5936,9 @@ msgstr "De"
msgid "To"
msgstr "À"
+msgid "Frames"
+msgstr "Trames"
+
msgid "Current Frame"
msgstr "Trame actuelle"
@@ -5696,18 +5996,6 @@ msgstr "Carte de navigation"
msgid "Direct Space State"
msgstr "Etat de l'espace direct"
-msgid "Default Gravity"
-msgstr "Gravité par Défaut"
-
-msgid "Default Gravity Vector"
-msgstr "Vecteur de gravité par défaut"
-
-msgid "Default Cell Size"
-msgstr "Taille de cellule par défaut"
-
-msgid "Default Edge Connection Margin"
-msgstr "Marge de connexion des bords par défaut"
-
msgid "Fallback Environment"
msgstr "Environnement de repli"
@@ -5843,20 +6131,17 @@ msgstr "Compensation de retard vidéo (ms)"
msgid "Bus Count"
msgstr "Nombre de ports"
-msgid "Capture Device"
-msgstr "Périphérique de capture"
-
msgid "Feed"
msgstr "Flux"
msgid "Is Active"
msgstr "Est active"
-msgid "Sleep Threshold Linear"
-msgstr "Seuil linéaire de veille"
+msgid "Default Cell Size"
+msgstr "Taille de cellule par défaut"
-msgid "Sleep Threshold Angular"
-msgstr "Seuil angulaire de veille"
+msgid "Default Edge Connection Margin"
+msgstr "Marge de connexion des bords par défaut"
msgid "Inverse Mass"
msgstr "Masse inverse"
@@ -5885,6 +6170,18 @@ msgstr "Collisions avec les zones"
msgid "Shape RID"
msgstr "RID de forme"
+msgid "Default Gravity"
+msgstr "Gravité par Défaut"
+
+msgid "Default Gravity Vector"
+msgstr "Vecteur de gravité par défaut"
+
+msgid "Sleep Threshold Linear"
+msgstr "Seuil linéaire de veille"
+
+msgid "Sleep Threshold Angular"
+msgstr "Seuil angulaire de veille"
+
msgid "Physics Engine"
msgstr "Moteur physique"
@@ -5918,18 +6215,6 @@ msgstr "Boucle de rendu activée"
msgid "VRAM Compression"
msgstr "Compression VRAM"
-msgid "Import BPTC"
-msgstr "Importer BPTC"
-
-msgid "Import S3TC"
-msgstr "Importer S3TC"
-
-msgid "Import ETC"
-msgstr "Importer ETC"
-
-msgid "Import ETC2"
-msgstr "Importer ETC2"
-
msgid "Lossless Compression"
msgstr "Compression sans perte"
diff --git a/editor/translations/properties/it.po b/editor/translations/properties/it.po
index 07a23b2ceb..b68a503386 100644
--- a/editor/translations/properties/it.po
+++ b/editor/translations/properties/it.po
@@ -82,16 +82,16 @@ 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-01-15 13:34+0000\n"
-"Last-Translator: Damiano Guida <damiano.guida22@gmail.com>\n"
+"PO-Revision-Date: 2023-02-10 00:55+0000\n"
+"Last-Translator: gianmarco malandra <giamminho12@gmail.com>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/"
-"godot/it/>\n"
+"godot-properties/it/>\n"
"Language: it\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.15.1-dev\n"
+"X-Generator: Weblate 4.16-dev\n"
msgid "Application"
msgstr "Applicazione"
@@ -102,9 +102,15 @@ msgstr "Configurazione"
msgid "Name"
msgstr "Nome"
+msgid "Description"
+msgstr "Descrizione"
+
msgid "Run"
msgstr "Esegui"
+msgid "Main Scene"
+msgstr "Scena Principale"
+
msgid "Disable stdout"
msgstr "Disabilita stdout"
@@ -124,7 +130,7 @@ msgid "Project Settings Override"
msgstr "Sovrascrittura Impostazioni del Progetto"
msgid "Display"
-msgstr "Display"
+msgstr "Schermo"
msgid "Window"
msgstr "Finestra"
@@ -132,6 +138,9 @@ msgstr "Finestra"
msgid "Size"
msgstr "Dimensione"
+msgid "Mode"
+msgstr "Modalità"
+
msgid "Resizable"
msgstr "Ridimensionabile"
@@ -144,6 +153,9 @@ msgstr "Risparmio Energia"
msgid "Keep Screen On"
msgstr "Mantieni lo Schermo Acceso"
+msgid "Audio"
+msgstr "Audio"
+
msgid "Editor"
msgstr "Editor"
@@ -165,6 +177,9 @@ msgstr "Debug"
msgid "Settings"
msgstr "Impostazioni"
+msgid "Compression"
+msgstr "Compressione"
+
msgid "Crash Handler"
msgstr "Gestore di Crash"
@@ -174,6 +189,12 @@ msgstr "Messaggio"
msgid "Rendering"
msgstr "Renderer"
+msgid "Limits"
+msgstr "Limiti"
+
+msgid "GUI"
+msgstr "Interfaccia Grafica"
+
msgid "Low Processor Usage Mode"
msgstr "Modalità Processore a Basso Consumo"
@@ -273,6 +294,12 @@ msgstr "Valore Controller"
msgid "Big Endian"
msgstr "Big Endian"
+msgid "Network"
+msgstr "Reti"
+
+msgid "Page Size"
+msgstr "Dimensione Pagina"
+
msgid "Blocking Mode Enabled"
msgstr "Modalità Blocco Attivata"
@@ -309,15 +336,15 @@ msgstr "Percorso"
msgid "Data Array"
msgstr "Array di Dati"
-msgid "Blocking Handshake"
-msgstr "Blocco Handshake"
-
msgid "Max Pending Connections"
msgstr "Quantità Massima Connessioni in Attesa"
msgid "Offset"
msgstr "Scostamento"
+msgid "Cell Size"
+msgstr "Dimensione Cella"
+
msgid "Seed"
msgstr "Seme"
@@ -375,15 +402,6 @@ msgstr "Animazione"
msgid "Easing"
msgstr "Allentamento"
-msgid "Interface"
-msgstr "Interfaccia Utente"
-
-msgid "Editors"
-msgstr "Editori"
-
-msgid "Network"
-msgstr "Reti"
-
msgid "Remote Port"
msgstr "Porta Remota"
@@ -453,8 +471,8 @@ msgstr "Selezionato"
msgid "Keying"
msgstr "Tasti"
-msgid "Main Scene"
-msgstr "Scena Principale"
+msgid "Interface"
+msgstr "Interfaccia Utente"
msgid "Show Update Spinner"
msgstr "Mostra Rotella di Caricamento dell'Update"
@@ -753,6 +771,9 @@ msgstr "Dimensione dei caratteri della sezione d'assistenza codice sorgente"
msgid "Help Title Font Size"
msgstr "Dimensione Carattere Titolo della Guida"
+msgid "Editors"
+msgstr "Editori"
+
msgid "Grid Map"
msgstr "Mappa di Griglia"
@@ -1152,6 +1173,9 @@ msgstr "Password"
msgid "Compress"
msgstr "Comprimi"
+msgid "Transform"
+msgstr "Trasformazione"
+
msgid "Collada"
msgstr "Collada"
@@ -1179,9 +1203,6 @@ msgstr "Delimitatore"
msgid "Preload"
msgstr "Pre-carica"
-msgid "Mode"
-msgstr "Modalità"
-
msgid "Lossy Quality"
msgstr "Qualità Lossy"
@@ -1242,12 +1263,6 @@ msgstr "Ottimizzatore"
msgid "Max Angular Error"
msgstr "Errore Angolare Max"
-msgid "Compression"
-msgstr "Compressione"
-
-msgid "Page Size"
-msgstr "Dimensione Pagina"
-
msgid "Nodes"
msgstr "Nodi"
@@ -1353,6 +1368,9 @@ msgstr "Utilizza Threads"
msgid "Available URLs"
msgstr "URLs Disponibili"
+msgid "Unset"
+msgstr "Non Impostato"
+
msgid "Error"
msgstr "Errore"
@@ -1464,9 +1482,6 @@ msgstr "Threads"
msgid "Thread Model"
msgstr "Modello Thread"
-msgid "Audio"
-msgstr "Audio"
-
msgid "Handheld"
msgstr "Maneggiato"
@@ -1497,15 +1512,18 @@ msgstr "iOS"
msgid "Hide Home Indicator"
msgstr "Nascondi Indicatore Home"
+msgid "Input Devices"
+msgstr "Dispositivi Input"
+
+msgid "Pointing"
+msgstr "Puntamento"
+
msgid "Boot Splash"
msgstr "Sfondo Di Avvio"
msgid "BG Color"
msgstr "Colore Sfondo"
-msgid "Input Devices"
-msgstr "Dispositivi Input"
-
msgid "Environment"
msgstr "Ambiente"
@@ -1515,21 +1533,24 @@ msgstr "Colore Di Sfondo Di Default"
msgid "Show Image"
msgstr "Mostra Immagine"
+msgid "Image"
+msgstr "Immagine"
+
msgid "Fullsize"
msgstr "Dimensione Massima"
msgid "Use Filter"
msgstr "Usa Filtro"
+msgid "Icon"
+msgstr "Icona"
+
msgid "Buffering"
msgstr "Buffering"
msgid "Agile Event Flushing"
msgstr "Svuotamento degli eventi usando l'algoritmo Agile"
-msgid "Pointing"
-msgstr "Puntamento"
-
msgid "Emulate Touch From Mouse"
msgstr "Emula Tocco Da Mouse"
@@ -1554,12 +1575,15 @@ msgstr "Cartella di Soluzione"
msgid "Main Loop Type"
msgstr "Tipo di Loop Principale"
+msgid "Stretch"
+msgstr "Allarga"
+
+msgid "Aspect"
+msgstr "Aspetto"
+
msgid "Auto Accept Quit"
msgstr "Auto-Accetta Uscita"
-msgid "GUI"
-msgstr "Interfaccia Grafica"
-
msgid "Fonts"
msgstr "Font"
@@ -1569,6 +1593,9 @@ msgstr "Font Dinamici"
msgid "Use Oversampling"
msgstr "Usa Oversampling"
+msgid "Textures"
+msgstr "Textures"
+
msgid "Operation"
msgstr "Operazione"
@@ -1737,9 +1764,6 @@ msgstr "Nome Scena"
msgid "Root Nodes"
msgstr "Nodi Radice"
-msgid "Textures"
-msgstr "Textures"
-
msgid "Images"
msgstr "Immagini"
@@ -2013,9 +2037,6 @@ msgstr "Indirizzo locale IGD"
msgid "IGD Status"
msgstr "Stato IGD"
-msgid "Limits"
-msgstr "Limiti"
-
msgid "Handshake Timeout"
msgstr "Timeout Handshake"
@@ -2058,12 +2079,6 @@ msgstr "Primo Piano Adattivo 432 X 432"
msgid "Adaptive Background 432 X 432"
msgstr "Sfondo Adattivo 432 X 432"
-msgid "Custom Build"
-msgstr "Build Personalizzata"
-
-msgid "Use Custom Build"
-msgstr "Utilizza Build Personalizzata"
-
msgid "Export Format"
msgstr "Formato Esportazione"
@@ -2319,9 +2334,6 @@ msgstr "Architettura"
msgid "macOS"
msgstr "macOS"
-msgid "Icon"
-msgstr "Icona"
-
msgid "Copyright"
msgstr "Copyright"
@@ -2439,9 +2451,6 @@ msgstr "UWP"
msgid "Short Name"
msgstr "Nome Corto"
-msgid "Description"
-msgstr "Descrizione"
-
msgid "Publisher"
msgstr "Publisher"
@@ -2559,9 +2568,6 @@ msgstr "Multimesh"
msgid "Navigation Layers"
msgstr "Livelli Navigazione"
-msgid "Transform"
-msgstr "Trasformazione"
-
msgid "Rotation Degrees"
msgstr "Rotazione in Gradi"
@@ -2784,9 +2790,6 @@ msgstr "Passo"
msgid "Page"
msgstr "Pagina"
-msgid "Stretch"
-msgstr "Allarga"
-
msgid "Current Tab"
msgstr "Scheda Attuale"
@@ -2841,9 +2844,6 @@ msgstr "Schermo Attuale"
msgid "Min Size"
msgstr "Dimensione Min"
-msgid "Aspect"
-msgstr "Aspetto"
-
msgid "Format"
msgstr "Formato"
@@ -2874,6 +2874,12 @@ msgstr "Cursore"
msgid "Node"
msgstr "Nodo"
+msgid "Sky"
+msgstr "Cielo"
+
+msgid "Ambient Light"
+msgstr "Luce Ambientale"
+
msgid "Source"
msgstr "Sorgente"
@@ -2946,9 +2952,6 @@ msgstr "In Basso A Destra"
msgid "Bottom Left"
msgstr "In Basso A Sinistra"
-msgid "Image"
-msgstr "Immagine"
-
msgid "Atlas"
msgstr "Atlas"
diff --git a/editor/translations/properties/ja.po b/editor/translations/properties/ja.po
index cb921b2f8a..60b30d9404 100644
--- a/editor/translations/properties/ja.po
+++ b/editor/translations/properties/ja.po
@@ -52,16 +52,16 @@ 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-01-20 10:19+0000\n"
-"Last-Translator: T K <kidaaam@gmail.com>\n"
+"PO-Revision-Date: 2023-02-10 00:55+0000\n"
+"Last-Translator: Saitos <purifyzombie@gmail.com>\n"
"Language-Team: Japanese <https://hosted.weblate.org/projects/godot-engine/"
-"godot/ja/>\n"
+"godot-properties/ja/>\n"
"Language: ja\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.15.1\n"
+"X-Generator: Weblate 4.16-dev\n"
msgid "Application"
msgstr "アプリケーション"
@@ -72,9 +72,15 @@ msgstr "構æˆ"
msgid "Name"
msgstr "åå‰"
+msgid "Description"
+msgstr "説明"
+
msgid "Run"
msgstr "実行"
+msgid "Main Scene"
+msgstr "メインシーン"
+
msgid "Disable stdout"
msgstr "stdoutを無効化"
@@ -102,6 +108,9 @@ msgstr "ウィンドウ"
msgid "Size"
msgstr "サイズ"
+msgid "Mode"
+msgstr "モード"
+
msgid "Resizable"
msgstr "サイズを変更å¯èƒ½"
@@ -114,6 +123,9 @@ msgstr "çœã‚¨ãƒãƒ«ã‚®ãƒ¼"
msgid "Keep Screen On"
msgstr "ç”»é¢ã‚’常ã«ç‚¹ç¯"
+msgid "Audio"
+msgstr "オーディオ"
+
msgid "Editor"
msgstr "エディター"
@@ -135,6 +147,9 @@ msgstr "デãƒãƒƒã‚°"
msgid "Settings"
msgstr "設定"
+msgid "Compression"
+msgstr "圧縮"
+
msgid "Crash Handler"
msgstr "クラッシュãƒãƒ³ãƒ‰ãƒ©ãƒ¼"
@@ -144,6 +159,24 @@ msgstr "メッセージ"
msgid "Rendering"
msgstr "レンダリング"
+msgid "Occlusion Culling"
+msgstr "オクルージョンカリング"
+
+msgid "Limits"
+msgstr "制é™"
+
+msgid "Force Right to Left Layout Direction"
+msgstr "レイアウト方å‘ã‚’å³ã‹ã‚‰å·¦ã«å¼·åˆ¶"
+
+msgid "GUI"
+msgstr "GUI"
+
+msgid "Vulkan"
+msgstr "Vulkan"
+
+msgid "Max Descriptors per Pool"
+msgstr "プールã‚ãŸã‚Šã®æœ€å¤§è¨˜è¿°å­æ•°"
+
msgid "Low Processor Usage Mode"
msgstr "プロセッサー低使用率モード"
@@ -168,9 +201,15 @@ msgstr "è“„ç©ã•ã‚ŒãŸå…¥åŠ›ã‚’使用"
msgid "Device"
msgstr "デãƒã‚¤ã‚¹"
+msgid "Command or Control Autoremap"
+msgstr "コマンドã¾ãŸã¯ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ã®è‡ªå‹•å†ãƒžãƒƒãƒ—"
+
msgid "Pressed"
msgstr "押下"
+msgid "Keycode"
+msgstr "キーコード"
+
msgid "Unicode"
msgstr "Unicode"
@@ -192,6 +231,9 @@ msgstr "ä¿‚æ•°"
msgid "Button Index"
msgstr "ボタンã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹"
+msgid "Double Click"
+msgstr "ダブルクリック"
+
msgid "Tilt"
msgstr "傾ã"
@@ -243,6 +285,12 @@ msgstr "コントローラー値"
msgid "Big Endian"
msgstr "ビッグエンディアン"
+msgid "Network"
+msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯"
+
+msgid "Page Size"
+msgstr "ページサイズ"
+
msgid "Blocking Mode Enabled"
msgstr "ブロッキングモードを有効化"
@@ -279,9 +327,6 @@ msgstr "パス"
msgid "Data Array"
msgstr "データé…列"
-msgid "Blocking Handshake"
-msgstr "ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’ブロッキング処ç†ã«ã™ã‚‹"
-
msgid "Max Pending Connections"
msgstr "ä¿ç•™ä¸­ã®æŽ¥ç¶šæ•°ã®ä¸Šé™"
@@ -300,6 +345,18 @@ msgstr "状態"
msgid "Source Code"
msgstr "ソースコード"
+msgid "TLS"
+msgstr "TLS"
+
+msgid "Worker Pool"
+msgstr "ワーカープール"
+
+msgid "Use System Threads for Low Priority Tasks"
+msgstr "優先度ã®ä½Žã„タスクã«ã‚·ã‚¹ãƒ†ãƒ ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’使用"
+
+msgid "Low Priority Thread Ratio"
+msgstr "優先度ã®ä½Žã„スレッドã®æ¯”率"
+
msgid "Locale"
msgstr "ロケール"
@@ -309,6 +366,9 @@ msgstr "テスト"
msgid "Fallback"
msgstr "フォールãƒãƒƒã‚¯"
+msgid "Fake BiDi"
+msgstr "å½ã®BiDi"
+
msgid "Override"
msgstr "上書ã"
@@ -345,15 +405,6 @@ msgstr "アニメーション"
msgid "Easing"
msgstr "イージング"
-msgid "Interface"
-msgstr "インターフェース"
-
-msgid "Editors"
-msgstr "エディター"
-
-msgid "Network"
-msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯"
-
msgid "Remote Port"
msgstr "リモートãƒãƒ¼ãƒˆ"
@@ -423,8 +474,8 @@ msgstr "ãƒã‚§ãƒƒã‚¯æ¸ˆã¿"
msgid "Keying"
msgstr "キーイング"
-msgid "Main Scene"
-msgstr "メインシーン"
+msgid "Interface"
+msgstr "インターフェース"
msgid "Show Update Spinner"
msgstr "アップデートスピナーを表示"
@@ -486,6 +537,12 @@ msgstr "エディターã®è¨€èªž"
msgid "Display Scale"
msgstr "表示スケール"
+msgid "Enable Pseudolocalization"
+msgstr "擬似ローカライズã®æœ‰åŠ¹åŒ–"
+
+msgid "Use Embedded Menu"
+msgstr "埋ã‚è¾¼ã¿ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’使用"
+
msgid "Custom Display Scale"
msgstr "カスタムã®è¡¨ç¤ºã‚¹ã‚±ãƒ¼ãƒ«"
@@ -495,9 +552,18 @@ msgstr "メインã®ãƒ•ã‚©ãƒ³ãƒˆã‚µã‚¤ã‚º"
msgid "Code Font Size"
msgstr "コードã®ãƒ•ã‚©ãƒ³ãƒˆã‚µã‚¤ã‚º"
+msgid "Code Font Contextual Ligatures"
+msgstr "コードフォントコンテキストåˆå­—"
+
+msgid "Code Font Custom OpenType Features"
+msgstr "コードフォントカスタムOpenType機能"
+
msgid "Font Hinting"
msgstr "フォントã®ãƒ’ンティング"
+msgid "Font Subpixel Positioning"
+msgstr "フォントサブピクセルã®é…ç½®"
+
msgid "Main Font"
msgstr "メインã®ãƒ•ã‚©ãƒ³ãƒˆ"
@@ -522,6 +588,15 @@ msgstr "自動的ã«ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆã‚’é–‹ã"
msgid "Mouse Extra Buttons Navigate History"
msgstr "マウスã®è¿½åŠ ãƒœã‚¿ãƒ³ã§å±¥æ­´ã‚’表示"
+msgid "Accept Dialog Cancel OK Buttons"
+msgstr "確èªãƒ€ã‚¤ã‚¢ãƒ­ã‚°ã‚­ãƒ£ãƒ³ã‚»ãƒ«OKボタン"
+
+msgid "Show Internal Errors in Toast Notifications"
+msgstr "Toast通知ã«å†…部エラーを表示"
+
+msgid "Show Low Level OpenType Features"
+msgstr "低レベルã®OpenType機能を表示"
+
msgid "Theme"
msgstr "テーマ"
@@ -537,6 +612,9 @@ msgstr "アクセントカラー"
msgid "Contrast"
msgstr "コントラスト"
+msgid "Draw Extra Borders"
+msgstr "エクストラボーダーをæç”»"
+
msgid "Relationship Line Opacity"
msgstr "関係線ã®ä¸é€æ˜Žåº¦"
@@ -555,6 +633,9 @@ msgstr "スクリプトボタンを表示"
msgid "FileSystem"
msgstr "ファイルシステム"
+msgid "Vector Image Editor"
+msgstr "ベクター画åƒã‚¨ãƒ‡ã‚£ã‚¿"
+
msgid "Directories"
msgstr "ディレクトリ"
@@ -603,6 +684,9 @@ msgstr "カラーテーマ"
msgid "Appearance"
msgstr "外観"
+msgid "Caret"
+msgstr "キャレット"
+
msgid "Caret Blink"
msgstr "キャレットã®ç‚¹æ»…"
@@ -612,6 +696,9 @@ msgstr "ç¾åœ¨ã®è¡Œã‚’ãƒã‚¤ãƒ©ã‚¤ãƒˆã™ã‚‹"
msgid "Highlight All Occurrences"
msgstr "ã™ã¹ã¦ã®å‡ºç¾ç®‡æ‰€ã‚’ãƒã‚¤ãƒ©ã‚¤ãƒˆã™ã‚‹"
+msgid "Guidelines"
+msgstr "ガイドライン"
+
msgid "Show Line Length Guidelines"
msgstr "è¡Œã®é•·ã•ã®ã‚¬ã‚¤ãƒ‰ç·šã‚’表示"
@@ -636,6 +723,9 @@ msgstr "ブックマークãƒãƒ¼ã‚’表示"
msgid "Show Info Gutter"
msgstr "情報ãƒãƒ¼ã‚’表示"
+msgid "Minimap"
+msgstr "ミニマップ"
+
msgid "Show Minimap"
msgstr "ミニマップを表示"
@@ -648,6 +738,9 @@ msgstr "コードã®æŠ˜ã‚ŠãŸãŸã¿"
msgid "Word Wrap"
msgstr "ワードラップ"
+msgid "Whitespace"
+msgstr "空白"
+
msgid "Draw Tabs"
msgstr "タブをæç”»"
@@ -657,9 +750,15 @@ msgstr "スペースをæç”»"
msgid "Line Spacing"
msgstr "行間隔"
+msgid "Behavior"
+msgstr "ビヘイビア"
+
msgid "Navigation"
msgstr "ナビゲーション"
+msgid "Move Caret on Right Click"
+msgstr "å³ã‚¯ãƒªãƒƒã‚¯ã§ã‚­ãƒ£ãƒ¬ãƒƒãƒˆã‚’移動"
+
msgid "Smooth Scrolling"
msgstr "スムーズスクロール"
@@ -723,6 +822,9 @@ msgstr "ヘルプã®ã‚½ãƒ¼ã‚¹ã®ãƒ•ã‚©ãƒ³ãƒˆã‚µã‚¤ã‚º"
msgid "Help Title Font Size"
msgstr "ヘルプã®ã‚¿ã‚¤ãƒˆãƒ«ã®ãƒ•ã‚©ãƒ³ãƒˆã‚µã‚¤ã‚º"
+msgid "Editors"
+msgstr "エディター"
+
msgid "Grid Map"
msgstr "グリッドマップ"
@@ -882,6 +984,12 @@ msgstr "ビューãƒãƒ¼ãƒˆã®ãƒœãƒ¼ãƒ€ãƒ¼ã®è‰²"
msgid "Constrain Editor View"
msgstr "エディタビューをæŸç¸›ã™ã‚‹"
+msgid "Sub Editors Panning Scheme"
+msgstr "サブエディターã®ãƒ‘ンニングスキーム"
+
+msgid "Animation Editors Panning Scheme"
+msgstr "アニメーションエディタã®ãƒ‘ンニングスキーム"
+
msgid "Simple Panning"
msgstr "簡易パンニングæ“作"
@@ -1122,9 +1230,30 @@ msgstr "ファイルサーãƒãƒ¼"
msgid "Password"
msgstr "パスワード"
+msgid "Multichannel Signed Distance Field"
+msgstr "マルãƒãƒãƒ£ãƒ³ãƒãƒ«ç¬¦å·ä»˜ãè·é›¢ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰"
+
+msgid "MSDF Pixel Range"
+msgstr "MSDF ピクセル範囲"
+
+msgid "Hinting"
+msgstr "ヒンティング"
+
+msgid "Subpixel Positioning"
+msgstr "サブピクセルã®é…ç½®"
+
+msgid "Oversampling"
+msgstr "オーãƒãƒ¼ã‚µãƒ³ãƒ—リング"
+
msgid "Compress"
msgstr "圧縮"
+msgid "Language"
+msgstr "言語:"
+
+msgid "Transform"
+msgstr "トランスフォーム"
+
msgid "Collada"
msgstr "Collada"
@@ -1143,21 +1272,18 @@ msgstr "フィルター"
msgid "Threshold"
msgstr "ã—ãã„値"
+msgid "Except Bone Transform"
+msgstr "ボーントランスフォームを除外"
+
msgid "Create From"
msgstr "作æˆå…ƒ"
msgid "Delimiter"
msgstr "区切り文字"
-msgid "Mode"
-msgstr "モード"
-
msgid "Lossy Quality"
msgstr "éžå¯é€†å“質"
-msgid "BPTC LDR"
-msgstr "BPTC LDR"
-
msgid "Mipmaps"
msgstr "ミップマップ"
@@ -1218,12 +1344,6 @@ msgstr "オプティマイザー(Optimizer)"
msgid "Max Angular Error"
msgstr "最大角度エラー"
-msgid "Compression"
-msgstr "圧縮"
-
-msgid "Page Size"
-msgstr "ページサイズ"
-
msgid "Nodes"
msgstr "ノード"
@@ -1329,6 +1449,9 @@ msgstr "スレッドを使用"
msgid "Available URLs"
msgstr "有効ãªURL"
+msgid "Unset"
+msgstr "未設定"
+
msgid "Error"
msgstr "エラー"
@@ -1428,9 +1551,6 @@ msgstr "スレッド"
msgid "Thread Model"
msgstr "スレッドモデル"
-msgid "Audio"
-msgstr "オーディオ"
-
msgid "Handheld"
msgstr "ãƒãƒ¼ã‚¿ãƒ–ル"
@@ -1461,15 +1581,21 @@ msgstr "iOS"
msgid "Hide Home Indicator"
msgstr "ホームインジケーターを隠ã™"
+msgid "Input Devices"
+msgstr "入力デãƒã‚¤ã‚¹"
+
+msgid "Pointing"
+msgstr "ãƒã‚¤ãƒ³ãƒ†ã‚£ãƒ³ã‚°"
+
+msgid "XR"
+msgstr "XR"
+
msgid "Boot Splash"
msgstr "ブートスプラッシュ"
msgid "BG Color"
msgstr "背景色"
-msgid "Input Devices"
-msgstr "入力デãƒã‚¤ã‚¹"
-
msgid "Environment"
msgstr "環境"
@@ -1479,21 +1605,24 @@ msgstr "デフォルトã®ã‚¯ãƒªã‚¢ãƒ¼è‰²"
msgid "Show Image"
msgstr "ç”»åƒã‚’表示"
+msgid "Image"
+msgstr "ç”»åƒ"
+
msgid "Fullsize"
msgstr "フルサイズ"
msgid "Use Filter"
msgstr "フィルターを使用"
+msgid "Icon"
+msgstr "アイコン"
+
msgid "Buffering"
msgstr "ãƒãƒƒãƒ•ã‚¡ãƒªãƒ³ã‚°"
msgid "Agile Event Flushing"
msgstr "å³åº§ã«ã‚¤ãƒ™ãƒ³ãƒˆãƒ•ãƒ©ãƒƒã‚·ãƒ¥"
-msgid "Pointing"
-msgstr "ãƒã‚¤ãƒ³ãƒ†ã‚£ãƒ³ã‚°"
-
msgid "Emulate Touch From Mouse"
msgstr "マウスã§ã‚¿ãƒƒãƒæ“作をエミュレート"
@@ -1521,12 +1650,15 @@ msgstr "ソリューションã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª"
msgid "Main Loop Type"
msgstr "メインループã®ã‚¿ã‚¤ãƒ—"
+msgid "Stretch"
+msgstr "ストレッãƒ"
+
+msgid "Aspect"
+msgstr "アスペクト"
+
msgid "Auto Accept Quit"
msgstr "プログラム終了を自動的ã«å—ã‘入れる"
-msgid "GUI"
-msgstr "GUI"
-
msgid "Fonts"
msgstr "フォント"
@@ -1536,6 +1668,9 @@ msgstr "ダイナミックフォント"
msgid "Use Oversampling"
msgstr "オーãƒãƒ¼ã‚µãƒ³ãƒ—リングを使用"
+msgid "Textures"
+msgstr "テクスãƒãƒ£"
+
msgid "Operation"
msgstr "æ“作"
@@ -1611,6 +1746,9 @@ msgstr "強度"
msgid "Range"
msgstr "範囲"
+msgid "Specular Factor"
+msgstr "é¡é¢åå°„ä¿‚æ•°"
+
msgid "Json"
msgstr "JSON"
@@ -1632,9 +1770,6 @@ msgstr "マテリアル"
msgid "Root Nodes"
msgstr "ルートノード"
-msgid "Textures"
-msgstr "テクスãƒãƒ£"
-
msgid "Images"
msgstr "ç”»åƒ"
@@ -1791,9 +1926,6 @@ msgstr "文字列"
msgid "Write Mode"
msgstr "書ãè¾¼ã¿ãƒ¢ãƒ¼ãƒ‰"
-msgid "Limits"
-msgstr "制é™"
-
msgid "WebRTC"
msgstr "WebRTC"
@@ -1944,9 +2076,6 @@ msgstr "アーキテクãƒãƒ£"
msgid "macOS"
msgstr "macOS"
-msgid "Icon"
-msgstr "アイコン"
-
msgid "Codesign"
msgstr "コード署å"
@@ -1974,9 +2103,6 @@ msgstr "表示å"
msgid "Short Name"
msgstr "略称"
-msgid "Description"
-msgstr "説明"
-
msgid "Publisher"
msgstr "パブリッシャー"
@@ -2055,6 +2181,9 @@ msgstr "HTTPホスト"
msgid "HTTP Port"
msgstr "HTTPãƒãƒ¼ãƒˆ"
+msgid "Variant"
+msgstr "ãƒãƒªã‚¢ãƒ³ãƒˆ"
+
msgid "VRAM Texture Compression"
msgstr "VRAMテクスãƒãƒ£åœ§ç¸®"
@@ -2100,18 +2229,12 @@ msgstr "ファイルã®èª¬æ˜Ž"
msgid "Trademarks"
msgstr "商標"
-msgid "Frames"
-msgstr "フレーム"
-
msgid "Frame"
msgstr "フレーム"
msgid "Speed Scale"
msgstr "スピードスケール"
-msgid "Playing"
-msgstr "実行中"
-
msgid "Centered"
msgstr "中央æƒãˆ"
@@ -2154,6 +2277,9 @@ msgstr "ボリューム dB"
msgid "Pitch Scale"
msgstr "ピッãƒã‚¹ã‚±ãƒ¼ãƒ«"
+msgid "Playing"
+msgstr "実行中"
+
msgid "Autoplay"
msgstr "自動å†ç”Ÿ"
@@ -2310,8 +2436,11 @@ msgstr "ボーダー"
msgid "Round Precision"
msgstr "丸ã‚精度"
-msgid "Transform"
-msgstr "トランスフォーム"
+msgid "Rotation Degrees"
+msgstr "回転角度"
+
+msgid "Global Rotation Degrees"
+msgstr "グローãƒãƒ«å›žè»¢è§’度"
msgid "Ignore Camera Zoom"
msgstr "カメラã®ã‚ºãƒ¼ãƒ ã‚’無視"
@@ -2454,6 +2583,9 @@ msgstr "ボーン"
msgid "Target"
msgstr "ターゲット"
+msgid "Simulation Precision"
+msgstr "シミュレーション精度"
+
msgid "Total Mass"
msgstr "ç·è³ªé‡"
@@ -2463,6 +2595,9 @@ msgstr "圧力係数"
msgid "Damping Coefficient"
msgstr "減衰係数"
+msgid "Wheel"
+msgstr "ホイール"
+
msgid "Travel"
msgstr "トラベル"
@@ -2481,6 +2616,9 @@ msgstr "終り"
msgid "Sync"
msgstr "åŒæœŸ"
+msgid "Request"
+msgstr "リクエスト"
+
msgid "Reset"
msgstr "リセット"
@@ -2505,12 +2643,18 @@ msgstr "ボタングループ"
msgid "Localization"
msgstr "ローカライズ"
+msgid "Focus"
+msgstr "フォーカス"
+
msgid "Next"
msgstr "次"
msgid "Previous"
msgstr "å‰"
+msgid "Default Cursor Shape"
+msgstr "デフォルトã®ã‚«ãƒ¼ã‚½ãƒ«å½¢çŠ¶"
+
msgid "Filters"
msgstr "フィルター"
@@ -2538,8 +2682,11 @@ msgstr "ステップ"
msgid "Page"
msgstr "ページ"
-msgid "Stretch"
-msgstr "ストレッãƒ"
+msgid "Progress Bar Delay"
+msgstr "プログレスãƒãƒ¼ã®ãƒ‡ã‚£ãƒ¬ã‚¤"
+
+msgid "Drag to Rearrange Enabled"
+msgstr "ドラッグã—ã¦å†é…ç½®å¯èƒ½"
msgid "Syntax Highlighter"
msgstr "シンタックスãƒã‚¤ãƒ©ã‚¤ãƒˆ"
@@ -2571,8 +2718,8 @@ msgstr "転é€ãƒãƒ£ãƒ³ãƒãƒ«"
msgid "Current Scene"
msgstr "ç¾åœ¨ã®ã‚·ãƒ¼ãƒ³"
-msgid "Occlusion Culling"
-msgstr "オクルージョンカリング"
+msgid "Screen Space AA"
+msgstr "スクリーンスペースAA"
msgid "Wait Time"
msgstr "待機時間"
@@ -2592,9 +2739,6 @@ msgstr "入力無効化"
msgid "Current Screen"
msgstr "ç¾åœ¨ã®ç”»é¢"
-msgid "Aspect"
-msgstr "アスペクト"
-
msgid "2D Physics"
msgstr "2D物ç†"
@@ -2643,6 +2787,9 @@ msgstr "分離"
msgid "Cursor"
msgstr "カーソル"
+msgid "Screen Picker"
+msgstr "スクリーンピッカー"
+
msgid "Node"
msgstr "ノード"
@@ -2664,6 +2811,9 @@ msgstr "ブルーム"
msgid "Fog"
msgstr "フォグ"
+msgid "Color Correction"
+msgstr "色補正"
+
msgid "Features"
msgstr "機能"
@@ -2697,6 +2847,15 @@ msgstr "アイテム"
msgid "Preview"
msgstr "プレビュー"
+msgid "Transform Format"
+msgstr "変æ›å½¢å¼"
+
+msgid "Transform Array"
+msgstr "Transformã®é…列"
+
+msgid "Parsed Geometry Type"
+msgstr "解æžã•ã‚ŒãŸã‚¸ã‚ªãƒ¡ãƒˆãƒªåž‹"
+
msgid "B"
msgstr "B"
@@ -2724,12 +2883,12 @@ msgstr "å³ä¸‹"
msgid "Bottom Left"
msgstr "左下"
-msgid "Image"
-msgstr "ç”»åƒ"
-
msgid "Use HDR"
msgstr "HDRを使用"
+msgid "Frames"
+msgstr "フレーム"
+
msgid "Transpose"
msgstr "行列(縦横)入れ替ãˆ"
@@ -2739,6 +2898,9 @@ msgstr "コンスタント"
msgid "Function"
msgstr "関数"
+msgid "Degrees Mode"
+msgstr "角度モード"
+
msgid "Pan"
msgstr "パン"
@@ -2769,6 +2931,9 @@ msgstr "FFTサイズ"
msgid "High-pass"
msgstr "ãƒã‚¤ãƒ‘ス"
+msgid "Time Pullout (ms)"
+msgstr "タイムプルアウト(ミリ秒)"
+
msgid "Surround"
msgstr "サラウンド"
@@ -2790,24 +2955,15 @@ msgstr "フラグメント"
msgid "Unshaded"
msgstr "シェーディングãªã—ã§"
+msgid "Ensure Correct Normals"
+msgstr "æ­£ã—ã„法線を確ä¿"
+
msgid "Vertex Lighting"
msgstr "頂点ライティング"
msgid "VRAM Compression"
msgstr "VRAM圧縮"
-msgid "Import BPTC"
-msgstr "BPTCをインãƒãƒ¼ãƒˆ"
-
-msgid "Import S3TC"
-msgstr "S3TCをインãƒãƒ¼ãƒˆ"
-
-msgid "Import ETC"
-msgstr "ETCをインãƒãƒ¼ãƒˆ"
-
-msgid "Import ETC2"
-msgstr "ETC2をインãƒãƒ¼ãƒˆ"
-
msgid "Lossless Compression"
msgstr "ロスレス圧縮"
diff --git a/editor/translations/properties/ko.po b/editor/translations/properties/ko.po
index de9268d577..9118036e30 100644
--- a/editor/translations/properties/ko.po
+++ b/editor/translations/properties/ko.po
@@ -47,16 +47,16 @@ 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-01-20 10:19+0000\n"
-"Last-Translator: 오지훈 <jule1130@naver.com>\n"
+"PO-Revision-Date: 2023-02-09 15:26+0000\n"
+"Last-Translator: ì´ì •í¬ <daemul72@gmail.com>\n"
"Language-Team: Korean <https://hosted.weblate.org/projects/godot-engine/"
-"godot/ko/>\n"
+"godot-properties/ko/>\n"
"Language: ko\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.15.1\n"
+"X-Generator: Weblate 4.16-dev\n"
msgid "Application"
msgstr "어플리케ì´ì…˜"
@@ -67,9 +67,15 @@ msgstr "구성"
msgid "Name"
msgstr "ì´ë¦„"
+msgid "Description"
+msgstr "설명"
+
msgid "Run"
msgstr "실행"
+msgid "Main Scene"
+msgstr "ë©”ì¸ ì”¬"
+
msgid "Disable stdout"
msgstr "표준 출력 비활성화"
@@ -97,6 +103,9 @@ msgstr "ì°½"
msgid "Size"
msgstr "í¬ê¸°"
+msgid "Mode"
+msgstr "모드"
+
msgid "Resizable"
msgstr "í¬ê¸° ì¡°ì ˆ 가능한"
@@ -109,6 +118,9 @@ msgstr "ì—너지 절약"
msgid "Keep Screen On"
msgstr "화면 í•­ìƒ í™œì„±í™”"
+msgid "Audio"
+msgstr "오디오"
+
msgid "Editor"
msgstr "ì—디터"
@@ -130,6 +142,9 @@ msgstr "디버그"
msgid "Settings"
msgstr "설정"
+msgid "Compression"
+msgstr "압축"
+
msgid "Crash Handler"
msgstr "ì¶©ëŒ ì²˜ë¦¬ê¸°"
@@ -139,6 +154,12 @@ msgstr "메시지"
msgid "Rendering"
msgstr "ë Œë”ë§"
+msgid "Limits"
+msgstr "제한"
+
+msgid "GUI"
+msgstr "GUI"
+
msgid "Low Processor Usage Mode"
msgstr "저사양 모드"
@@ -238,6 +259,12 @@ msgstr "컨트롤러 값"
msgid "Big Endian"
msgstr "빅 엔디안"
+msgid "Network"
+msgstr "네트워í¬"
+
+msgid "Page Size"
+msgstr "페ì´ì§€ í¬ê¸°"
+
msgid "Blocking Mode Enabled"
msgstr "Blocking 모드 활성화"
@@ -274,9 +301,6 @@ msgstr "경로"
msgid "Data Array"
msgstr "ë°ì´í„° ë°°ì—´"
-msgid "Blocking Handshake"
-msgstr "Handshake 차단"
-
msgid "Max Pending Connections"
msgstr "최대 대기 ì¤‘ì¸ ì—°ê²° 수"
@@ -343,15 +367,6 @@ msgstr "애니메ì´ì…˜"
msgid "Easing"
msgstr "ì†ë„ 완화"
-msgid "Interface"
-msgstr "ì¸í„°íŽ˜ì´ìŠ¤"
-
-msgid "Editors"
-msgstr "ì—디터"
-
-msgid "Network"
-msgstr "네트워í¬"
-
msgid "Remote Port"
msgstr "ì›ê²© í¬íŠ¸"
@@ -421,8 +436,8 @@ msgstr "확ì¸ë¨"
msgid "Keying"
msgstr "키 ê°’ ìƒì„±"
-msgid "Main Scene"
-msgstr "ë©”ì¸ ì”¬"
+msgid "Interface"
+msgstr "ì¸í„°íŽ˜ì´ìŠ¤"
msgid "Show Update Spinner"
msgstr "ì—…ë°ì´íŠ¸ 스피너 표시"
@@ -724,6 +739,9 @@ msgstr "소스 í°íŠ¸ í¬ê¸° ë„우미"
msgid "Help Title Font Size"
msgstr "제목 í°íŠ¸ í¬ê¸° ë„우미"
+msgid "Editors"
+msgstr "ì—디터"
+
msgid "Grid Map"
msgstr "그리드맵"
@@ -1126,6 +1144,9 @@ msgstr "비밀번호"
msgid "Compress"
msgstr "컴프레스"
+msgid "Transform"
+msgstr "변형"
+
msgid "Collada"
msgstr "COLLADA"
@@ -1150,15 +1171,9 @@ msgstr "다ìŒì—ì„œ 만들기"
msgid "Delimiter"
msgstr "디리미터"
-msgid "Mode"
-msgstr "모드"
-
msgid "Lossy Quality"
msgstr "ì†ì‹¤ 품질"
-msgid "BPTC LDR"
-msgstr "BPTC LDR"
-
msgid "Mipmaps"
msgstr "밉맵"
@@ -1201,6 +1216,9 @@ msgstr "오í´ë£¨ë”"
msgid "Enabled"
msgstr "활성화ë¨"
+msgid "Normal Merge Angle"
+msgstr "ì •ìƒì ì¸ 병합 ê°ë„"
+
msgid "Loop Mode"
msgstr "루프 모드"
@@ -1213,12 +1231,6 @@ msgstr "최ì í™” ë„구"
msgid "Max Angular Error"
msgstr "최대 ê°ë„ 오류"
-msgid "Compression"
-msgstr "압축"
-
-msgid "Page Size"
-msgstr "페ì´ì§€ í¬ê¸°"
-
msgid "Nodes"
msgstr "노드"
@@ -1441,9 +1453,6 @@ msgstr "스레드"
msgid "Thread Model"
msgstr "스레드 모ë¸"
-msgid "Audio"
-msgstr "오디오"
-
msgid "Handheld"
msgstr "휴대용"
@@ -1474,15 +1483,18 @@ msgstr "iOS"
msgid "Hide Home Indicator"
msgstr "홈 표시기 숨기기"
+msgid "Input Devices"
+msgstr "입력 장치"
+
+msgid "Pointing"
+msgstr "í¬ì¸íŒ…"
+
msgid "Boot Splash"
msgstr "부트 스플래쉬"
msgid "BG Color"
msgstr "배경색"
-msgid "Input Devices"
-msgstr "입력 장치"
-
msgid "Environment"
msgstr "환경"
@@ -1492,21 +1504,24 @@ msgstr "기본 í´ë¦¬ì–´ 컬러"
msgid "Show Image"
msgstr "ì´ë¯¸ì§€ 표시"
+msgid "Image"
+msgstr "ì˜ìƒ"
+
msgid "Fullsize"
msgstr "ì „ì²´ í¬ê¸°"
msgid "Use Filter"
msgstr "필터 사용"
+msgid "Icon"
+msgstr "ì•„ì´ì½˜"
+
msgid "Buffering"
msgstr "버í¼ë§"
msgid "Agile Event Flushing"
msgstr "ì• ìžì¼ ì´ë²¤íŠ¸ 플러싱"
-msgid "Pointing"
-msgstr "í¬ì¸íŒ…"
-
msgid "Emulate Touch From Mouse"
msgstr "마우스 터치 ì—뮬레ì´íŠ¸"
@@ -1534,12 +1549,15 @@ msgstr "솔루션 디렉토리"
msgid "Main Loop Type"
msgstr "ë©”ì¸ ë£¨í”„ 유형"
+msgid "Stretch"
+msgstr "스트레치"
+
+msgid "Aspect"
+msgstr "ì–‘ìƒ"
+
msgid "Auto Accept Quit"
msgstr "ìžë™ ìˆ˜ë½ ì¢…ë£Œ"
-msgid "GUI"
-msgstr "GUI"
-
msgid "Fonts"
msgstr "글꼴"
@@ -1549,6 +1567,9 @@ msgstr "ë™ì  글꼴"
msgid "Use Oversampling"
msgstr "ì˜¤ë²„ìƒ˜í”Œë§ ì‚¬ìš©"
+msgid "Textures"
+msgstr "í…스처"
+
msgid "Operation"
msgstr "오í¼ë ˆì´ì…˜"
@@ -1726,9 +1747,6 @@ msgstr "씬 ì´ë¦„"
msgid "Root Nodes"
msgstr "루트 노드"
-msgid "Textures"
-msgstr "í…스처"
-
msgid "Images"
msgstr "ì´ë¯¸ì§€"
@@ -1957,6 +1975,9 @@ msgstr "세심함"
msgid "Return Type"
msgstr "반환 유형"
+msgid "Fractal Octaves"
+msgstr "프랙털 옥타브"
+
msgid "Width"
msgstr "너비"
@@ -2008,9 +2029,6 @@ msgstr "IGD ìš°ë¦¬ì˜ ì£¼ì†Œ"
msgid "IGD Status"
msgstr "IGD ìƒíƒœ"
-msgid "Limits"
-msgstr "제한"
-
msgid "WebRTC"
msgstr "WebRTC"
@@ -2056,15 +2074,9 @@ msgstr "Wi-Fi ì—°ê²°"
msgid "Push Notifications"
msgstr "푸시 알림"
-msgid "Icon"
-msgstr "ì•„ì´ì½˜"
-
msgid "Location"
msgstr "위치"
-msgid "Description"
-msgstr "설명"
-
msgid "Algorithm"
msgstr "알고리즘"
@@ -2128,6 +2140,12 @@ msgstr "색ìƒ"
msgid "Angular Velocity"
msgstr "ê°ì†ë„"
+msgid "Accel Min"
+msgstr "최소 ê°€ì†ë„"
+
+msgid "Accel Max"
+msgstr "최대 ê°€ì†ë„"
+
msgid "Path Max Distance"
msgstr "경로 최대 거리"
@@ -2137,9 +2155,6 @@ msgstr "내비게ì´ì…˜ ë ˆì´ì–´"
msgid "Max Speed"
msgstr "최대 ì†ë„"
-msgid "Transform"
-msgstr "변형"
-
msgid "Rotation Degrees"
msgstr "회전 ê°ë„"
@@ -2266,6 +2281,9 @@ msgstr "버튼 그룹"
msgid "Localization"
msgstr "현지화"
+msgid "Auto Translate"
+msgstr "ìžë™ 옮기기"
+
msgid "Next"
msgstr "다ìŒ"
@@ -2290,9 +2308,6 @@ msgstr "ì•„ì´ì½˜ 모드"
msgid "Step"
msgstr "단계"
-msgid "Stretch"
-msgstr "스트레치"
-
msgid "Syntax Highlighter"
msgstr "구문 강조"
@@ -2323,8 +2338,11 @@ msgstr "현재 화면"
msgid "Max Size"
msgstr "최대 í¬ê¸°"
-msgid "Aspect"
-msgstr "ì–‘ìƒ"
+msgid "2D Physics"
+msgstr "2D 물리"
+
+msgid "3D Physics"
+msgstr "3D 물리"
msgid "Format"
msgstr "형ì‹"
@@ -2413,9 +2431,6 @@ msgstr "오른쪽 아래"
msgid "Bottom Left"
msgstr "왼쪽 아래"
-msgid "Image"
-msgstr "ì˜ìƒ"
-
msgid "Transpose"
msgstr "행렬 맞바꾸기"
diff --git a/editor/translations/properties/pt.po b/editor/translations/properties/pt.po
index caad6ec3fe..f072375d33 100644
--- a/editor/translations/properties/pt.po
+++ b/editor/translations/properties/pt.po
@@ -57,9 +57,15 @@ msgstr "Configurações"
msgid "Name"
msgstr "Nome"
+msgid "Description"
+msgstr "Descrição"
+
msgid "Run"
msgstr "Executar"
+msgid "Main Scene"
+msgstr "Cena Principal"
+
msgid "Disable stdout"
msgstr "Desativar stdout"
@@ -87,6 +93,9 @@ msgstr "Janela"
msgid "Size"
msgstr "Tamanho"
+msgid "Mode"
+msgstr "Modo"
+
msgid "Resizable"
msgstr "Redimensionável"
@@ -102,6 +111,9 @@ msgstr "Economia de Energia"
msgid "Keep Screen On"
msgstr "Manter Tela Ligada"
+msgid "Audio"
+msgstr "Ãudio"
+
msgid "Editor"
msgstr "Editor"
@@ -123,6 +135,9 @@ msgstr "Depurar"
msgid "Settings"
msgstr "Configurações"
+msgid "Compression"
+msgstr "Compressão"
+
msgid "Crash Handler"
msgstr "Gerenciador de Falhas"
@@ -132,6 +147,12 @@ msgstr "Mensagem"
msgid "Rendering"
msgstr "Renderizar"
+msgid "Limits"
+msgstr "Limites"
+
+msgid "GUI"
+msgstr "Interface Gráfica"
+
msgid "Low Processor Usage Mode"
msgstr "Modo de Baixa Utilização do Processador"
@@ -231,6 +252,12 @@ msgstr "Valor do Controlador"
msgid "Big Endian"
msgstr "Grande Endian"
+msgid "Network"
+msgstr "Rede"
+
+msgid "Page Size"
+msgstr "Tamanho da Página"
+
msgid "Blocking Mode Enabled"
msgstr "Modo de Bloqueio Ativado"
@@ -267,9 +294,6 @@ msgstr "Caminho"
msgid "Data Array"
msgstr "Lista de dados"
-msgid "Blocking Handshake"
-msgstr "Bloquear Handshake"
-
msgid "Max Pending Connections"
msgstr "Max Conexões Pendentes"
@@ -342,15 +366,6 @@ msgstr "Animação"
msgid "Easing"
msgstr "Flexibilização"
-msgid "Interface"
-msgstr "Interface"
-
-msgid "Editors"
-msgstr "Editores"
-
-msgid "Network"
-msgstr "Rede"
-
msgid "Remote Port"
msgstr "Porta Remota"
@@ -420,8 +435,8 @@ msgstr "Item Marcado"
msgid "Keying"
msgstr "Executar"
-msgid "Main Scene"
-msgstr "Cena Principal"
+msgid "Interface"
+msgstr "Interface"
msgid "Show Update Spinner"
msgstr "Mostra Ãcone de Atualização"
@@ -726,6 +741,9 @@ msgstr "Tamanho da Fonte de Código de Ajuda"
msgid "Help Title Font Size"
msgstr "Tamanho da Fonte do Título da Ajuda"
+msgid "Editors"
+msgstr "Editores"
+
msgid "Grid Map"
msgstr "Mapa de grelha"
@@ -1137,6 +1155,9 @@ msgstr "Tamanho do Contorno"
msgid "Variation"
msgstr "Variação"
+msgid "Transform"
+msgstr "Transformar"
+
msgid "Collada"
msgstr "Collada"
@@ -1164,15 +1185,9 @@ msgstr "Delimitador"
msgid "Preload"
msgstr "Pré-carregar"
-msgid "Mode"
-msgstr "Modo"
-
msgid "Lossy Quality"
msgstr "Qualidade com Perdas"
-msgid "BPTC LDR"
-msgstr "BPTC LDR"
-
msgid "Mipmaps"
msgstr "Mipmaps"
@@ -1236,12 +1251,6 @@ msgstr "Otimizador"
msgid "Max Angular Error"
msgstr "Máximo de Erros Angulares"
-msgid "Compression"
-msgstr "Compressão"
-
-msgid "Page Size"
-msgstr "Tamanho da Página"
-
msgid "Nodes"
msgstr "Nós"
@@ -1467,9 +1476,6 @@ msgstr "Threads"
msgid "Thread Model"
msgstr "Modelo de Thread"
-msgid "Audio"
-msgstr "Ãudio"
-
msgid "Handheld"
msgstr "Portátil"
@@ -1500,15 +1506,18 @@ msgstr "iOS"
msgid "Hide Home Indicator"
msgstr "Esconder Indicador de Home"
+msgid "Input Devices"
+msgstr "Dispositivos de Entrada"
+
+msgid "Pointing"
+msgstr "Pontuação"
+
msgid "Boot Splash"
msgstr "Plano de Fundo de Inicialização"
msgid "BG Color"
msgstr "Cor de Fundo"
-msgid "Input Devices"
-msgstr "Dispositivos de Entrada"
-
msgid "Environment"
msgstr "Ambiente"
@@ -1518,21 +1527,24 @@ msgstr "Cor Clara Padrão"
msgid "Show Image"
msgstr "Mostrar Imagem"
+msgid "Image"
+msgstr "Imagem"
+
msgid "Fullsize"
msgstr "Tamanho Máximo"
msgid "Use Filter"
msgstr "Usar Filtro"
+msgid "Icon"
+msgstr "Ãcone"
+
msgid "Buffering"
msgstr "Buffering"
msgid "Agile Event Flushing"
msgstr "Liberação Ãgil de Eventos"
-msgid "Pointing"
-msgstr "Pontuação"
-
msgid "Emulate Touch From Mouse"
msgstr "Emular Toque do Rato"
@@ -1560,12 +1572,15 @@ msgstr "Diretório da Solução"
msgid "Main Loop Type"
msgstr "Tipo de Loop Principal"
+msgid "Stretch"
+msgstr "Esticar"
+
+msgid "Aspect"
+msgstr "Aspecto"
+
msgid "Auto Accept Quit"
msgstr "Auto Aceitar Sair"
-msgid "GUI"
-msgstr "Interface Gráfica"
-
msgid "Fonts"
msgstr "Fontes"
@@ -1575,6 +1590,9 @@ msgstr "Fontes Dinâmicas"
msgid "Use Oversampling"
msgstr "Usar Sobreamostragem"
+msgid "Textures"
+msgstr "Texturas"
+
msgid "Operation"
msgstr "Operação"
@@ -1752,9 +1770,6 @@ msgstr "Nome da Cena"
msgid "Root Nodes"
msgstr "Nós Raízes"
-msgid "Textures"
-msgstr "Texturas"
-
msgid "Images"
msgstr "Imagens"
@@ -2043,9 +2058,6 @@ msgstr "Estado do IGD"
msgid "Write Mode"
msgstr "Modo de Escrita"
-msgid "Limits"
-msgstr "Limites"
-
msgid "WebRTC"
msgstr "WebRTC"
@@ -2100,12 +2112,6 @@ msgstr "Primeiro Plano Adaptável 432 X 432"
msgid "Adaptive Background 432 X 432"
msgstr "Plano de Fundo Adaptável 432 X 432"
-msgid "Custom Build"
-msgstr "Build Personalizada"
-
-msgid "Use Custom Build"
-msgstr "Usar Compilação Personalizada"
-
msgid "Export Format"
msgstr "Exportar Formato"
@@ -2370,9 +2376,6 @@ msgstr "Arquitetura"
msgid "macOS"
msgstr "macOS"
-msgid "Icon"
-msgstr "Ãcone"
-
msgid "Copyright"
msgstr "Direitos Autorais"
@@ -2475,9 +2478,6 @@ msgstr "Nome de Exibição"
msgid "Short Name"
msgstr "Nome Curto"
-msgid "Description"
-msgstr "Descrição"
-
msgid "Publisher"
msgstr "Publicadora"
@@ -2610,18 +2610,12 @@ msgstr "Descrição do Ficheiro"
msgid "Trademarks"
msgstr "Marca Registada (Trademarks)"
-msgid "Frames"
-msgstr "Quadros"
-
msgid "Frame"
msgstr "Quadro"
msgid "Speed Scale"
msgstr "Escalonamento da Velocidade"
-msgid "Playing"
-msgstr "A executar"
-
msgid "Centered"
msgstr "Centralizado"
@@ -2652,6 +2646,9 @@ msgstr "Volume dB (decibéis)"
msgid "Pitch Scale"
msgstr "Escalonamento de Pitch"
+msgid "Playing"
+msgstr "A executar"
+
msgid "Autoplay"
msgstr "Reproduzir automaticamente"
@@ -2859,9 +2856,6 @@ msgstr "Velocidade Máxima"
msgid "Estimate Radius"
msgstr "Raio Estimado"
-msgid "Transform"
-msgstr "Transformar"
-
msgid "Rotation Degrees"
msgstr "Graus de Rotação"
@@ -3318,12 +3312,12 @@ msgstr "Atraso Aleatório"
msgid "Xfade Time"
msgstr "Tempo do Esmaecer Cruzado"
-msgid "Reset"
-msgstr "Repor"
-
msgid "Active"
msgstr "Ativo"
+msgid "Reset"
+msgstr "Repor"
+
msgid "Switch"
msgstr "Alternar"
@@ -3423,9 +3417,6 @@ msgstr "Tamanho da Tabulação"
msgid "Split Offset"
msgstr "Deslocamento de Divisão"
-msgid "Stretch"
-msgstr "Esticar"
-
msgid "Current Tab"
msgstr "Guia Atual"
@@ -3528,9 +3519,6 @@ msgstr "Tamanho Mínimo"
msgid "Max Size"
msgstr "Tamanho Máximo"
-msgid "Aspect"
-msgstr "Aspecto"
-
msgid "Format"
msgstr "Formato"
@@ -3780,9 +3768,6 @@ msgstr "Fundo Direita"
msgid "Bottom Left"
msgstr "Fundo Esquerda"
-msgid "Image"
-msgstr "Imagem"
-
msgid "Atlas"
msgstr "Atlas"
@@ -3795,6 +3780,9 @@ msgstr "Usar HDR"
msgid "From"
msgstr "À Partir de"
+msgid "Frames"
+msgstr "Quadros"
+
msgid "Transpose"
msgstr "Transpor"
@@ -3807,9 +3795,6 @@ msgstr "Função"
msgid "Canvas"
msgstr "Tela"
-msgid "Default Gravity"
-msgstr "Gravidade Padrão"
-
msgid "Plane"
msgstr "Plano"
@@ -3867,6 +3852,9 @@ msgstr "Excluir"
msgid "Collide With Areas"
msgstr "Colidir com Ãreas"
+msgid "Default Gravity"
+msgstr "Gravidade Padrão"
+
msgid "Vertex"
msgstr "Vértice"
diff --git a/editor/translations/properties/pt_BR.po b/editor/translations/properties/pt_BR.po
index bc6daf1f10..d971a31648 100644
--- a/editor/translations/properties/pt_BR.po
+++ b/editor/translations/properties/pt_BR.po
@@ -162,16 +162,16 @@ msgstr ""
"Project-Id-Version: Godot Engine properties\n"
"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n"
"POT-Creation-Date: 2016-05-30\n"
-"PO-Revision-Date: 2023-01-14 00:01+0000\n"
-"Last-Translator: Levi Ferreira <leviferreiramorais@gmail.com>\n"
+"PO-Revision-Date: 2023-02-08 18:01+0000\n"
+"Last-Translator: Leonardo <leotada523@gmail.com>\n"
"Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/"
-"godot-engine/godot/pt_BR/>\n"
+"godot-engine/godot-properties/pt_BR/>\n"
"Language: pt_BR\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.15.1-dev\n"
+"X-Generator: Weblate 4.16-dev\n"
msgid "Application"
msgstr "Aplicação"
@@ -182,9 +182,15 @@ msgstr "Configuração"
msgid "Name"
msgstr "Nome"
+msgid "Description"
+msgstr "Descrição"
+
msgid "Run"
msgstr "Rodar"
+msgid "Main Scene"
+msgstr "Cena Principal"
+
msgid "Disable stdout"
msgstr "Desativar stdout"
@@ -212,6 +218,9 @@ msgstr "Janela"
msgid "Size"
msgstr "Tamanho"
+msgid "Mode"
+msgstr "Modo"
+
msgid "Resizable"
msgstr "Redimensionável"
@@ -227,6 +236,9 @@ msgstr "Economia de Energia"
msgid "Keep Screen On"
msgstr "Manter a Tela Ligada"
+msgid "Audio"
+msgstr "Ãudio"
+
msgid "Editor"
msgstr "Editor"
@@ -248,6 +260,9 @@ msgstr "Depuração"
msgid "Settings"
msgstr "Configurações"
+msgid "Compression"
+msgstr "Compressão"
+
msgid "Crash Handler"
msgstr "Gerenciador de Falhas"
@@ -257,6 +272,12 @@ msgstr "Mensagem"
msgid "Rendering"
msgstr "Renderização"
+msgid "Limits"
+msgstr "Limites"
+
+msgid "GUI"
+msgstr "GUI (Interface Gráfica de Usuário)"
+
msgid "Low Processor Usage Mode"
msgstr "Modo de Baixo Uso de Processador"
@@ -305,6 +326,9 @@ msgstr "Fator"
msgid "Button Index"
msgstr "Ãndice do Botão"
+msgid "Double Click"
+msgstr "Clique Duplo"
+
msgid "Tilt"
msgstr "Inclinar"
@@ -356,6 +380,12 @@ msgstr "Valor do Controlador"
msgid "Big Endian"
msgstr "Big Endian"
+msgid "Network"
+msgstr "Rede"
+
+msgid "Page Size"
+msgstr "Tamanho da Página"
+
msgid "Blocking Mode Enabled"
msgstr "Modo de bloqueio Ativado"
@@ -392,9 +422,6 @@ msgstr "Caminho"
msgid "Data Array"
msgstr "Matriz de Dados"
-msgid "Blocking Handshake"
-msgstr "Handshake bloqueante"
-
msgid "Max Pending Connections"
msgstr "Conexões Pendentes Máximas"
@@ -467,15 +494,6 @@ msgstr "Animação"
msgid "Easing"
msgstr "Suavização"
-msgid "Interface"
-msgstr "Interface"
-
-msgid "Editors"
-msgstr "Editores"
-
-msgid "Network"
-msgstr "Rede"
-
msgid "Remote Port"
msgstr "Porta Remota"
@@ -545,8 +563,8 @@ msgstr "Checado"
msgid "Keying"
msgstr "Chaveamento"
-msgid "Main Scene"
-msgstr "Cena Principal"
+msgid "Interface"
+msgstr "Interface"
msgid "Show Update Spinner"
msgstr "Mostrar Spinner de Atualização"
@@ -851,6 +869,9 @@ msgstr "Tamanho da Fonte de Ajuda Principal"
msgid "Help Title Font Size"
msgstr "Tamanho da Fonte de Ajuda para Títulos"
+msgid "Editors"
+msgstr "Editores"
+
msgid "Grid Map"
msgstr "Mapa de Grade"
@@ -1262,6 +1283,9 @@ msgstr "Tamanho do Contorno"
msgid "Variation"
msgstr "Variação"
+msgid "Transform"
+msgstr "Transformação"
+
msgid "Collada"
msgstr "Collada"
@@ -1289,15 +1313,9 @@ msgstr "Delimitador"
msgid "Preload"
msgstr "Pré Carregar"
-msgid "Mode"
-msgstr "Modo"
-
msgid "Lossy Quality"
msgstr "Com Perda de Qualidade"
-msgid "BPTC LDR"
-msgstr "BPTC LDR"
-
msgid "Mipmaps"
msgstr "Mipmaps"
@@ -1361,12 +1379,6 @@ msgstr "Otimizador"
msgid "Max Angular Error"
msgstr "Erro Angular Máximo"
-msgid "Compression"
-msgstr "Compressão"
-
-msgid "Page Size"
-msgstr "Tamanho da Página"
-
msgid "Nodes"
msgstr "Nós"
@@ -1592,9 +1604,6 @@ msgstr "Threads"
msgid "Thread Model"
msgstr "Modelo de Thread"
-msgid "Audio"
-msgstr "Ãudio"
-
msgid "Handheld"
msgstr "Portátil (Handheld)"
@@ -1625,15 +1634,18 @@ msgstr "iOS"
msgid "Hide Home Indicator"
msgstr "Esconder Indicador de Home"
+msgid "Input Devices"
+msgstr "Dispositivos de Entrada"
+
+msgid "Pointing"
+msgstr "Apontando"
+
msgid "Boot Splash"
msgstr "Imagem de Exibição ao Iniciar"
msgid "BG Color"
msgstr "Cor do Plano de Fundo"
-msgid "Input Devices"
-msgstr "Dispositivos de Entrada"
-
msgid "Environment"
msgstr "Ambiente"
@@ -1643,21 +1655,24 @@ msgstr "Cor Limpa Padrão"
msgid "Show Image"
msgstr "Mostrar Imagem"
+msgid "Image"
+msgstr "Imagem"
+
msgid "Fullsize"
msgstr "Tamanho Inteiro"
msgid "Use Filter"
msgstr "Usar Filtro"
+msgid "Icon"
+msgstr "Ãcone"
+
msgid "Buffering"
msgstr "Buffering"
msgid "Agile Event Flushing"
msgstr "Limpeza de Eventos Agil"
-msgid "Pointing"
-msgstr "Apontando"
-
msgid "Emulate Touch From Mouse"
msgstr "Simular Toque à Partir do Mouse"
@@ -1685,12 +1700,15 @@ msgstr "Diretório da Solução"
msgid "Main Loop Type"
msgstr "Tipo de Loop Principal"
+msgid "Stretch"
+msgstr "Esticar"
+
+msgid "Aspect"
+msgstr "Aspecto"
+
msgid "Auto Accept Quit"
msgstr "Aceitar Sair Automaticamente"
-msgid "GUI"
-msgstr "GUI (Interface Gráfica de Usuário)"
-
msgid "Fonts"
msgstr "Fontes"
@@ -1700,6 +1718,9 @@ msgstr "Fontes Dinâmicas"
msgid "Use Oversampling"
msgstr "Utilizar Oversampling"
+msgid "Textures"
+msgstr "Texturas"
+
msgid "Operation"
msgstr "Operação"
@@ -1877,9 +1898,6 @@ msgstr "Nome da Cena"
msgid "Root Nodes"
msgstr "Nós Raízes"
-msgid "Textures"
-msgstr "Texturas"
-
msgid "Images"
msgstr "Imagens"
@@ -2165,9 +2183,6 @@ msgstr "Estado do IGD"
msgid "Write Mode"
msgstr "Modo de Escrita"
-msgid "Limits"
-msgstr "Limites"
-
msgid "WebRTC"
msgstr "WebRTC"
@@ -2222,12 +2237,6 @@ msgstr "Primeiro Plano Adaptável 432 X 432"
msgid "Adaptive Background 432 X 432"
msgstr "Fundo Adaptável 432 X 432"
-msgid "Custom Build"
-msgstr "Build Personalizada"
-
-msgid "Use Custom Build"
-msgstr "Usar Build Personalizada"
-
msgid "Export Format"
msgstr "Exportar Formato"
@@ -2423,9 +2432,6 @@ msgstr "Arquitetura"
msgid "macOS"
msgstr "macOS"
-msgid "Icon"
-msgstr "Ãcone"
-
msgid "Copyright"
msgstr "Direitos Autorais"
@@ -2522,9 +2528,6 @@ msgstr "Nome de Exibição"
msgid "Short Name"
msgstr "Nome Curto"
-msgid "Description"
-msgstr "Descrição"
-
msgid "Publisher"
msgstr "Publicadora"
@@ -2648,18 +2651,12 @@ msgstr "Descrição do Arquivo"
msgid "Trademarks"
msgstr "Marca Registrada (Trademarks)"
-msgid "Frames"
-msgstr "Quadros"
-
msgid "Frame"
msgstr "Quadro"
msgid "Speed Scale"
msgstr "Escalonamento da Velocidade"
-msgid "Playing"
-msgstr "Rodando"
-
msgid "Centered"
msgstr "Centralizado"
@@ -2690,6 +2687,9 @@ msgstr "Volume dB (decibéis)"
msgid "Pitch Scale"
msgstr "Escalonamento de Pitch"
+msgid "Playing"
+msgstr "Rodando"
+
msgid "Autoplay"
msgstr "Rodar automaticamente"
@@ -2897,9 +2897,6 @@ msgstr "Velocidade Máxima"
msgid "Estimate Radius"
msgstr "Raio Estimado"
-msgid "Transform"
-msgstr "Transformação"
-
msgid "Rotation Degrees"
msgstr "Graus de Rotação"
@@ -3356,12 +3353,12 @@ msgstr "Atraso Aleatório"
msgid "Xfade Time"
msgstr "Tempo do Esmaecer Cruzado"
-msgid "Reset"
-msgstr "Recompor"
-
msgid "Active"
msgstr "Ativo"
+msgid "Reset"
+msgstr "Recompor"
+
msgid "Switch"
msgstr "Switch"
@@ -3461,9 +3458,6 @@ msgstr "Tamanho da Tabulação"
msgid "Split Offset"
msgstr "Deslocamento de Divisão"
-msgid "Stretch"
-msgstr "Esticar"
-
msgid "Current Tab"
msgstr "Aba Atual"
@@ -3566,9 +3560,6 @@ msgstr "Tamanho Mínimo"
msgid "Max Size"
msgstr "Tamanho Máximo"
-msgid "Aspect"
-msgstr "Aspecto"
-
msgid "Format"
msgstr "Formato"
@@ -3818,9 +3809,6 @@ msgstr "Inferior direita"
msgid "Bottom Left"
msgstr "Inferior Esquerda"
-msgid "Image"
-msgstr "Imagem"
-
msgid "Atlas"
msgstr "Atlas"
@@ -3833,6 +3821,9 @@ msgstr "Usar HDR"
msgid "From"
msgstr "À Partir de"
+msgid "Frames"
+msgstr "Quadros"
+
msgid "Transpose"
msgstr "Transpor"
@@ -3845,9 +3836,6 @@ msgstr "Função"
msgid "Canvas"
msgstr "Tela"
-msgid "Default Gravity"
-msgstr "Gravidade Padrão"
-
msgid "Plane"
msgstr "Plano"
@@ -3905,6 +3893,9 @@ msgstr "Excluir"
msgid "Collide With Areas"
msgstr "Colidir com Ãreas"
+msgid "Default Gravity"
+msgstr "Gravidade Padrão"
+
msgid "Vertex"
msgstr "Vértice"
diff --git a/editor/translations/properties/ru.po b/editor/translations/properties/ru.po
index 29e6563d92..f792cd0b43 100644
--- a/editor/translations/properties/ru.po
+++ b/editor/translations/properties/ru.po
@@ -132,17 +132,17 @@ 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: 2022-11-25 12:13+0000\n"
-"Last-Translator: Vladimir Kirillovskiy <vladimir.kirillovskiy@gmail.com>\n"
+"PO-Revision-Date: 2023-02-10 10:44+0000\n"
+"Last-Translator: Danil Alexeev <danil@alexeev.xyz>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/"
-"godot/ru/>\n"
+"godot-properties/ru/>\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 4.15-dev\n"
+"X-Generator: Weblate 4.16-dev\n"
msgid "Application"
msgstr "Приложение"
@@ -153,9 +153,15 @@ msgstr "КонфигурациÑ"
msgid "Name"
msgstr "Ðазвание"
+msgid "Description"
+msgstr "ОпиÑание"
+
msgid "Run"
msgstr "ЗапуÑтить"
+msgid "Main Scene"
+msgstr "Ð“Ð»Ð°Ð²Ð½Ð°Ñ Ñцена"
+
msgid "Disable stdout"
msgstr "Отключить Ñтандартный вывод"
@@ -183,6 +189,9 @@ msgstr "Окно"
msgid "Size"
msgstr "Размер"
+msgid "Mode"
+msgstr "Режим"
+
msgid "Resizable"
msgstr "ИзменÑемый размер"
@@ -198,6 +207,9 @@ msgstr "ЭнергоÑбережение"
msgid "Keep Screen On"
msgstr "Ðе выключать Ñкран"
+msgid "Audio"
+msgstr "Ðудио"
+
msgid "Editor"
msgstr "Редактор"
@@ -219,6 +231,9 @@ msgstr "Отладка"
msgid "Settings"
msgstr "ÐаÑтройки"
+msgid "Compression"
+msgstr "Сжатие"
+
msgid "Crash Handler"
msgstr "Обработчик падений"
@@ -228,6 +243,15 @@ msgstr "Сообщение"
msgid "Rendering"
msgstr "Рендеринг"
+msgid "Limits"
+msgstr "Лимиты"
+
+msgid "GUI"
+msgstr "GUI"
+
+msgid "Vulkan"
+msgstr "Vulkan"
+
msgid "Low Processor Usage Mode"
msgstr "Режим низкой нагрузки процеÑÑора"
@@ -276,6 +300,9 @@ msgstr "Множитель"
msgid "Button Index"
msgstr "Ð˜Ð½Ð´ÐµÐºÑ ÐºÐ½Ð¾Ð¿ÐºÐ¸"
+msgid "Double Click"
+msgstr "Двойной щелчок"
+
msgid "Tilt"
msgstr "Ðаклон"
@@ -330,6 +357,12 @@ msgstr "Ярлык"
msgid "Big Endian"
msgstr "ПрÑмой порÑдок байтов"
+msgid "Network"
+msgstr "Сеть"
+
+msgid "Page Size"
+msgstr "Размер Ñтраницы"
+
msgid "Blocking Mode Enabled"
msgstr "Блокирующий режим включён"
@@ -366,9 +399,6 @@ msgstr "Путь"
msgid "Data Array"
msgstr "МаÑÑив данных"
-msgid "Blocking Handshake"
-msgstr "Блокировать Handshake"
-
msgid "Max Pending Connections"
msgstr "МакÑимальное количеÑтво ожидающих подключений"
@@ -441,15 +471,6 @@ msgstr "ÐнимациÑ"
msgid "Easing"
msgstr "Облегчение"
-msgid "Interface"
-msgstr "ИнтерфейÑ"
-
-msgid "Editors"
-msgstr "Редакторы"
-
-msgid "Network"
-msgstr "Сеть"
-
msgid "Remote Port"
msgstr "Удалённый порт"
@@ -519,8 +540,8 @@ msgstr "Отмеченный"
msgid "Keying"
msgstr "Ð’Ñтавка ключей"
-msgid "Main Scene"
-msgstr "Ð“Ð»Ð°Ð²Ð½Ð°Ñ Ñцена"
+msgid "Interface"
+msgstr "ИнтерфейÑ"
msgid "Show Update Spinner"
msgstr "Показывать индикатор обновлениÑ"
@@ -825,6 +846,9 @@ msgstr "Размер шрифта иÑходного кода в Ñправке"
msgid "Help Title Font Size"
msgstr "Размер шрифта заголовков Ñправки"
+msgid "Editors"
+msgstr "Редакторы"
+
msgid "Grid Map"
msgstr "Ð¡ÐµÑ‚Ð¾Ñ‡Ð½Ð°Ñ ÐºÐ°Ñ€Ñ‚Ð°"
@@ -1227,9 +1251,15 @@ msgstr "Пароль"
msgid "Compress"
msgstr "Сжатие"
+msgid "Language"
+msgstr "Язык"
+
msgid "Variation"
msgstr "ВариациÑ"
+msgid "Transform"
+msgstr "Преобразование"
+
msgid "Collada"
msgstr "ColladA"
@@ -1260,15 +1290,9 @@ msgstr "Предзагрузить"
msgid "Columns"
msgstr "Колонки"
-msgid "Mode"
-msgstr "Режим"
-
msgid "Lossy Quality"
msgstr "КачеÑтво Ñ Ð¿Ð¾Ñ‚ÐµÑ€Ñми"
-msgid "BPTC LDR"
-msgstr "BPTC LDR"
-
msgid "Mipmaps"
msgstr "Мип-карты"
@@ -1332,12 +1356,6 @@ msgstr "Оптимизировать"
msgid "Max Angular Error"
msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑƒÐ³Ð»Ð¾Ð²Ð°Ñ Ð¿Ð¾Ð³Ñ€ÐµÑˆÐ½Ð¾ÑÑ‚ÑŒ"
-msgid "Compression"
-msgstr "Сжатие"
-
-msgid "Page Size"
-msgstr "Размер Ñтраницы"
-
msgid "Nodes"
msgstr "Узлы"
@@ -1443,6 +1461,9 @@ msgstr "ИÑпользовать потоки"
msgid "Available URLs"
msgstr "ДоÑтупные URL"
+msgid "Unset"
+msgstr "СброÑить"
+
msgid "Error"
msgstr "Ошибка"
@@ -1560,9 +1581,6 @@ msgstr "Потоки"
msgid "Thread Model"
msgstr "Модель потоков"
-msgid "Audio"
-msgstr "Ðудио"
-
msgid "Handheld"
msgstr "Портативный"
@@ -1593,15 +1611,18 @@ msgstr "iOS"
msgid "Hide Home Indicator"
msgstr "Скрыть индикатор «Домой»"
+msgid "Input Devices"
+msgstr "УÑтройÑтва ввода"
+
+msgid "Pointing"
+msgstr "Указывающие"
+
msgid "Boot Splash"
msgstr "Ð—Ð°Ð³Ñ€ÑƒÐ·Ð¾Ñ‡Ð½Ð°Ñ Ð·Ð°Ñтавка"
msgid "BG Color"
msgstr "Цвет фона"
-msgid "Input Devices"
-msgstr "УÑтройÑтва ввода"
-
msgid "Environment"
msgstr "Окружение"
@@ -1611,21 +1632,24 @@ msgstr "ЧиÑтый цвет по умолчанию"
msgid "Show Image"
msgstr "Показать изображение"
+msgid "Image"
+msgstr "Изображение"
+
msgid "Fullsize"
msgstr "Полноразмерный"
msgid "Use Filter"
msgstr "ИÑпользовать фильтр"
+msgid "Icon"
+msgstr "Иконка"
+
msgid "Buffering"
msgstr "БуферизациÑ"
msgid "Agile Event Flushing"
msgstr "БыÑÑ‚Ñ€Ð°Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ° Ñобытий"
-msgid "Pointing"
-msgstr "Указывающие"
-
msgid "Emulate Touch From Mouse"
msgstr "Эмулировать ÑенÑорный ввод мышью"
@@ -1647,12 +1671,15 @@ msgstr "Проект"
msgid "Main Loop Type"
msgstr "Тип оÑновного цикла"
+msgid "Stretch"
+msgstr "РаÑÑ‚Ñжение"
+
+msgid "Aspect"
+msgstr "Соотношение"
+
msgid "Auto Accept Quit"
msgstr "Ðвтоподтверждение выхода"
-msgid "GUI"
-msgstr "GUI"
-
msgid "Fonts"
msgstr "Шрифты"
@@ -1662,6 +1689,9 @@ msgstr "ДинамичеÑкие шрифты"
msgid "Use Oversampling"
msgstr "ИÑпользовать передиÑкретизацию"
+msgid "Textures"
+msgstr "ТекÑтуры"
+
msgid "Operation"
msgstr "ОперациÑ"
@@ -1830,9 +1860,6 @@ msgstr "Ð˜Ð¼Ñ Ñцены"
msgid "Root Nodes"
msgstr "Корневые узлы"
-msgid "Textures"
-msgstr "ТекÑтуры"
-
msgid "Images"
msgstr "ИзображениÑ"
@@ -2088,9 +2115,6 @@ msgstr "IGD СтатуÑ"
msgid "Write Mode"
msgstr "Режим запиÑи"
-msgid "Limits"
-msgstr "Лимиты"
-
msgid "WebRTC"
msgstr "WebRTC"
@@ -2124,12 +2148,6 @@ msgstr "Ðдаптивный Передний Фон 432 X 432"
msgid "Adaptive Background 432 X 432"
msgstr "Ðдаптивный Задний Фон 432 X 432"
-msgid "Custom Build"
-msgstr "ÐаÑÑ‚Ñ€Ð°Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ð¡Ð±Ð¾Ñ€ÐºÐ°"
-
-msgid "Use Custom Build"
-msgstr "ИÑпользовать ÐаÑтраиваемую Сборку"
-
msgid "Export Format"
msgstr "Формат ЭкÑпорта"
@@ -2256,9 +2274,6 @@ msgstr "Ðрхитектура"
msgid "macOS"
msgstr "macOS"
-msgid "Icon"
-msgstr "Иконка"
-
msgid "Copyright"
msgstr "ÐвторÑкие права"
@@ -2358,9 +2373,6 @@ msgstr "Ðлгоритм отладчика"
msgid "Short Name"
msgstr "Короткое имÑ"
-msgid "Description"
-msgstr "ОпиÑание"
-
msgid "Publisher"
msgstr "Издатель"
@@ -2412,6 +2424,9 @@ msgstr "HTTP-хоÑÑ‚"
msgid "HTTP Port"
msgstr "HTTP-порт"
+msgid "Variant"
+msgstr "Вариант"
+
msgid "VRAM Texture Compression"
msgstr "VRAM компреÑÑÐ¸Ñ Ñ‚ÐµÐºÑтуры"
@@ -2469,18 +2484,12 @@ msgstr "ОпиÑание файла"
msgid "Trademarks"
msgstr "Торговые марки"
-msgid "Frames"
-msgstr "Кадры"
-
msgid "Frame"
msgstr "Кадр"
msgid "Speed Scale"
msgstr "МаÑштаб ÑкороÑти"
-msgid "Playing"
-msgstr "ПроигрываетÑÑ"
-
msgid "Centered"
msgstr "Центрированный"
@@ -2511,6 +2520,9 @@ msgstr "ТекущаÑ"
msgid "Volume dB"
msgstr "ГромкоÑÑ‚ÑŒ dB"
+msgid "Playing"
+msgstr "ПроигрываетÑÑ"
+
msgid "Autoplay"
msgstr "ÐвтовоÑпроизведение"
@@ -2539,13 +2551,13 @@ msgid "Custom Viewport"
msgstr "ПользовательÑкое окно проÑмотра"
msgid "Left"
-msgstr "Лево"
+msgstr "Влево"
msgid "Top"
msgstr "Верх"
msgid "Right"
-msgstr "Право"
+msgstr "Вправо"
msgid "Bottom"
msgstr "Внизу"
@@ -2748,9 +2760,6 @@ msgstr "Включить уклонение"
msgid "Max Speed"
msgstr "ÐœÐ°ÐºÑ ÑкороÑÑ‚ÑŒ"
-msgid "Transform"
-msgstr "Преобразование"
-
msgid "Global Rotation"
msgstr "Глобальный поворот"
@@ -2848,7 +2857,7 @@ msgid "Use Global Coordinates"
msgstr "ИÑпользовать глобальные координаты"
msgid "Update"
-msgstr "Обновление"
+msgstr "Обновить"
msgid "Margin"
msgstr "ОтÑтуп"
@@ -3252,9 +3261,6 @@ msgstr "Ð¡Ð»ÑƒÑ‡Ð°Ð¹Ð½Ð°Ñ Ð·Ð°Ð´ÐµÑ€Ð¶ÐºÐ°"
msgid "Xfade Time"
msgstr "Ð’Ñ€ÐµÐ¼Ñ Xfade"
-msgid "Reset"
-msgstr "СброÑить"
-
msgid "Active"
msgstr "Ðктивный"
@@ -3264,6 +3270,9 @@ msgstr "Добавить количеÑтво"
msgid "Blend Amount"
msgstr "КоличеÑтво ÑмешиваниÑ"
+msgid "Reset"
+msgstr "СброÑить"
+
msgid "Switch"
msgstr "МножеÑтвенный выбор"
@@ -3489,9 +3498,6 @@ msgstr "Среда"
msgid "Relative Index"
msgstr "ОтноÑительный индекÑ"
-msgid "Fit Content Height"
-msgstr "ВмеÑтить по выÑоте контента"
-
msgid "Scroll Active"
msgstr "ÐÐºÑ‚Ð¸Ð²Ð½Ð°Ñ Ð¿Ñ€Ð¾ÐºÑ€ÑƒÑ‚ÐºÐ°"
@@ -3516,9 +3522,6 @@ msgstr "Счетчик галочек"
msgid "Collapsed"
msgstr "Свернуто"
-msgid "Stretch"
-msgstr "РаÑÑ‚Ñжение"
-
msgid "Stretch Shrink"
msgstr "РаÑÑ‚Ñнуть Ñжать"
@@ -3531,6 +3534,9 @@ msgstr "ВидимоÑÑ‚ÑŒ вкладок"
msgid "Syntax Highlighter"
msgstr "ПодÑветка ÑинтакÑиÑа"
+msgid "Fit Content Height"
+msgstr "ВмеÑтить по выÑоте контента"
+
msgid "Focused"
msgstr "СфокуÑировано"
@@ -3678,9 +3684,6 @@ msgstr "Минимальный размер"
msgid "Max Size"
msgstr "МакÑимальный размер"
-msgid "Aspect"
-msgstr "Соотношение"
-
msgid "Layer Names"
msgstr "Имена ÑлоÑ"
@@ -4086,9 +4089,6 @@ msgstr "Справа внизу"
msgid "Bottom Left"
msgstr "Слева внизу"
-msgid "Image"
-msgstr "Изображение"
-
msgid "Load Path"
msgstr "Загрузить путь"
@@ -4110,6 +4110,9 @@ msgstr "От"
msgid "To"
msgstr "До"
+msgid "Frames"
+msgstr "Кадры"
+
msgid "Current Frame"
msgstr "Текущий кадр"
@@ -4155,15 +4158,6 @@ msgstr "ХолÑÑ‚"
msgid "Navigation Map"
msgstr "Карта навигации"
-msgid "Default Gravity"
-msgstr "Ð“Ñ€Ð°Ð²Ð¸Ñ‚Ð°Ñ†Ð¸Ñ Ð¿Ð¾ умолчанию"
-
-msgid "Default Gravity Vector"
-msgstr "Вектор гравитации по умолчанию"
-
-msgid "Default Cell Size"
-msgstr "Размер Ñчейки по умолчанию"
-
msgid "Plane"
msgstr "ПлоÑкоÑÑ‚ÑŒ"
@@ -4212,12 +4206,12 @@ msgstr "Порог ÐžÑ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ÐšÐ°Ð½Ð°Ð»Ð°, дБ"
msgid "Video Delay Compensation (ms)"
msgstr "КомпенÑÐ°Ñ†Ð¸Ñ Ð—Ð°Ð´ÐµÑ€Ð¶ÐºÐ¸ Видео (мÑ)"
-msgid "Capture Device"
-msgstr "УÑтройÑтво захвата"
-
msgid "Is Active"
msgstr "Ðктивен"
+msgid "Default Cell Size"
+msgstr "Размер Ñчейки по умолчанию"
+
msgid "Inverse Mass"
msgstr "Ð˜Ð½Ð²ÐµÑ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð¼Ð°ÑÑа"
@@ -4236,6 +4230,12 @@ msgstr "Сталкивать Ñ Ñ‚ÐµÐ»Ð°Ð¼Ð¸"
msgid "Collide With Areas"
msgstr "Сталкивать Ñ Ð¾Ð±Ð»Ð°ÑÑ‚Ñми"
+msgid "Default Gravity"
+msgstr "Ð“Ñ€Ð°Ð²Ð¸Ñ‚Ð°Ñ†Ð¸Ñ Ð¿Ð¾ умолчанию"
+
+msgid "Default Gravity Vector"
+msgstr "Вектор гравитации по умолчанию"
+
msgid "Physics Engine"
msgstr "ФизичеÑкий движек"
@@ -4251,18 +4251,6 @@ msgstr "Включить цикл рендера"
msgid "VRAM Compression"
msgstr "Сжатие VRAM"
-msgid "Import BPTC"
-msgstr "Импорт BPTC"
-
-msgid "Import S3TC"
-msgstr "Импорт S3TC"
-
-msgid "Import ETC"
-msgstr "Импортировать ETC"
-
-msgid "Import ETC2"
-msgstr "Импортировать ETC2"
-
msgid "Lossless Compression"
msgstr "Сжатие без потерь"
diff --git a/editor/translations/properties/uk.po b/editor/translations/properties/uk.po
index 43ebc97bf7..cce1dbb94c 100644
--- a/editor/translations/properties/uk.po
+++ b/editor/translations/properties/uk.po
@@ -32,17 +32,17 @@ msgstr ""
"Project-Id-Version: Ukrainian (Godot Engine)\n"
"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2023-01-08 09:47+0000\n"
-"Last-Translator: KazanskiyMaks <kazanskiy.maks@gmail.com>\n"
+"PO-Revision-Date: 2023-02-09 01:12+0000\n"
+"Last-Translator: Богдан Матвіїв <bomtvv@gmail.com>\n"
"Language-Team: Ukrainian <https://hosted.weblate.org/projects/godot-engine/"
-"godot/uk/>\n"
+"godot-properties/uk/>\n"
"Language: uk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 4.15.1-dev\n"
+"X-Generator: Weblate 4.16-dev\n"
msgid "Application"
msgstr "Програма"
@@ -53,9 +53,15 @@ msgstr "ÐалаштуваннÑ"
msgid "Name"
msgstr "Ðазва"
+msgid "Description"
+msgstr "ОпиÑ"
+
msgid "Run"
msgstr "ЗапуÑтити"
+msgid "Main Scene"
+msgstr "Головна Ñцена"
+
msgid "Disable stdout"
msgstr "Вимкнути stdout"
@@ -83,6 +89,9 @@ msgstr "Вікно"
msgid "Size"
msgstr "Розмір"
+msgid "Mode"
+msgstr "Режим"
+
msgid "Resizable"
msgstr "Зі зміною розміру"
@@ -98,6 +107,9 @@ msgstr "Ð—Ð°Ð¾Ñ‰Ð°Ð´Ð¶ÐµÐ½Ð½Ñ ÐµÐ½ÐµÑ€Ð³Ñ–Ñ—"
msgid "Keep Screen On"
msgstr "Ðе вимикати екран"
+msgid "Audio"
+msgstr "Ðудіо"
+
msgid "Editor"
msgstr "Редактор"
@@ -119,6 +131,9 @@ msgstr "ДіагноÑтика"
msgid "Settings"
msgstr "Параметри"
+msgid "Compression"
+msgstr "СтиÑненнÑ"
+
msgid "Crash Handler"
msgstr "Обробник аварій"
@@ -128,6 +143,15 @@ msgstr "ПовідомленнÑ"
msgid "Rendering"
msgstr "Обробка"
+msgid "Occlusion Culling"
+msgstr "ПереглÑнути Ð²Ñ–Ð´Ð±Ñ€Ð°ÐºÐ¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¼Ð¸ÐºÐ°Ð½Ð½Ñ"
+
+msgid "Limits"
+msgstr "ОбмеженнÑ"
+
+msgid "GUI"
+msgstr "ІнтерфейÑ"
+
msgid "Low Processor Usage Mode"
msgstr "Режим низького викориÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑора"
@@ -230,6 +254,12 @@ msgstr "СкороченнÑ"
msgid "Big Endian"
msgstr "Зворотний"
+msgid "Network"
+msgstr "Мережа"
+
+msgid "Page Size"
+msgstr "Розмір Ñторінки"
+
msgid "Blocking Mode Enabled"
msgstr "Увімкнено режим блокуваннÑ"
@@ -266,9 +296,6 @@ msgstr "ШлÑÑ…"
msgid "Data Array"
msgstr "МаÑив даних"
-msgid "Blocking Handshake"
-msgstr "Ð£Ð·Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ"
-
msgid "Max Pending Connections"
msgstr "МакÑ. к-Ñ‚ÑŒ з'єднань у черзі"
@@ -344,15 +371,6 @@ msgstr "ÐнімаціÑ"
msgid "Easing"
msgstr "Пом'ÑкшеннÑ"
-msgid "Interface"
-msgstr "ІнтерфейÑ"
-
-msgid "Editors"
-msgstr "Редактори"
-
-msgid "Network"
-msgstr "Мережа"
-
msgid "Remote Port"
msgstr "Віддалений порт"
@@ -422,8 +440,8 @@ msgstr "Позначено"
msgid "Keying"
msgstr "Ðабір"
-msgid "Main Scene"
-msgstr "Головна Ñцена"
+msgid "Interface"
+msgstr "ІнтерфейÑ"
msgid "Show Update Spinner"
msgstr "Показувати індикатор оновленнÑ"
@@ -733,6 +751,9 @@ msgstr "Розмір шрифту коду у довідці"
msgid "Help Title Font Size"
msgstr "Розмір шрифту заголовків у довідці"
+msgid "Editors"
+msgstr "Редактори"
+
msgid "Grid Map"
msgstr "Карта Ñітки"
@@ -1147,6 +1168,9 @@ msgstr "Розмір обведеннÑ"
msgid "Variation"
msgstr "ДиÑперÑÑ–Ñ"
+msgid "Transform"
+msgstr "ПеретвореннÑ"
+
msgid "Collada"
msgstr "Collada"
@@ -1177,15 +1201,9 @@ msgstr "Попередньо завантажити"
msgid "Columns"
msgstr "Стовпчики"
-msgid "Mode"
-msgstr "Режим"
-
msgid "Lossy Quality"
msgstr "Із втратою ÑкоÑÑ‚Ñ–"
-msgid "BPTC LDR"
-msgstr "BPTC LDR"
-
msgid "Mipmaps"
msgstr "Множинне відтвореннÑ"
@@ -1252,12 +1270,6 @@ msgstr "Optimizer (Оптимізатор)"
msgid "Max Angular Error"
msgstr "МакÑ. кутова похибка"
-msgid "Compression"
-msgstr "СтиÑненнÑ"
-
-msgid "Page Size"
-msgstr "Розмір Ñторінки"
-
msgid "Nodes"
msgstr "Вузли"
@@ -1483,9 +1495,6 @@ msgstr "Потоки"
msgid "Thread Model"
msgstr "Модель потоків"
-msgid "Audio"
-msgstr "Ðудіо"
-
msgid "Handheld"
msgstr "Кишеньковий приÑтрій"
@@ -1516,15 +1525,18 @@ msgstr "iOS"
msgid "Hide Home Indicator"
msgstr "Приховати індикатор домівки"
+msgid "Input Devices"
+msgstr "ПриÑтрої вводу"
+
+msgid "Pointing"
+msgstr "ФокуÑ"
+
msgid "Boot Splash"
msgstr "Ð’Ñ–Ñ‚Ð°Ð½Ð½Ñ ÑиÑтеми"
msgid "BG Color"
msgstr "Колір тла"
-msgid "Input Devices"
-msgstr "ПриÑтрої вводу"
-
msgid "Environment"
msgstr "Середовище"
@@ -1534,21 +1546,24 @@ msgstr "Типовий чиÑтий колір"
msgid "Show Image"
msgstr "Показати зображеннÑ"
+msgid "Image"
+msgstr "ЗображеннÑ"
+
msgid "Fullsize"
msgstr "Повний розмір"
msgid "Use Filter"
msgstr "ФільтруваннÑ"
+msgid "Icon"
+msgstr "Піктограма"
+
msgid "Buffering"
msgstr "БуферизаціÑ"
msgid "Agile Event Flushing"
msgstr "Зріле Ð²Ð¸Ñ‚Ð¸Ñ€Ð°Ð½Ð½Ñ Ð¿Ð¾Ð´Ñ–Ð¹"
-msgid "Pointing"
-msgstr "ФокуÑ"
-
msgid "Emulate Touch From Mouse"
msgstr "Емулювати дотик з миші"
@@ -1576,12 +1591,15 @@ msgstr "Каталог проєкту"
msgid "Main Loop Type"
msgstr "Знайти тип вузла"
+msgid "Stretch"
+msgstr "РозтÑгнути"
+
+msgid "Aspect"
+msgstr "ÐÑпект"
+
msgid "Auto Accept Quit"
msgstr "Ðвтоматично виходити"
-msgid "GUI"
-msgstr "ІнтерфейÑ"
-
msgid "Fonts"
msgstr "Шрифти"
@@ -1591,6 +1609,9 @@ msgstr "Динамічні шрифти"
msgid "Use Oversampling"
msgstr "ПередиÑкретизаціÑ"
+msgid "Textures"
+msgstr "ТекÑтури"
+
msgid "Operation"
msgstr "ДіÑ"
@@ -1768,9 +1789,6 @@ msgstr "Базовий шлÑÑ…"
msgid "Root Nodes"
msgstr "Кореневі вузли"
-msgid "Textures"
-msgstr "ТекÑтури"
-
msgid "Images"
msgstr "ЗображеннÑ"
@@ -2056,9 +2074,6 @@ msgstr "Стан IGD"
msgid "Write Mode"
msgstr "Режим пріоритетноÑÑ‚Ñ–"
-msgid "Limits"
-msgstr "ОбмеженнÑ"
-
msgid "WebRTC"
msgstr "WebRTC"
@@ -2086,9 +2101,6 @@ msgstr "ШлÑÑ… Android SDK"
msgid "Debug Keystore"
msgstr "Зневаджувач"
-msgid "Use Custom Build"
-msgstr "Ðетипова збірка"
-
msgid "Export Format"
msgstr "Формат екÑпортуваннÑ"
@@ -2287,9 +2299,6 @@ msgstr "Ðрхітектура"
msgid "macOS"
msgstr "macOS"
-msgid "Icon"
-msgstr "Піктограма"
-
msgid "Copyright"
msgstr "ÐвторÑькі права"
@@ -2413,9 +2422,6 @@ msgstr "Показана назва"
msgid "Short Name"
msgstr "Коротка назва"
-msgid "Description"
-msgstr "ОпиÑ"
-
msgid "Publisher"
msgstr "Видавець"
@@ -2551,18 +2557,12 @@ msgstr "ÐžÐ¿Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°"
msgid "Trademarks"
msgstr "Торгівельні марки"
-msgid "Frames"
-msgstr "Кадри"
-
msgid "Frame"
msgstr "Кадр"
msgid "Speed Scale"
msgstr "МаÑштаб"
-msgid "Playing"
-msgstr "ВідтвореннÑ"
-
msgid "Centered"
msgstr "За центром"
@@ -2608,6 +2608,9 @@ msgstr "ГучніÑÑ‚ÑŒ (дБ)"
msgid "Pitch Scale"
msgstr "МаÑштаб"
+msgid "Playing"
+msgstr "ВідтвореннÑ"
+
msgid "Autoplay"
msgstr "Перемкнути автовідтвореннÑ"
@@ -2938,9 +2941,6 @@ msgstr "МакÑ. швидкіÑÑ‚ÑŒ"
msgid "Estimate Radius"
msgstr "Оцінка радіуÑа"
-msgid "Transform"
-msgstr "ПеретвореннÑ"
-
msgid "Rotation Degrees"
msgstr "ГрудуÑи обертаннÑ"
@@ -3193,9 +3193,6 @@ msgstr "Вимкнути Z"
msgid "Flatness"
msgstr "ПлаÑкіÑÑ‚ÑŒ"
-msgid "Extents"
-msgstr "Розміри"
-
msgid "Albedo"
msgstr "Ðльбедо"
@@ -3350,7 +3347,7 @@ msgid "Opacity"
msgstr "ÐепрозоріÑÑ‚ÑŒ"
msgid "Blur"
-msgstr "РозмиваннÑ"
+msgstr "РозмиттÑ"
msgid "Directional Shadow"
msgstr "СпрÑмована тінь"
@@ -3592,12 +3589,12 @@ msgstr "Випадкова затримка"
msgid "Xfade Time"
msgstr "Ð§Ð°Ñ X-Fade"
-msgid "Reset"
-msgstr "Скинути"
-
msgid "Active"
msgstr "Ðктивний"
+msgid "Reset"
+msgstr "Скинути"
+
msgid "Switch"
msgstr "ПеремкнутиÑÑ"
@@ -3910,9 +3907,6 @@ msgstr "Сер."
msgid "Relative Index"
msgstr "ВідноÑний індекÑ"
-msgid "Fit Content Height"
-msgstr "ВиÑота Ð¿Ñ–Ð´Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ð·Ð° вміÑтом"
-
msgid "Scroll Active"
msgstr "Ðктивне гортаннÑ"
@@ -3949,9 +3943,6 @@ msgstr "Згорнуто"
msgid "Dragger Visibility"
msgstr "Перемкнути видиміÑÑ‚ÑŒ"
-msgid "Stretch"
-msgstr "РозтÑгнути"
-
msgid "Stretch Shrink"
msgstr "СтÑÐ³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ð¾Ð·Ñ‚ÑгуваннÑ"
@@ -3970,6 +3961,9 @@ msgstr "Вкладки видимі"
msgid "Syntax Highlighter"
msgstr "ЗаÑіб підÑÐ²Ñ–Ñ‡ÑƒÐ²Ð°Ð½Ð½Ñ ÑинтакÑиÑу"
+msgid "Fit Content Height"
+msgstr "ВиÑота Ð¿Ñ–Ð´Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ð·Ð° вміÑтом"
+
msgid "Draw"
msgstr "КреÑленнÑ"
@@ -4126,9 +4120,6 @@ msgstr "Створити контур"
msgid "Anti Aliasing"
msgstr "ЗгладжуваннÑ"
-msgid "Occlusion Culling"
-msgstr "ПереглÑнути Ð²Ñ–Ð´Ð±Ñ€Ð°ÐºÐ¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¼Ð¸ÐºÐ°Ð½Ð½Ñ"
-
msgid "Atlas Size"
msgstr "Розмір атлаÑу"
@@ -4195,9 +4186,6 @@ msgstr "Мін. розмір"
msgid "Max Size"
msgstr "МакÑ. розмір"
-msgid "Aspect"
-msgstr "ÐÑпект"
-
msgid "Layer Names"
msgstr "Ðазви шарів"
@@ -4876,9 +4864,6 @@ msgstr "Внизу праворуч"
msgid "Bottom Left"
msgstr "Внизу ліворуч"
-msgid "Image"
-msgstr "ЗображеннÑ"
-
msgid "Load Path"
msgstr "Завантажити шаблон"
@@ -4897,6 +4882,9 @@ msgstr "Розмір зображеннÑ"
msgid "Use HDR"
msgstr "HDR"
+msgid "Frames"
+msgstr "Кадри"
+
msgid "Current Frame"
msgstr "Поточний кадр"
@@ -4939,12 +4927,6 @@ msgstr "Завантажити типовий"
msgid "Canvas"
msgstr "Полотно"
-msgid "Default Gravity"
-msgstr "Типове Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду"
-
-msgid "Default Gravity Vector"
-msgstr "Типове Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду"
-
msgid "Fallback Environment"
msgstr "ПереглÑд Ñередовища"
@@ -5029,9 +5011,6 @@ msgstr "Результат"
msgid "Bus Count"
msgstr "КількіÑÑ‚ÑŒ шин"
-msgid "Capture Device"
-msgstr "ПриÑтрій захопленнÑ"
-
msgid "Feed"
msgstr "Подача"
@@ -5056,6 +5035,12 @@ msgstr "Режим перешкоди"
msgid "Shape RID"
msgstr "RID форми"
+msgid "Default Gravity"
+msgstr "Типове Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду"
+
+msgid "Default Gravity Vector"
+msgstr "Типове Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду"
+
msgid "Principal Inertia Axes"
msgstr "Головні віÑÑ– інерції"
@@ -5077,18 +5062,6 @@ msgstr "Увімкнено цикл обробки"
msgid "VRAM Compression"
msgstr "Вираз"
-msgid "Import BPTC"
-msgstr "Імпорт"
-
-msgid "Import S3TC"
-msgstr "Імпорт"
-
-msgid "Import ETC"
-msgstr "Імпорт"
-
-msgid "Import ETC2"
-msgstr "Імпорт"
-
msgid "Lossless Compression"
msgstr "СтиÑÐºÐ°Ð½Ð½Ñ Ð±ÐµÐ· втрат"
diff --git a/editor/translations/properties/zh_CN.po b/editor/translations/properties/zh_CN.po
index 941f112094..d623c3ba30 100644
--- a/editor/translations/properties/zh_CN.po
+++ b/editor/translations/properties/zh_CN.po
@@ -92,16 +92,16 @@ msgstr ""
"Project-Id-Version: Chinese (Simplified) (Godot Engine)\n"
"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n"
"POT-Creation-Date: 2018-01-20 12:15+0200\n"
-"PO-Revision-Date: 2022-12-28 00:54+0000\n"
-"Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n"
+"PO-Revision-Date: 2023-02-10 10:44+0000\n"
+"Last-Translator: 风é’å±± <idleman@yeah.net>\n"
"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
-"godot-engine/godot/zh_Hans/>\n"
+"godot-engine/godot-properties/zh_Hans/>\n"
"Language: zh_CN\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.15.1-dev\n"
+"X-Generator: Weblate 4.16-dev\n"
msgid "Application"
msgstr "应用"
@@ -112,9 +112,15 @@ msgstr "é…ç½®"
msgid "Name"
msgstr "å称"
+msgid "Description"
+msgstr "æè¿°"
+
msgid "Run"
msgstr "è¿è¡Œ"
+msgid "Main Scene"
+msgstr "主场景"
+
msgid "Disable stdout"
msgstr "ç¦ç”¨æ ‡å‡†è¾“出"
@@ -142,33 +148,63 @@ msgstr "窗å£"
msgid "Size"
msgstr "大å°"
+msgid "Mode"
+msgstr "模å¼"
+
+msgid "Initial Position"
+msgstr "åˆå§‹ä½ç½®"
+
msgid "Resizable"
msgstr "å¯è°ƒæ•´å¤§å°"
msgid "Borderless"
msgstr "无边框"
+msgid "Always on Top"
+msgstr "置顶"
+
msgid "Transparent"
msgstr "é€æ˜Ž"
+msgid "Extend to Title"
+msgstr "延伸至标题"
+
+msgid "No Focus"
+msgstr "关闭èšç„¦"
+
msgid "Energy Saving"
msgstr "节能"
msgid "Keep Screen On"
msgstr "å±å¹•å¸¸äº®"
+msgid "Audio"
+msgstr "音频"
+
+msgid "Buses"
+msgstr "总线"
+
msgid "Editor"
msgstr "编辑器"
msgid "Main Run Args"
msgstr "主è¿è¡Œå‚æ•°"
+msgid "Default Signal Callback Name"
+msgstr "默认信å·å›žè°ƒå称"
+
+msgid "Default Signal Callback to Self Name"
+msgstr "默认信å·å›žè°ƒä¸ºè‡ªèº«å称"
+
msgid "Physics"
msgstr "物ç†"
msgid "2D"
msgstr "2D"
+msgid "Run on Separate Thread"
+msgstr "在独立的线程上è¿è¡Œ"
+
msgid "3D"
msgstr "3D"
@@ -178,6 +214,9 @@ msgstr "调试"
msgid "Settings"
msgstr "设置"
+msgid "Compression"
+msgstr "压缩"
+
msgid "Crash Handler"
msgstr "崩溃处ç†å™¨"
@@ -187,6 +226,42 @@ msgstr "消æ¯"
msgid "Rendering"
msgstr "渲染"
+msgid "Occlusion Culling"
+msgstr "é®æŒ¡å‰”除"
+
+msgid "Limits"
+msgstr "é™åˆ¶"
+
+msgid "Internationalization"
+msgstr "国际化"
+
+msgid "Force Right to Left Layout Direction"
+msgstr "强制从å³è‡³å·¦çš„布局方å‘"
+
+msgid "GUI"
+msgstr "GUI"
+
+msgid "Rendering Device"
+msgstr "渲染设备"
+
+msgid "Staging Buffer"
+msgstr "暂存缓冲区"
+
+msgid "Block Size (KB)"
+msgstr "å—大å°ï¼ˆKB)"
+
+msgid "Max Size (MB)"
+msgstr "最大大å°ï¼ˆMB)"
+
+msgid "Texture Upload Region Size Px"
+msgstr "纹ç†ä¸Šä¼ åŒºåŸŸåƒç´ å¤§å°"
+
+msgid "Vulkan"
+msgstr "Vulkan"
+
+msgid "Max Descriptors per Pool"
+msgstr "å„池最大æ述符数"
+
msgid "Low Processor Usage Mode"
msgstr "低处ç†å™¨ä½¿ç”¨æ¨¡å¼"
@@ -196,6 +271,15 @@ msgstr "低处ç†å™¨ä½¿ç”¨æ¨¡å¼ç¡çœ ï¼ˆå¾®ç§’)"
msgid "Print Error Messages"
msgstr "打å°é”™è¯¯æ¶ˆæ¯"
+msgid "Physics Ticks per Second"
+msgstr "æ¯ç§’物ç†å‘¨æœŸæ•°"
+
+msgid "Max Physics Steps per Frame"
+msgstr "æ¯å¸§æœ€å¤§ç‰©ç†è¿­ä»£æ•°"
+
+msgid "Max FPS"
+msgstr "最大 FPS"
+
msgid "Time Scale"
msgstr "时间缩放"
@@ -211,9 +295,36 @@ msgstr "使用累积输入"
msgid "Device"
msgstr "设备"
+msgid "Window ID"
+msgstr "çª—å£ ID"
+
+msgid "Command or Control Autoremap"
+msgstr "自动é‡æ˜ å°„ Command å’Œ Ctrl"
+
+msgid "Alt Pressed"
+msgstr "按下 Alt"
+
+msgid "Shift Pressed"
+msgstr "按下 Shift"
+
+msgid "Ctrl Pressed"
+msgstr "按下 Ctrl"
+
+msgid "Meta Pressed"
+msgstr "按下 Meta"
+
msgid "Pressed"
msgstr "按下"
+msgid "Keycode"
+msgstr "é”®ç "
+
+msgid "Physical Keycode"
+msgstr "物ç†é”®ç "
+
+msgid "Key Label"
+msgstr "按键标签"
+
msgid "Unicode"
msgstr "Unicode"
@@ -230,11 +341,14 @@ msgid "Global Position"
msgstr "全局ä½ç½®"
msgid "Factor"
-msgstr "å› ç´ "
+msgstr "系数"
msgid "Button Index"
msgstr "按钮索引"
+msgid "Double Click"
+msgstr "åŒå‡»"
+
msgid "Tilt"
msgstr "倾斜"
@@ -259,6 +373,9 @@ msgstr "轴值"
msgid "Index"
msgstr "索引"
+msgid "Double Tap"
+msgstr "åŒå‡»"
+
msgid "Action"
msgstr "动作"
@@ -286,9 +403,24 @@ msgstr "控制器值"
msgid "Shortcut"
msgstr "å¿«æ·é”®"
+msgid "Events"
+msgstr "事件"
+
+msgid "Include Navigational"
+msgstr "包å«å¯¼èˆªæ–‡ä»¶"
+
+msgid "Include Hidden"
+msgstr "包å«éšè—文件"
+
msgid "Big Endian"
msgstr "大端åº"
+msgid "Network"
+msgstr "网络"
+
+msgid "Page Size"
+msgstr "页大å°"
+
msgid "Blocking Mode Enabled"
msgstr "å¯ç”¨é˜»å¡žæ¨¡å¼"
@@ -296,7 +428,7 @@ msgid "Connection"
msgstr "连接"
msgid "Read Chunk Size"
-msgstr "加载å—大å°"
+msgstr "读å–å—大å°"
msgid "Data"
msgstr "æ•°æ®"
@@ -304,14 +436,20 @@ msgstr "æ•°æ®"
msgid "Object ID"
msgstr "对象 ID"
+msgid "Original Class"
+msgstr "原始类"
+
+msgid "Recording Properties"
+msgstr "记录属性"
+
msgid "Encode Buffer Max Size"
-msgstr "ç¼–ç ç¼“冲区大å°ä¸Šé™"
+msgstr "ç¼–ç ç¼“冲区最大大å°"
msgid "Input Buffer Max Size"
-msgstr "输入缓冲区大å°ä¸Šé™"
+msgstr "输入缓冲区最大大å°"
msgid "Output Buffer Max Size"
-msgstr "输出缓冲区大å°ä¸Šé™"
+msgstr "输出缓冲区最大大å°"
msgid "Stream Peer"
msgstr "æµå¯¹ç­‰ä½“"
@@ -319,15 +457,15 @@ msgstr "æµå¯¹ç­‰ä½“"
msgid "Resource"
msgstr "资æº"
+msgid "Local to Scene"
+msgstr "本地于场景"
+
msgid "Path"
msgstr "路径"
msgid "Data Array"
msgstr "æ•°æ®æ•°ç»„"
-msgid "Blocking Handshake"
-msgstr "阻塞æ¡æ‰‹"
-
msgid "Max Pending Connections"
msgstr "最大挂起连接数"
@@ -337,6 +475,18 @@ msgstr "å移"
msgid "Cell Size"
msgstr "å•å…ƒæ ¼å¤§å°"
+msgid "Jumping Enabled"
+msgstr "å¯ç”¨è·³è·ƒ"
+
+msgid "Default Compute Heuristic"
+msgstr "默认计算å¯å‘"
+
+msgid "Default Estimate Heuristic"
+msgstr "默认预估å¯å‘"
+
+msgid "Diagonal Mode"
+msgstr "对角模å¼"
+
msgid "Seed"
msgstr "ç§å­"
@@ -346,6 +496,24 @@ msgstr "状æ€"
msgid "Source Code"
msgstr "æºä»£ç "
+msgid "TLS"
+msgstr "TLS"
+
+msgid "Threading"
+msgstr "多线程"
+
+msgid "Worker Pool"
+msgstr "工作池"
+
+msgid "Max Threads"
+msgstr "最大线程数"
+
+msgid "Use System Threads for Low Priority Tasks"
+msgstr "将系统线程用于低优先级任务"
+
+msgid "Low Priority Thread Ratio"
+msgstr "低优先级线程比率"
+
msgid "Locale"
msgstr "区域"
@@ -355,15 +523,36 @@ msgstr "测试"
msgid "Fallback"
msgstr "回退"
+msgid "Pseudolocalization"
+msgstr "伪本地化"
+
+msgid "Use Pseudolocalization"
+msgstr "使用伪本地化"
+
+msgid "Replace With Accents"
+msgstr "使用é‡éŸ³ç¬¦æ›¿æ¢"
+
+msgid "Double Vowels"
+msgstr "元音åŒå†™"
+
+msgid "Fake BiDi"
+msgstr "伪 BiDi"
+
msgid "Override"
msgstr "覆盖"
+msgid "Expansion Ratio"
+msgstr "扩展比"
+
msgid "Prefix"
msgstr "å‰ç¼€"
msgid "Suffix"
msgstr "åŽç¼€"
+msgid "Skip Placeholders"
+msgstr "跳过å ä½ç¬¦"
+
msgid "Rotation"
msgstr "旋转"
@@ -388,6 +577,9 @@ msgstr "入点手柄"
msgid "Out Handle"
msgstr "出点手柄"
+msgid "Handle Mode"
+msgstr "手柄模å¼"
+
msgid "Stream"
msgstr "æµ"
@@ -403,21 +595,24 @@ msgstr "动画"
msgid "Easing"
msgstr "缓入缓出"
-msgid "Interface"
-msgstr "ç•Œé¢"
-
-msgid "Editors"
-msgstr "å„编辑器"
-
-msgid "Network"
-msgstr "网络"
+msgid "Debug Adapter"
+msgstr "调试适é…器"
msgid "Remote Port"
msgstr "远程端å£"
+msgid "Request Timeout"
+msgstr "请求超时"
+
+msgid "Sync Breakpoints"
+msgstr "åŒæ­¥æ–­ç‚¹"
+
msgid "Debugger"
msgstr "调试器"
+msgid "Auto Switch to Remote Scene Tree"
+msgstr "自动切æ¢åˆ°è¿œç¨‹åœºæ™¯æ ‘"
+
msgid "Remote Scene Tree Refresh Interval"
msgstr "远程场景树刷新间隔"
@@ -436,6 +631,9 @@ msgstr "访问"
msgid "Display Mode"
msgstr "显示模å¼"
+msgid "File Mode"
+msgstr "文件模å¼"
+
msgid "Current Dir"
msgstr "当å‰ç›®å½•"
@@ -457,6 +655,9 @@ msgstr "导入"
msgid "Reimport Missing Imported Files"
msgstr "é‡æ–°å¯¼å…¥ç¼ºå¤±çš„已导入文件"
+msgid "Use Multiple Threads"
+msgstr "使用多线程"
+
msgid "Text Editor"
msgstr "文本编辑器"
@@ -478,11 +679,20 @@ msgstr "å¯å‹¾é€‰"
msgid "Checked"
msgstr "已勾选"
+msgid "Draw Warning"
+msgstr "绘制警告"
+
msgid "Keying"
msgstr "制作关键帧"
-msgid "Main Scene"
-msgstr "主场景"
+msgid "Deletable"
+msgstr "å¯åˆ é™¤"
+
+msgid "Interface"
+msgstr "ç•Œé¢"
+
+msgid "Save on Focus Loss"
+msgstr "焦点丢失时ä¿å­˜"
msgid "Show Update Spinner"
msgstr "显示更新旋转图"
@@ -496,6 +706,9 @@ msgstr "设置本地化"
msgid "Scene Tabs"
msgstr "场景选项å¡"
+msgid "Restore Scenes on Load"
+msgstr "加载时æ¢å¤åœºæ™¯"
+
msgid "Inspector"
msgstr "检查器"
@@ -517,9 +730,18 @@ msgstr "横å‘编辑 Vector2"
msgid "Horizontal Vector Types Editing"
msgstr "横å‘编辑 Vector 类型"
+msgid "Open Resources in Current Inspector"
+msgstr "在当å‰æ£€æŸ¥å™¨ä¸­æ‰“开资æº"
+
+msgid "Resources to Open in New Inspector"
+msgstr "在新检查器中打开的资æº"
+
msgid "Default Color Picker Mode"
msgstr "默认å–色器模å¼"
+msgid "Default Color Picker Shape"
+msgstr "默认å–色器形状"
+
msgid "Distraction Free Mode"
msgstr "专注模å¼"
@@ -544,6 +766,15 @@ msgstr "编辑器语言"
msgid "Display Scale"
msgstr "显示缩放"
+msgid "Enable Pseudolocalization"
+msgstr "å¯ç”¨ä¼ªæœ¬åœ°åŒ–"
+
+msgid "Use Embedded Menu"
+msgstr "使用嵌入å¼èœå•"
+
+msgid "Expand to Title"
+msgstr "扩展至标题æ "
+
msgid "Custom Display Scale"
msgstr "自定义显示缩放"
@@ -553,9 +784,24 @@ msgstr "主字体大å°"
msgid "Code Font Size"
msgstr "代ç å­—体大å°"
+msgid "Code Font Contextual Ligatures"
+msgstr "代ç å­—体上下文连字"
+
+msgid "Code Font Custom OpenType Features"
+msgstr "代ç å­—体自定义 OpenType 功能"
+
+msgid "Code Font Custom Variations"
+msgstr "代ç å­—体自定义å˜ä½“"
+
+msgid "Font Antialiasing"
+msgstr "字体抗锯齿"
+
msgid "Font Hinting"
msgstr "字体微调"
+msgid "Font Subpixel Positioning"
+msgstr "字体次åƒç´ å®šä½"
+
msgid "Main Font"
msgstr "主字体"
@@ -577,15 +823,36 @@ msgstr "å•ç‹¬çš„专注模å¼"
msgid "Automatically Open Screenshots"
msgstr "自动打开截图"
+msgid "Single Window Mode"
+msgstr "å•çª—å£æ¨¡å¼"
+
msgid "Mouse Extra Buttons Navigate History"
msgstr "使用专门鼠标按键查看历å²"
+msgid "Save Each Scene on Quit"
+msgstr "退出时ä¿å­˜å„场景"
+
+msgid "Accept Dialog Cancel OK Buttons"
+msgstr "接å—对è¯æ¡†å–消/确定按钮"
+
+msgid "Show Internal Errors in Toast Notifications"
+msgstr "在 Toast 通知中显示内部错误"
+
+msgid "Max Array Dictionary Items per Page"
+msgstr "æ¯é¡µæœ€å¤§æ•°ç»„å­—å…¸æ¡ç›®æ•°"
+
+msgid "Show Low Level OpenType Features"
+msgstr "显示低级 OpenType 功能"
+
msgid "Theme"
msgstr "主题"
msgid "Preset"
msgstr "预设"
+msgid "Icon and Font Color"
+msgstr "图标与字体颜色"
+
msgid "Base Color"
msgstr "基础颜色"
@@ -595,6 +862,12 @@ msgstr "强调颜色"
msgid "Contrast"
msgstr "对比度"
+msgid "Draw Extra Borders"
+msgstr "绘制é¢å¤–边框"
+
+msgid "Icon Saturation"
+msgstr "图标饱和度"
+
msgid "Relationship Line Opacity"
msgstr "关系线ä¸é€æ˜Žåº¦"
@@ -610,12 +883,36 @@ msgstr "é¢å¤–é—´è·"
msgid "Custom Theme"
msgstr "自定义主题"
+msgid "Display Close Button"
+msgstr "显示关闭按钮"
+
+msgid "Show Thumbnail on Hover"
+msgstr "悬åœæ—¶æ˜¾ç¤ºç¼©ç•¥å›¾"
+
+msgid "Maximum Width"
+msgstr "最大宽度"
+
msgid "Show Script Button"
msgstr "显示脚本按钮"
msgid "FileSystem"
msgstr "文件系统"
+msgid "External Programs"
+msgstr "外部程åº"
+
+msgid "Raster Image Editor"
+msgstr "栅格图编辑器"
+
+msgid "Vector Image Editor"
+msgstr "矢é‡å›¾ç¼–辑器"
+
+msgid "Audio Editor"
+msgstr "音频编辑器"
+
+msgid "3D Model Editor"
+msgstr "3D 模型编辑器"
+
msgid "Directories"
msgstr "目录"
@@ -631,6 +928,9 @@ msgstr "ä¿å­˜æ—¶"
msgid "Compress Binary Resources"
msgstr "压缩二进制资æº"
+msgid "Safe Save on Backup then Rename"
+msgstr "安全ä¿å­˜å¤‡ä»½åŽé‡å‘½å"
+
msgid "File Dialog"
msgstr "文件对è¯æ¡†"
@@ -644,19 +944,25 @@ msgid "Scene Tree"
msgstr "场景树"
msgid "Start Create Dialog Fully Expanded"
-msgstr "默认完全展开创建对è¯æ¡†"
+msgstr "打开创建对è¯æ¡†æ—¶å®Œå…¨å±•å¼€"
+
+msgid "Auto Expand to Selected"
+msgstr "自动展开至选定项"
msgid "Always Show Folders"
msgstr "总是显示文件夹"
+msgid "Textfile Extensions"
+msgstr "文本文件扩展å"
+
msgid "Property Editor"
msgstr "属性编辑器"
msgid "Auto Refresh Interval"
-msgstr "自动刷新频率"
+msgstr "自动刷新间隔"
msgid "Subresource Hue Tint"
-msgstr "å­èµ„æºå½©è‰²æ˜¾ç¤º"
+msgstr "å­èµ„æºè‰²ç›¸è°ƒæ•´"
msgid "Color Theme"
msgstr "颜色主题"
@@ -670,20 +976,29 @@ msgstr "光标"
msgid "Caret Blink"
msgstr "光标闪çƒ"
+msgid "Caret Blink Interval"
+msgstr "光标闪çƒé—´éš”"
+
msgid "Highlight Current Line"
msgstr "高亮当å‰è¡Œ"
msgid "Highlight All Occurrences"
msgstr "高亮所有匹é…项"
+msgid "Guidelines"
+msgstr "辅助线"
+
msgid "Show Line Length Guidelines"
msgstr "显示行长度å‚考线"
msgid "Line Length Guideline Soft Column"
-msgstr "行长度å‚考线软列数"
+msgstr "行长度软å‚考线列数"
msgid "Line Length Guideline Hard Column"
-msgstr "行长度å‚考线硬列数"
+msgstr "行长度硬å‚考线列数"
+
+msgid "Gutters"
+msgstr "装订线"
msgid "Show Line Numbers"
msgstr "显示行å·"
@@ -709,12 +1024,18 @@ msgstr "显示å°åœ°å›¾"
msgid "Minimap Width"
msgstr "å°åœ°å›¾å®½åº¦"
+msgid "Lines"
+msgstr "行"
+
msgid "Code Folding"
msgstr "代ç æŠ˜å "
msgid "Word Wrap"
msgstr "自动æ¢è¡Œ"
+msgid "Whitespace"
+msgstr "空格"
+
msgid "Draw Tabs"
msgstr "绘制制表符"
@@ -724,15 +1045,30 @@ msgstr "绘制空格"
msgid "Line Spacing"
msgstr "行间è·"
+msgid "Behavior"
+msgstr "行为"
+
msgid "Navigation"
msgstr "导航"
+msgid "Move Caret on Right Click"
+msgstr "在å³é”®å•å‡»æ—¶ç§»åŠ¨å…‰æ ‡"
+
+msgid "Scroll Past End of File"
+msgstr "滚动越过文件末尾"
+
msgid "Smooth Scrolling"
msgstr "平滑滚动"
msgid "V Scroll Speed"
msgstr "垂直滚动速度"
+msgid "Drag and Drop Selection"
+msgstr "拖放选区"
+
+msgid "Stay in Script Editor on Node Selected"
+msgstr "选择节点时åœç•™åœ¨è„šæœ¬ç¼–辑器"
+
msgid "Indent"
msgstr "缩进"
@@ -742,9 +1078,21 @@ msgstr "自动缩进"
msgid "Files"
msgstr "文件"
+msgid "Trim Trailing Whitespace on Save"
+msgstr "ä¿å­˜æ—¶ç§»é™¤è¡Œå°¾ç©ºæ ¼"
+
msgid "Autosave Interval Secs"
msgstr "自动ä¿å­˜é—´éš”秒数"
+msgid "Restore Scripts on Load"
+msgstr "加载时æ¢å¤è„šæœ¬"
+
+msgid "Convert Indent on Save"
+msgstr "ä¿å­˜æ—¶è½¬æ¢ç¼©è¿›"
+
+msgid "Auto Reload Scripts on External Change"
+msgstr "外部修改时自动é‡æ–°åŠ è½½è„šæœ¬"
+
msgid "Script List"
msgstr "脚本列表"
@@ -790,17 +1138,23 @@ msgstr "帮助æºç å­—体大å°"
msgid "Help Title Font Size"
msgstr "帮助标题字体大å°"
+msgid "Class Reference Examples"
+msgstr "ç±»å‚考示例"
+
+msgid "Editors"
+msgstr "å„编辑器"
+
msgid "Grid Map"
-msgstr "网格地图"
+msgstr "栅格地图"
msgid "Pick Distance"
msgstr "拾å–è·ç¦»"
msgid "Primary Grid Color"
-msgstr "主网格颜色"
+msgstr "主栅格颜色"
msgid "Secondary Grid Color"
-msgstr "次网格颜色"
+msgstr "次栅格颜色"
msgid "Selection Box Color"
msgstr "选择框颜色"
@@ -811,6 +1165,9 @@ msgstr "3D å°å·¥å…·"
msgid "Gizmo Colors"
msgstr "å°å·¥å…·é¢œè‰²"
+msgid "Instantiated"
+msgstr "实例化的"
+
msgid "Joint"
msgstr "关节"
@@ -818,28 +1175,28 @@ msgid "Shape"
msgstr "形状"
msgid "Primary Grid Steps"
-msgstr "主网格步长"
+msgstr "主栅格步长"
msgid "Grid Size"
-msgstr "网格大å°"
+msgstr "栅格大å°"
msgid "Grid Division Level Max"
-msgstr "网格细分级别上é™"
+msgstr "栅格细分级别上é™"
msgid "Grid Division Level Min"
-msgstr "网格细分级别下é™"
+msgstr "栅格细分级别下é™"
msgid "Grid Division Level Bias"
-msgstr "网格细分级别åç½®"
+msgstr "栅格细分级别åç½®"
msgid "Grid XZ Plane"
-msgstr "网格 XZ å¹³é¢"
+msgstr "æ …æ ¼ XZ å¹³é¢"
msgid "Grid XY Plane"
-msgstr "网格 XY å¹³é¢"
+msgstr "æ …æ ¼ XY å¹³é¢"
msgid "Grid YZ Plane"
-msgstr "网格 YZ å¹³é¢"
+msgstr "æ …æ ¼ YZ å¹³é¢"
msgid "Default FOV"
msgstr "默认 FOV"
@@ -878,7 +1235,7 @@ msgid "Zoom Modifier"
msgstr "缩放修饰键"
msgid "Warped Mouse Panning"
-msgstr "鼠标平移跳跃"
+msgstr "é¼ æ ‡æŒç»­å¹³ç§»"
msgid "Navigation Feel"
msgstr "导航体验"
@@ -892,9 +1249,6 @@ msgstr "环绕惯性"
msgid "Translation Inertia"
msgstr "平移惯性"
-msgid "Zoom Inertia"
-msgstr "缩放关心"
-
msgid "Freelook"
msgstr "自由观看"
@@ -917,7 +1271,7 @@ msgid "Freelook Speed Zoom Link"
msgstr "自由观看速度缩放关è”"
msgid "Grid Color"
-msgstr "网格颜色"
+msgstr "栅格颜色"
msgid "Guides Color"
msgstr "å‚考线颜色"
@@ -944,7 +1298,7 @@ msgid "Bone Outline Color"
msgstr "骨骼轮廓颜色"
msgid "Bone Outline Size"
-msgstr "骨骼轮廓颜色"
+msgstr "骨骼轮廓大å°"
msgid "Viewport Border Color"
msgstr "视å£è¾¹æ¡†é¢œè‰²"
@@ -952,14 +1306,35 @@ msgstr "视å£è¾¹æ¡†é¢œè‰²"
msgid "Constrain Editor View"
msgstr "é™åˆ¶ç¼–辑器视图"
+msgid "Panning"
+msgstr "平移"
+
+msgid "2D Editor Panning Scheme"
+msgstr "2D 编辑器平移方案"
+
+msgid "Sub Editors Panning Scheme"
+msgstr "å­ç¼–辑器平移方案"
+
+msgid "Animation Editors Panning Scheme"
+msgstr "动画编辑器平移方案"
+
msgid "Simple Panning"
msgstr "简å•å¹³ç§»"
+msgid "2D Editor Pan Speed"
+msgstr "2D 编辑器平移速度"
+
+msgid "Tiles Editor"
+msgstr "图å—编辑器"
+
msgid "Display Grid"
-msgstr "显示网格"
+msgstr "显示栅格"
+
+msgid "Polygon Editor"
+msgstr "多边形编辑器"
msgid "Point Grab Radius"
-msgstr "å¥æŸ„点åŠå¾„"
+msgstr "点抓å–åŠå¾„"
msgid "Show Previous Outline"
msgstr "显示旧有轮廓"
@@ -988,6 +1363,15 @@ msgstr "å¯è§†åŒ–编辑器"
msgid "Minimap Opacity"
msgstr "å°åœ°å›¾ä¸é€æ˜Žåº¦"
+msgid "Lines Curvature"
+msgstr "线æ¡æ›²çŽ‡"
+
+msgid "Visual Shader"
+msgstr "å¯è§†åŒ–ç€è‰²å™¨"
+
+msgid "Port Preview Size"
+msgstr "端å£é¢„览大å°"
+
msgid "Window Placement"
msgstr "窗å£æ”¾ç½®"
@@ -1012,9 +1396,21 @@ msgstr "输出"
msgid "Font Size"
msgstr "字体大å°"
+msgid "Always Clear Output on Play"
+msgstr "è¿è¡Œæ—¶æ¸…空输出"
+
+msgid "Always Open Output on Play"
+msgstr "è¿è¡Œæ—¶æ‰“开输出"
+
+msgid "Always Close Output on Stop"
+msgstr "åœæ­¢æ—¶å…³é—­è¾“出"
+
msgid "Remote Host"
msgstr "远程主机"
+msgid "Editor TLS Certificates"
+msgstr "编辑器 TLS è¯ä¹¦"
+
msgid "Profiler Frame History Size"
msgstr "性能分æžå™¨å¸§åŽ†å²å¤§å°"
@@ -1033,6 +1429,9 @@ msgstr "项目管ç†å™¨"
msgid "Sorting Order"
msgstr "排åºæ–¹å¼"
+msgid "Default Renderer"
+msgstr "默认渲染器"
+
msgid "Highlighting"
msgstr "高亮"
@@ -1075,6 +1474,9 @@ msgstr "补全存在颜色"
msgid "Completion Scroll Color"
msgstr "补全滚动æ¡é¢œè‰²"
+msgid "Completion Scroll Hovered Color"
+msgstr "补全滚动æ¡æ‚¬åœé¢œè‰²"
+
msgid "Completion Font Color"
msgstr "补全字体颜色"
@@ -1097,7 +1499,7 @@ msgid "Text Selected Color"
msgstr "文本选中颜色"
msgid "Selection Color"
-msgstr "选中颜色"
+msgstr "选区颜色"
msgid "Brace Mismatch Color"
msgstr "括å·ä¸åŒ¹é…颜色"
@@ -1153,12 +1555,18 @@ msgstr "缩放"
msgid "Export"
msgstr "导出"
+msgid "Convert Text Resources to Binary"
+msgstr "将文本资æºè½¬æ¢ä¸ºäºŒè¿›åˆ¶"
+
msgid "Custom Template"
msgstr "自定义模æ¿"
msgid "Release"
msgstr "å‘布"
+msgid "Export Console Script"
+msgstr "导出命令行脚本"
+
msgid "Binary Format"
msgstr "二进制格å¼"
@@ -1183,6 +1591,12 @@ msgstr "ETC2"
msgid "No BPTC Fallbacks"
msgstr "无 BPTC 回退"
+msgid "SSH"
+msgstr "SSH"
+
+msgid "SCP"
+msgstr "SCP"
+
msgid "Export Path"
msgstr "导出路径"
@@ -1192,20 +1606,74 @@ msgstr "文件æœåŠ¡å™¨"
msgid "Password"
msgstr "密ç "
+msgid "Antialiasing"
+msgstr "抗锯齿"
+
+msgid "Generate Mipmaps"
+msgstr "ç”Ÿæˆ Mipmap"
+
+msgid "Multichannel Signed Distance Field"
+msgstr "多通é“带符å·è·ç¦»åœº"
+
+msgid "MSDF Pixel Range"
+msgstr "MSDF åƒç´ èŒƒå›´"
+
+msgid "MSDF Size"
+msgstr "MSDF 大å°"
+
+msgid "Allow System Fallback"
+msgstr "å…许系统回退"
+
+msgid "Force Autohinter"
+msgstr "强制自动微调"
+
msgid "Hinting"
msgstr "微调"
+msgid "Subpixel Positioning"
+msgstr "次åƒç´ å®šä½"
+
msgid "Oversampling"
msgstr "过采样"
+msgid "Metadata Overrides"
+msgstr "元数æ®è¦†ç›–"
+
+msgid "Language Support"
+msgstr "语言支æŒ"
+
+msgid "Script Support"
+msgstr "脚本支æŒ"
+
+msgid "OpenType Features"
+msgstr "OpenType 特性"
+
+msgid "Fallbacks"
+msgstr "回退"
+
msgid "Compress"
msgstr "压缩"
+msgid "Language"
+msgstr "语言"
+
msgid "Outline Size"
msgstr "轮廓大å°"
msgid "Variation"
-msgstr "å˜åŒ–"
+msgstr "å˜ä½“"
+
+msgid "OpenType"
+msgstr "OpenType"
+
+msgid "Embolden"
+msgstr "加粗"
+
+msgid "Face Index"
+msgstr "å­—é¢ç´¢å¼•"
+
+msgid "Transform"
+msgstr "å˜æ¢"
msgid "Collada"
msgstr "Collada"
@@ -1213,9 +1681,39 @@ msgstr "Collada"
msgid "Use Ambient"
msgstr "使用环境光"
+msgid "Retarget"
+msgstr "é‡å®šå‘"
+
+msgid "Bone Renamer"
+msgstr "骨骼命å器"
+
+msgid "Rename Bones"
+msgstr "é‡å‘½å骨骼"
+
+msgid "Unique Node"
+msgstr "唯一节点"
+
msgid "Make Unique"
msgstr "唯一化"
+msgid "Skeleton Name"
+msgstr "骨架å称"
+
+msgid "Rest Fixer"
+msgstr "放æ¾ä¿®å¤å™¨"
+
+msgid "Apply Node Transforms"
+msgstr "应用节点å˜æ¢"
+
+msgid "Normalize Position Tracks"
+msgstr "归一化ä½ç½®è½¨é“"
+
+msgid "Overwrite Axis"
+msgstr "覆盖轴"
+
+msgid "Fix Silhouette"
+msgstr "ä¿®å¤å‰ªå½±"
+
msgid "Enable"
msgstr "å¯ç”¨"
@@ -1225,6 +1723,21 @@ msgstr "过滤"
msgid "Threshold"
msgstr "阈值"
+msgid "Base Height Adjustment"
+msgstr "基础高度调整"
+
+msgid "Remove Tracks"
+msgstr "移除轨é“"
+
+msgid "Except Bone Transform"
+msgstr "排除骨骼å˜æ¢"
+
+msgid "Unimportant Positions"
+msgstr "éžé‡è¦ä½ç½®"
+
+msgid "Unmapped Bones"
+msgstr "未映射骨骼"
+
msgid "Create From"
msgstr "创建自"
@@ -1234,17 +1747,29 @@ msgstr "分隔符"
msgid "Preload"
msgstr "预加载"
+msgid "Character Ranges"
+msgstr "字符范围"
+
msgid "Columns"
msgstr "列数"
-msgid "Mode"
-msgstr "模å¼"
+msgid "Rows"
+msgstr "行数"
+
+msgid "Image Margin"
+msgstr "图片边è·"
+
+msgid "Character Margin"
+msgstr "字符边è·"
msgid "Lossy Quality"
msgstr "有æŸè´¨é‡"
-msgid "BPTC LDR"
-msgstr "BPTC LDR"
+msgid "HDR Compression"
+msgstr "HDR 压缩"
+
+msgid "Channel Pack"
+msgstr "通é“打包"
msgid "Mipmaps"
msgstr "Mipmap"
@@ -1264,6 +1789,9 @@ msgstr "æ°´å¹³"
msgid "Vertical"
msgstr "åž‚ç›´"
+msgid "Arrangement"
+msgstr "排列"
+
msgid "Layout"
msgstr "布局"
@@ -1279,15 +1807,36 @@ msgstr "缩放网格"
msgid "Offset Mesh"
msgstr "å移网格"
+msgid "Optimize Mesh"
+msgstr "优化网格"
+
+msgid "Skip Import"
+msgstr "跳过导入"
+
msgid "NavMesh"
msgstr "导航网格"
+msgid "Body Type"
+msgstr "实体类型"
+
+msgid "Shape Type"
+msgstr "形状类型"
+
+msgid "Decomposition"
+msgstr "拆分"
+
msgid "Advanced"
msgstr "高级"
msgid "Precision"
msgstr "精度"
+msgid "Symmetry Planes Clipping Bias"
+msgstr "对称平é¢è£å‰ªåç½®"
+
+msgid "Normalize Mesh"
+msgstr "归一化网格"
+
msgid "Height"
msgstr "高度"
@@ -1297,11 +1846,35 @@ msgstr "åŠå¾„"
msgid "Occluder"
msgstr "é®æŒ¡å™¨"
+msgid "Simplification Distance"
+msgstr "化简è·ç¦»"
+
+msgid "Save to File"
+msgstr "ä¿å­˜ä¸ºæ–‡ä»¶"
+
msgid "Enabled"
msgstr "å¯ç”¨"
+msgid "Shadow Meshes"
+msgstr "阴影网格"
+
+msgid "Lightmap UV"
+msgstr "光照贴图 UV"
+
+msgid "Lods"
+msgstr "LOD"
+
+msgid "Normal Split Angle"
+msgstr "法线拆分角度"
+
+msgid "Normal Merge Angle"
+msgstr "法线åˆå¹¶è§’度"
+
+msgid "Use External"
+msgstr "使用外部"
+
msgid "Loop Mode"
-msgstr "æ··æ¢æ¨¡å¼"
+msgstr "循环模å¼"
msgid "Keep Custom Tracks"
msgstr "ä¿ç•™è‡ªå®šä¹‰è½¨é“"
@@ -1309,14 +1882,20 @@ msgstr "ä¿ç•™è‡ªå®šä¹‰è½¨é“"
msgid "Optimizer"
msgstr "优化器"
+msgid "Max Velocity Error"
+msgstr "最大速度误差"
+
msgid "Max Angular Error"
msgstr "最大角度误差"
-msgid "Compression"
-msgstr "压缩"
+msgid "Max Precision Error"
+msgstr "最大精度误差"
-msgid "Page Size"
-msgstr "页大å°"
+msgid "Import Tracks"
+msgstr "导入轨é“"
+
+msgid "Bone Map"
+msgstr "骨骼映射"
msgid "Nodes"
msgstr "节点"
@@ -1327,6 +1906,9 @@ msgstr "根类型"
msgid "Root Name"
msgstr "æ ¹å称"
+msgid "Apply Root Scale"
+msgstr "应用根缩放"
+
msgid "Root Scale"
msgstr "根缩放"
@@ -1336,6 +1918,12 @@ msgstr "网格"
msgid "Ensure Tangents"
msgstr "ç¡®ä¿åˆ‡çº¿"
+msgid "Generate Lods"
+msgstr "ç”Ÿæˆ LOD"
+
+msgid "Create Shadow Meshes"
+msgstr "创建阴影网格"
+
msgid "Light Baking"
msgstr "光照烘焙"
@@ -1351,12 +1939,18 @@ msgstr "使用具å蒙皮"
msgid "FPS"
msgstr "FPS"
+msgid "Import Script"
+msgstr "导入脚本"
+
msgid "Normal Map"
msgstr "法线贴图"
msgid "Roughness"
msgstr "粗糙度"
+msgid "Src Normal"
+msgstr "原法线"
+
msgid "Process"
msgstr "处ç†"
@@ -1369,21 +1963,39 @@ msgstr "预乘 Alpha"
msgid "Normal Map Invert Y"
msgstr "法线贴图å转 Y"
+msgid "HDR as sRGB"
+msgstr "HDR 作为 sRGB"
+
+msgid "HDR Clamp Exposure"
+msgstr "HDR é™åˆ¶æ›å…‰"
+
msgid "Size Limit"
msgstr "大å°é™åˆ¶"
msgid "Detect 3D"
msgstr "检测 3D"
+msgid "Compress To"
+msgstr "压缩至"
+
msgid "SVG"
msgstr "SVG"
+msgid "Scale With Editor Scale"
+msgstr "ä¾ç…§ç¼–辑器比例缩放"
+
+msgid "Convert Colors With Editor Theme"
+msgstr "ä¾ç…§ç¼–辑器主题转æ¢é¢œè‰²"
+
msgid "Atlas File"
msgstr "图集文件"
msgid "Import Mode"
msgstr "导入模å¼"
+msgid "Crop to Region"
+msgstr "è£å‰ªè‡³åŒºåŸŸ"
+
msgid "Trim Alpha Border From Region"
msgstr "从区域修剪 Alpha 边框"
@@ -1418,7 +2030,7 @@ msgid "Loop End"
msgstr "循环终点"
msgid "Asset Library"
-msgstr "ç´ æ库"
+msgstr "资产库"
msgid "Use Threads"
msgstr "使用线程"
@@ -1426,6 +2038,15 @@ msgstr "使用线程"
msgid "Available URLs"
msgstr "å¯ç”¨ URL"
+msgid "Unset"
+msgstr "未设置"
+
+msgid "Set"
+msgstr "设置"
+
+msgid "Missing"
+msgstr "缺失"
+
msgid "Error"
msgstr "错误"
@@ -1441,15 +2062,30 @@ msgstr "VisibilityNotifier"
msgid "Particles"
msgstr "ç²’å­"
+msgid "Particle Attractor"
+msgstr "ç²’å­å¸å¼•å™¨"
+
+msgid "Particle Collision"
+msgstr "ç²’å­ç¢°æ’ž"
+
msgid "Reflection Probe"
msgstr "å射探针"
+msgid "Decal"
+msgstr "贴花"
+
+msgid "Voxel GI"
+msgstr "体素 GI"
+
msgid "Joint Body A"
msgstr "关节实体 A"
msgid "Joint Body B"
msgstr "关节实体 B"
+msgid "Fog Volume"
+msgstr "雾体积"
+
msgid "Manipulator Gizmo Size"
msgstr "æ“作å°å·¥å…·å¤§å°"
@@ -1459,6 +2095,12 @@ msgstr "æ“作å°å·¥å…·ä¸é€æ˜Žåº¦"
msgid "Show Viewport Rotation Gizmo"
msgstr "显示视å£æ—‹è½¬å°å·¥å…·"
+msgid "Show Viewport Navigation Gizmo"
+msgstr "显示视å£å¯¼èˆªå°å·¥å…·"
+
+msgid "Auto Reload and Parse Scripts on Save"
+msgstr "ä¿å­˜æ—¶è‡ªåŠ¨é‡æ–°åŠ è½½å¹¶è§£æžè„šæœ¬"
+
msgid "External"
msgstr "外部"
@@ -1469,16 +2111,16 @@ msgid "Exec Path"
msgstr "å¯æ‰§è¡Œæ–‡ä»¶è·¯å¾„"
msgid "Script Temperature Enabled"
-msgstr "å¯ç”¨è„šæœ¬æ¸©åº¦"
+msgstr "å¯ç”¨è„šæœ¬çƒ­åº¦"
msgid "Script Temperature History Size"
-msgstr "脚本温度历å²å¤§å°"
+msgstr "脚本热度历å²å¤§å°"
msgid "Group Help Pages"
msgstr "帮助页分组"
msgid "Sort Scripts By"
-msgstr "脚本排åº"
+msgstr "脚本排åºæ–¹å¼"
msgid "List Script Names As"
msgstr "列表中的脚本å称"
@@ -1487,17 +2129,38 @@ msgid "Exec Flags"
msgstr "执行å‚æ•°"
msgid "Skeleton"
-msgstr "Skeleton"
+msgstr "骨架"
+
+msgid "Selected Bone"
+msgstr "选中骨骼"
+
+msgid "Gizmo Settings"
+msgstr "å°å·¥å…·è®¾ç½®"
+
+msgid "Bone Shape"
+msgstr "骨骼形状"
+
+msgid "Shader Language"
+msgstr "ç€è‰²å™¨è¯­è¨€"
msgid "Warnings"
msgstr "警告"
+msgid "Treat Warnings as Errors"
+msgstr "将警告当作错误"
+
msgid "ID"
msgstr "ID"
msgid "Version Control"
msgstr "版本控制"
+msgid "Plugin Name"
+msgstr "æ’件å"
+
+msgid "Autoload on Startup"
+msgstr "å¯åŠ¨æ—¶è‡ªåŠ¨åŠ è½½"
+
msgid "Username"
msgstr "用户å"
@@ -1507,12 +2170,21 @@ msgstr "SSH 公钥路径"
msgid "SSH Private Key Path"
msgstr "SSH ç§é’¥è·¯å¾„"
+msgid "Edited Property"
+msgstr "编辑的属性"
+
msgid "Show Scene Tree Root Selection"
msgstr "显示场景树根选择"
+msgid "Derive Script Globals by Name"
+msgstr "按全局脚本å称派生"
+
msgid "Use Favorites Root Selection"
msgstr "使用收è—根选择"
+msgid "Flush stdout on Print"
+msgstr "打å°æ—¶æ¸…空标准输出"
+
msgid "File Logging"
msgstr "文件日志"
@@ -1525,6 +2197,18 @@ msgstr "日志路径"
msgid "Driver"
msgstr "驱动"
+msgid "GL Compatibility"
+msgstr "GL 兼容性"
+
+msgid "Renderer"
+msgstr "渲染器"
+
+msgid "Rendering Method"
+msgstr "渲染方法"
+
+msgid "Include Text Server Data"
+msgstr "包括文本æœåŠ¡å™¨æ•°æ®"
+
msgid "DPI"
msgstr "DPI"
@@ -1543,9 +2227,6 @@ msgstr "线程"
msgid "Thread Model"
msgstr "线程模型"
-msgid "Audio"
-msgstr "音频"
-
msgid "Handheld"
msgstr "手æŒè®¾å¤‡"
@@ -1555,6 +2236,9 @@ msgstr "æœå‘"
msgid "V-Sync"
msgstr "åž‚ç›´åŒæ­¥"
+msgid "V-Sync Mode"
+msgstr "åž‚ç›´åŒæ­¥æ¨¡å¼"
+
msgid "Common"
msgstr "通用"
@@ -1564,6 +2248,9 @@ msgstr "标准输出"
msgid "Print FPS"
msgstr "æ‰“å° FPS"
+msgid "Print GPU Profile"
+msgstr "输出 GPU é…ç½®"
+
msgid "Verbose stdout"
msgstr "冗长标准输出"
@@ -1573,48 +2260,78 @@ msgstr "低处ç†å™¨æ¨¡å¼"
msgid "iOS"
msgstr "iOS"
+msgid "Allow High Refresh Rate"
+msgstr "å…许高刷新率"
+
msgid "Hide Home Indicator"
msgstr "éšè— Home 指示æ¡"
+msgid "Hide Status Bar"
+msgstr "éšè—状æ€æ "
+
+msgid "Input Devices"
+msgstr "输入设备"
+
+msgid "Pointing"
+msgstr "指点"
+
+msgid "XR"
+msgstr "XR"
+
+msgid "OpenXR"
+msgstr "OpenXR"
+
+msgid "Submit Depth Buffer"
+msgstr "æ交深度缓冲区"
+
msgid "Boot Splash"
msgstr "å¯åŠ¨é¡µ"
msgid "BG Color"
msgstr "背景色"
-msgid "Input Devices"
-msgstr "输入设备"
+msgid "Pen Tablet"
+msgstr "æ•°ä½æ¿"
msgid "Environment"
msgstr "环境"
+msgid "Defaults"
+msgstr "默认"
+
msgid "Default Clear Color"
msgstr "默认清å±é¢œè‰²"
msgid "Show Image"
msgstr "显示图åƒ"
+msgid "Image"
+msgstr "图åƒ"
+
msgid "Fullsize"
msgstr "完整大å°"
msgid "Use Filter"
msgstr "使用过滤"
+msgid "Icon"
+msgstr "图标"
+
msgid "Buffering"
msgstr "缓冲"
msgid "Agile Event Flushing"
msgstr "æ•æ·äº‹ä»¶å¤„ç†"
-msgid "Pointing"
-msgstr "指点"
-
msgid "Emulate Touch From Mouse"
msgstr "用鼠标模拟触摸"
msgid "Emulate Mouse From Touch"
msgstr "用触摸模拟鼠标"
+msgid "Text Driver"
+msgstr "文本驱动"
+
msgid "Mouse Cursor"
msgstr "鼠标光标"
@@ -1624,6 +2341,9 @@ msgstr "自定义图åƒçƒ­åŒº"
msgid "Tooltip Position Offset"
msgstr "工具æ示ä½ç½®å移"
+msgid "Dotnet"
+msgstr ".NET"
+
msgid "Project"
msgstr "项目"
@@ -1636,11 +2356,26 @@ msgstr "解决方案目录"
msgid "Main Loop Type"
msgstr "主循环类型"
+msgid "Subwindows"
+msgstr "å­çª—å£"
+
+msgid "Embed Subwindows"
+msgstr "嵌入å¼å­çª—å£"
+
+msgid "Stretch"
+msgstr "拉伸"
+
+msgid "Aspect"
+msgstr "比例"
+
msgid "Auto Accept Quit"
msgstr "自动接å—退出"
-msgid "GUI"
-msgstr "GUI"
+msgid "Quit on Go Back"
+msgstr "返回时退出"
+
+msgid "Snap Controls to Pixels"
+msgstr "控件åƒç´ å¸é™„"
msgid "Fonts"
msgstr "字体"
@@ -1651,6 +2386,15 @@ msgstr "动æ€å­—体"
msgid "Use Oversampling"
msgstr "使用过采样"
+msgid "Textures"
+msgstr "纹ç†"
+
+msgid "Default Texture Filter"
+msgstr "默认纹ç†è¿‡æ»¤å™¨"
+
+msgid "Default Texture Repeat"
+msgstr "默认纹ç†é‡å¤"
+
msgid "Operation"
msgstr "æ“作"
@@ -1672,6 +2416,9 @@ msgstr "碰撞层"
msgid "Collision Mask"
msgstr "碰撞é®ç½©"
+msgid "Collision Priority"
+msgstr "碰撞优先级"
+
msgid "Flip Faces"
msgstr "翻转表é¢"
@@ -1753,9 +2500,21 @@ msgstr "GDScript"
msgid "Function Definition Color"
msgstr "函数定义颜色"
+msgid "Global Function Color"
+msgstr "全局函数颜色"
+
msgid "Node Path Color"
msgstr "节点路径颜色"
+msgid "Node Reference Color"
+msgstr "节点引用颜色"
+
+msgid "Annotation Color"
+msgstr "注解颜色"
+
+msgid "String Name Color"
+msgstr "StringName 颜色"
+
msgid "Exclude Addons"
msgstr "排除æ’件"
@@ -1765,6 +2524,9 @@ msgstr "语言æœåŠ¡å™¨"
msgid "Enable Smart Resolve"
msgstr "å¯ç”¨æ™ºèƒ½è§£æž"
+msgid "Show Native Symbols in Editor"
+msgstr "编辑器中显示原生符å·"
+
msgid "Use Thread"
msgstr "使用线程"
@@ -1774,6 +2536,9 @@ msgstr "颜色"
msgid "Intensity"
msgstr "强度"
+msgid "Light Type"
+msgstr "å…‰æºç±»åž‹"
+
msgid "Range"
msgstr "范围"
@@ -1834,8 +2599,8 @@ msgstr "基础路径"
msgid "Root Nodes"
msgstr "根节点"
-msgid "Textures"
-msgstr "纹ç†"
+msgid "Texture Samplers"
+msgstr "纹ç†é‡‡æ ·å™¨"
msgid "Images"
msgstr "图åƒ"
@@ -1855,12 +2620,24 @@ msgstr "唯一动画å称"
msgid "Skeletons"
msgstr "骨架"
+msgid "Create Animations"
+msgstr "创建动画"
+
msgid "Animations"
msgstr "动画"
+msgid "Blender"
+msgstr "Blender"
+
+msgid "Blender 3 Path"
+msgstr "Blender 3 路径"
+
msgid "FBX"
msgstr "FBX"
+msgid "FBX2glTF Path"
+msgstr "FBX2glTF 路径"
+
msgid "Buffer View"
msgstr "缓冲视图"
@@ -1970,7 +2747,13 @@ msgid "Src Image"
msgstr "æ¥æºå›¾åƒ"
msgid "Sampler"
-msgstr "采样 Sampler"
+msgstr "采样器"
+
+msgid "Mag Filter"
+msgstr "放大过滤器"
+
+msgid "Min Filter"
+msgstr "缩å°è¿‡æ»¤å™¨"
msgid "Palette Min Width"
msgstr "调色æ¿æœ€å°å®½åº¦"
@@ -2017,6 +2800,9 @@ msgstr "烘焙导航"
msgid "Lightmapping"
msgstr "光照贴图"
+msgid "Bake Quality"
+msgstr "烘焙质é‡"
+
msgid "Low Quality Ray Count"
msgstr "低等质é‡å°„线数"
@@ -2029,6 +2815,45 @@ msgstr "高等质é‡å°„线数"
msgid "Ultra Quality Ray Count"
msgstr "超级质é‡å°„线数"
+msgid "Bake Performance"
+msgstr "烘焙性能"
+
+msgid "Max Rays per Pass"
+msgstr "æ¯ä¸ªé€šé“的最大射线数"
+
+msgid "Region Size"
+msgstr "区å—大å°"
+
+msgid "Low Quality Probe Ray Count"
+msgstr "低等质é‡æŽ¢é’ˆå°„线计数"
+
+msgid "Medium Quality Probe Ray Count"
+msgstr "中等质é‡æŽ¢é’ˆå°„线计数"
+
+msgid "High Quality Probe Ray Count"
+msgstr "高等质é‡æŽ¢é’ˆå°„线计数"
+
+msgid "Ultra Quality Probe Ray Count"
+msgstr "超高质é‡æŽ¢é’ˆå°„线计数"
+
+msgid "Max Rays per Probe Pass"
+msgstr "探针æ¯ä¸ªé˜¶æ®µçš„最大射线数"
+
+msgid "Primitive Meshes"
+msgstr "基本网格"
+
+msgid "Texel Size"
+msgstr "纹素大å°"
+
+msgid "BPM"
+msgstr "BPM"
+
+msgid "Beat Count"
+msgstr "节æ‹è®¡æ•°"
+
+msgid "Bar Beats"
+msgstr "节æ‹"
+
msgid "Loop Offset"
msgstr "循环å移"
@@ -2050,6 +2875,33 @@ msgstr "K1"
msgid "K2"
msgstr "K2"
+msgid "Spawnable Scenes"
+msgstr "å¯å‡ºç”Ÿåœºæ™¯"
+
+msgid "Spawn Path"
+msgstr "出生路径"
+
+msgid "Spawn Limit"
+msgstr "出生é™åˆ¶"
+
+msgid "Root Path"
+msgstr "根路径"
+
+msgid "Replication Interval"
+msgstr "å¤åˆ¶é—´éš”"
+
+msgid "Visibility Update Mode"
+msgstr "å¯è§æ€§æ›´æ–°æ¨¡å¼"
+
+msgid "Public Visibility"
+msgstr "公共å¯è§æ€§"
+
+msgid "Auth Callback"
+msgstr "认è¯å›žè°ƒ"
+
+msgid "Auth Timeout"
+msgstr "认è¯è¶…æ—¶"
+
msgid "Allow Object Decoding"
msgstr "å…许解ç å¯¹è±¡"
@@ -2059,18 +2911,39 @@ msgstr "æ‹’ç»æ–°è¿žæŽ¥"
msgid "Server Relay"
msgstr "æœåŠ¡å™¨æŽ¥åŠ›"
+msgid "Noise Type"
+msgstr "噪声类型"
+
+msgid "Frequency"
+msgstr "频率"
+
+msgid "Fractal"
+msgstr "分形"
+
msgid "Octaves"
msgstr "å€é¢‘"
msgid "Lacunarity"
-msgstr "缺项性"
+msgstr "空隙度"
msgid "Gain"
msgstr "增益"
+msgid "Ping Pong Strength"
+msgstr "乒乓强度"
+
+msgid "Distance Function"
+msgstr "è·ç¦»å‡½æ•°"
+
+msgid "Jitter"
+msgstr "抖动"
+
msgid "Return Type"
msgstr "返回类型"
+msgid "Fractal Type"
+msgstr "分形类型"
+
msgid "Width"
msgstr "宽度"
@@ -2092,6 +2965,15 @@ msgstr "颜色映射"
msgid "Noise"
msgstr "噪声"
+msgid "Localized Name"
+msgstr "本地化å称"
+
+msgid "Action Type"
+msgstr "动作类型"
+
+msgid "Interaction Profile Path"
+msgstr "交互é…置路径"
+
msgid "Subject"
msgstr "对象"
@@ -2131,15 +3013,30 @@ msgstr "IGD 状æ€"
msgid "Write Mode"
msgstr "写模å¼"
-msgid "Limits"
-msgstr "é™åˆ¶"
-
msgid "WebRTC"
msgstr "WebRTC"
+msgid "Max Channel in Buffer (KB)"
+msgstr "通é“最大缓冲区大å°ï¼ˆKB)"
+
+msgid "Supported Protocols"
+msgstr "支æŒçš„åè®®"
+
+msgid "Handshake Headers"
+msgstr "æ¡æ‰‹æ ‡å¤´"
+
+msgid "Inbound Buffer Size"
+msgstr "入站缓冲区大å°"
+
+msgid "Outbound Buffer Size"
+msgstr "出站缓冲区大å°"
+
msgid "Handshake Timeout"
msgstr "æ¡æ‰‹è¶…æ—¶"
+msgid "Max Queued Packets"
+msgstr "最大排队数æ®åŒ…æ•°"
+
msgid "Session Mode"
msgstr "会è¯æ¨¡å¼"
@@ -2176,6 +3073,12 @@ msgstr "调试密钥库密ç "
msgid "Force System User"
msgstr "强制系统用户"
+msgid "Shutdown ADB on Exit"
+msgstr "退出时关闭 ADB"
+
+msgid "One Click Deploy Clear Previous Install"
+msgstr "一键部署并清除先å‰å®‰è£…"
+
msgid "Launcher Icons"
msgstr "å¯åŠ¨å™¨å›¾æ ‡"
@@ -2188,12 +3091,6 @@ msgstr "自适应å‰æ™¯ 432×432"
msgid "Adaptive Background 432 X 432"
msgstr "自适应背景 432×432"
-msgid "Custom Build"
-msgstr "自定义构建"
-
-msgid "Use Custom Build"
-msgstr "使用自定义构建"
-
msgid "Export Format"
msgstr "导出格å¼"
@@ -2242,6 +3139,9 @@ msgstr "ç­¾å"
msgid "App Category"
msgstr "App 分类"
+msgid "Retain Data on Uninstall"
+msgstr "å¸è½½æ—¶ä¿ç•™æ•°æ®"
+
msgid "Exclude From Recents"
msgstr "从最近列表中排除"
@@ -2335,6 +3235,18 @@ msgstr "Spotlight 40×40"
msgid "Spotlight 80 X 80"
msgstr "Spotlight 80×80"
+msgid "Settings 58 X 58"
+msgstr "设置 58 X 58"
+
+msgid "Settings 87 X 87"
+msgstr "设置 87 X 87"
+
+msgid "Notification 40 X 40"
+msgstr "通知 40 X 40"
+
+msgid "Notification 60 X 60"
+msgstr "通知 60 X 60"
+
msgid "Landscape Launch Screens"
msgstr "横å±å¯åŠ¨ç”»é¢"
@@ -2398,12 +3310,21 @@ msgstr "å‘布导出方法"
msgid "Targeted Device Family"
msgstr "目标设备æ—"
+msgid "Bundle Identifier"
+msgstr "æ†ç»‘包标识符"
+
msgid "Signature"
msgstr "ç­¾å"
msgid "Short Version"
msgstr "短版本"
+msgid "Icon Interpolation"
+msgstr "图标æ’值"
+
+msgid "Launch Screens Interpolation"
+msgstr "å¯åŠ¨å±å¹•æ’值"
+
msgid "Capabilities"
msgstr "能力"
@@ -2428,12 +3349,21 @@ msgstr "éšç§"
msgid "Camera Usage Description"
msgstr "相机使用æè¿°"
+msgid "Camera Usage Description Localized"
+msgstr "相机使用æ述本地化"
+
msgid "Microphone Usage Description"
msgstr "麦克风使用æè¿°"
+msgid "Microphone Usage Description Localized"
+msgstr "麦克风使用æ述本地化"
+
msgid "Photolibrary Usage Description"
msgstr "照片图库使用æè¿°"
+msgid "Photolibrary Usage Description Localized"
+msgstr "照片图库使用æ述本地化"
+
msgid "Storyboard"
msgstr "Storyboard"
@@ -2458,15 +3388,33 @@ msgstr "自定义背景色"
msgid "Architecture"
msgstr "架构"
+msgid "SSH Remote Deploy"
+msgstr "SSH 远程部署"
+
+msgid "Extra Args SSH"
+msgstr "é¢å¤– SSH å‚æ•°"
+
+msgid "Extra Args SCP"
+msgstr "é¢å¤– SCP å‚æ•°"
+
+msgid "Run Script"
+msgstr "è¿è¡Œè„šæœ¬"
+
+msgid "Cleanup Script"
+msgstr "清ç†è„šæœ¬"
+
msgid "macOS"
msgstr "macOS"
-msgid "Icon"
-msgstr "图标"
+msgid "rcodesign"
+msgstr "rcodesign"
msgid "Copyright"
msgstr "版æƒ"
+msgid "Copyright Localized"
+msgstr "版æƒæœ¬åœ°åŒ–"
+
msgid "High Res"
msgstr "高分辨率"
@@ -2476,6 +3424,12 @@ msgstr "代ç ç­¾å"
msgid "Identity"
msgstr "身份"
+msgid "Certificate File"
+msgstr "è¯ä¹¦æ–‡ä»¶"
+
+msgid "Certificate Password"
+msgstr "è¯ä¹¦å¯†ç "
+
msgid "Entitlements"
msgstr "授æƒ"
@@ -2542,6 +3496,9 @@ msgstr "文件音ä¹"
msgid "Files Movies"
msgstr "文件影片"
+msgid "Helper Executables"
+msgstr "帮助程åº"
+
msgid "Custom Options"
msgstr "自定义选项"
@@ -2557,36 +3514,75 @@ msgstr "Apple ID 密ç "
msgid "Apple Team ID"
msgstr "Apple 团队 ID"
+msgid "API UUID"
+msgstr "API UUID"
+
+msgid "API Key"
+msgstr "API 密钥"
+
+msgid "API Key ID"
+msgstr "API 密钥 ID"
+
msgid "Location Usage Description"
msgstr "ä½ç½®ä½¿ç”¨æè¿°"
+msgid "Location Usage Description Localized"
+msgstr "ä½ç½®ä½¿ç”¨æ述本地化"
+
msgid "Address Book Usage Description"
msgstr "地å€ç°¿ä½¿ç”¨æè¿°"
+msgid "Address Book Usage Description Localized"
+msgstr "地å€ç°¿ä½¿ç”¨æ述本地化"
+
msgid "Calendar Usage Description"
msgstr "日历使用æè¿°"
+msgid "Calendar Usage Description Localized"
+msgstr "日历使用æ述本地化"
+
msgid "Photos Library Usage Description"
msgstr "照片图库使用æè¿°"
+msgid "Photos Library Usage Description Localized"
+msgstr "照片图库使用æ述本地化"
+
msgid "Desktop Folder Usage Description"
msgstr "æ¡Œé¢æ–‡ä»¶å¤¹ä½¿ç”¨æè¿°"
+msgid "Desktop Folder Usage Description Localized"
+msgstr "æ¡Œé¢æ–‡ä»¶å¤¹ä½¿ç”¨æ述本地化"
+
msgid "Documents Folder Usage Description"
msgstr "文档文件夹使用æè¿°"
+msgid "Documents Folder Usage Description Localized"
+msgstr "文档文件夹使用æ述本地化"
+
msgid "Downloads Folder Usage Description"
msgstr "下载文件夹使用æè¿°"
+msgid "Downloads Folder Usage Description Localized"
+msgstr "下载文件夹使用æ述本地化"
+
msgid "Network Volumes Usage Description"
msgstr "网络å·ä½¿ç”¨æè¿°"
+msgid "Network Volumes Usage Description Localized"
+msgstr "网络å·ä½¿ç”¨æ述本地化"
+
msgid "Removable Volumes Usage Description"
-msgstr "å¯ç§»åŠ¨å·ä½¿ç”¨æè¿°"
+msgstr "å¯ç§»é™¤å·ä½¿ç”¨æè¿°"
+
+msgid "Removable Volumes Usage Description Localized"
+msgstr "å¯ç§»é™¤å·ä½¿ç”¨æ述本地化"
msgid "UWP"
msgstr "UWP"
+msgid "signtool"
+msgstr "signtool"
+
msgid "Debug Certificate"
msgstr "调试è¯ä¹¦"
@@ -2599,9 +3595,6 @@ msgstr "显示å称"
msgid "Short Name"
msgstr "短å称"
-msgid "Description"
-msgstr "æè¿°"
-
msgid "Publisher"
msgstr "å‘行商"
@@ -2669,7 +3662,16 @@ msgid "Splash Screen"
msgstr "å¯åŠ¨å±å¹•"
msgid "Tiles"
-msgstr "ç£è´´"
+msgstr "图å—"
+
+msgid "Show Name on Square 150 X 150"
+msgstr "在正方形 150×150 上显示å称"
+
+msgid "Show Name on Wide 310 X 150"
+msgstr "在长方形 310×150 上显示å称"
+
+msgid "Show Name on Square 310 X 310"
+msgstr "在正方形 310×310 上显示å称"
msgid "Web"
msgstr "Web"
@@ -2680,9 +3682,21 @@ msgstr "HTTP 主机"
msgid "HTTP Port"
msgstr "HTTP 端å£"
+msgid "Use TLS"
+msgstr "使用 TLS"
+
+msgid "TLS Key"
+msgstr "TLS 密钥"
+
+msgid "TLS Certificate"
+msgstr "TLS è¯ä¹¦"
+
msgid "Variant"
msgstr "å˜ä½“"
+msgid "Extensions Support"
+msgstr "扩展支æŒ"
+
msgid "VRAM Texture Compression"
msgstr "VRAM 纹ç†åŽ‹ç¼©"
@@ -2707,6 +3721,9 @@ msgstr "头部包å«"
msgid "Canvas Resize Policy"
msgstr "画布大å°æ”¹å˜ç­–ç•¥"
+msgid "Focus Canvas on Start"
+msgstr "å¯åŠ¨æ—¶èšç„¦ç”»å¸ƒ"
+
msgid "Experimental Virtual Keyboard"
msgstr "实验性虚拟键盘"
@@ -2728,6 +3745,15 @@ msgstr "图标 512×512"
msgid "Windows"
msgstr "Windows"
+msgid "rcedit"
+msgstr "rcedit"
+
+msgid "osslsigncode"
+msgstr "osslsigncode"
+
+msgid "wine"
+msgstr "wine"
+
msgid "Identity Type"
msgstr "身份类型"
@@ -2743,6 +3769,9 @@ msgstr "摘è¦ç®—法"
msgid "Modify Resources"
msgstr "修改资æº"
+msgid "Console Wrapper Icon"
+msgstr "控制å°å°è£…图标"
+
msgid "File Version"
msgstr "文件版本"
@@ -2761,18 +3790,12 @@ msgstr "文件æè¿°"
msgid "Trademarks"
msgstr "商标"
-msgid "Frames"
-msgstr "帧"
-
msgid "Frame"
msgstr "帧å·"
msgid "Speed Scale"
msgstr "速度缩放"
-msgid "Playing"
-msgstr "正在播放"
-
msgid "Centered"
msgstr "居中"
@@ -2797,6 +3820,9 @@ msgstr "空间覆盖"
msgid "Point"
msgstr "点"
+msgid "Point Center"
+msgstr "点中心"
+
msgid "Direction"
msgstr "æ–¹å‘"
@@ -2818,6 +3844,9 @@ msgstr "音é‡åˆ†è´"
msgid "Pitch Scale"
msgstr "音高缩放"
+msgid "Playing"
+msgstr "正在播放"
+
msgid "Autoplay"
msgstr "自动播放"
@@ -2830,6 +3859,12 @@ msgstr "最大è·ç¦»"
msgid "Attenuation"
msgstr "è¡°å‡"
+msgid "Max Polyphony"
+msgstr "最大å¤éŸ³æ•°"
+
+msgid "Panning Strength"
+msgstr "平移强度"
+
msgid "Bus"
msgstr "总线"
@@ -2842,17 +3877,23 @@ msgstr "å¤åˆ¶æ¨¡å¼"
msgid "Anchor Mode"
msgstr "锚点模å¼"
+msgid "Ignore Rotation"
+msgstr "忽略旋转"
+
msgid "Custom Viewport"
msgstr "自定义视å£"
+msgid "Process Callback"
+msgstr "处ç†å›žè°ƒ"
+
msgid "Left"
-msgstr "左侧"
+msgstr "å·¦"
msgid "Top"
msgstr "顶部"
msgid "Right"
-msgstr "å³ä¾§"
+msgstr "å³"
msgid "Bottom"
msgstr "底部"
@@ -2860,18 +3901,48 @@ msgstr "底部"
msgid "Smoothed"
msgstr "平滑"
+msgid "Follow Smoothing"
+msgstr "è·Ÿéšå¹³æ»‘"
+
+msgid "Position Smoothing Enabled"
+msgstr "å¯ç”¨ä½ç½®å¹³æ»‘"
+
+msgid "Position Smoothing Speed"
+msgstr "ä½ç½®å¹³æ»‘速度"
+
+msgid "Rotation Smoothing"
+msgstr "旋转平滑"
+
msgid "Speed"
msgstr "速度"
+msgid "Drag"
+msgstr "拖动"
+
msgid "Horizontal Enabled"
msgstr "å¯ç”¨æ°´å¹³"
msgid "Vertical Enabled"
msgstr "å¯ç”¨åž‚ç›´"
+msgid "Horizontal Offset"
+msgstr "æ°´å¹³å移"
+
+msgid "Vertical Offset"
+msgstr "åž‚ç›´å移"
+
+msgid "Left Margin"
+msgstr "左边è·"
+
msgid "Top Margin"
msgstr "顶边è·"
+msgid "Right Margin"
+msgstr "å³è¾¹è·"
+
+msgid "Bottom Margin"
+msgstr "底边è·"
+
msgid "Draw Screen"
msgstr "绘制å±å¹•"
@@ -2884,9 +3955,18 @@ msgstr "绘制拖拽边è·"
msgid "Tweaks"
msgstr "调整"
+msgid "Fit Margin"
+msgstr "适åˆè¾¹è·"
+
+msgid "Clear Margin"
+msgstr "清除边è·"
+
msgid "Use Mipmaps"
msgstr "使用 Mipmap"
+msgid "Disable Mode"
+msgstr "ç¦ç”¨æ¨¡å¼"
+
msgid "Input"
msgstr "输入"
@@ -2905,6 +3985,9 @@ msgstr "å•å‘碰撞"
msgid "One Way Collision Margin"
msgstr "å•å‘碰撞边è·"
+msgid "Debug Color"
+msgstr "调试颜色"
+
msgid "Emitting"
msgstr "å‘å°„"
@@ -2965,6 +4048,9 @@ msgstr "法线"
msgid "Colors"
msgstr "颜色"
+msgid "Particle Flags"
+msgstr "ç²’å­æ ‡å¿—"
+
msgid "Align Y"
msgstr "å¯¹é½ Y"
@@ -2974,6 +4060,12 @@ msgstr "å‘æ•£"
msgid "Initial Velocity"
msgstr "åˆé€Ÿåº¦"
+msgid "Velocity Min"
+msgstr "最å°é€Ÿåº¦"
+
+msgid "Velocity Max"
+msgstr "最大速度"
+
msgid "Angular Velocity"
msgstr "角速度"
@@ -2986,6 +4078,12 @@ msgstr "环绕速度"
msgid "Linear Accel"
msgstr "线性加速度"
+msgid "Accel Min"
+msgstr "最å°åŠ é€Ÿåº¦"
+
+msgid "Accel Max"
+msgstr "最大加速度"
+
msgid "Accel Curve"
msgstr "加速度曲线"
@@ -2998,6 +4096,12 @@ msgstr "切å‘加速度"
msgid "Damping"
msgstr "阻尼"
+msgid "Damping Min"
+msgstr "最å°é˜»å°¼"
+
+msgid "Damping Max"
+msgstr "最大阻尼"
+
msgid "Damping Curve"
msgstr "阻尼曲线"
@@ -3013,30 +4117,75 @@ msgstr "最大角度"
msgid "Angle Curve"
msgstr "角度曲线"
+msgid "Scale Amount Min"
+msgstr "最å°ç¼©æ”¾é‡"
+
+msgid "Scale Amount Max"
+msgstr "最大缩放é‡"
+
msgid "Scale Amount Curve"
msgstr "缩放é‡æ›²çº¿"
+msgid "Split Scale"
+msgstr "拆分缩放"
+
+msgid "Scale Curve X"
+msgstr "缩放曲线 X"
+
+msgid "Scale Curve Y"
+msgstr "缩放曲线 Y"
+
msgid "Color Initial Ramp"
msgstr "颜色åˆå§‹æ˜ å°„"
msgid "Hue Variation"
msgstr "色相å˜åŒ–"
+msgid "Variation Min"
+msgstr "最å°å˜åŒ–"
+
+msgid "Variation Max"
+msgstr "最大å˜åŒ–"
+
msgid "Variation Curve"
msgstr "å˜åŒ–曲线"
+msgid "Speed Min"
+msgstr "最å°é€Ÿåº¦"
+
+msgid "Speed Max"
+msgstr "最大速度"
+
msgid "Speed Curve"
msgstr "速度曲线"
+msgid "Offset Min"
+msgstr "最å°å移"
+
+msgid "Offset Max"
+msgstr "最大å移"
+
msgid "Offset Curve"
msgstr "å移曲线"
+msgid "Sub Emitter"
+msgstr "å­å‘射器"
+
msgid "Process Material"
msgstr "处ç†æè´¨"
+msgid "Interpolate"
+msgstr "æ’值"
+
+msgid "Base Size"
+msgstr "基本大å°"
+
msgid "Visibility Rect"
msgstr "å¯è§çŸ©å½¢"
+msgid "Trails"
+msgstr "尾迹"
+
msgid "Node A"
msgstr "节点 A"
@@ -3103,6 +4252,12 @@ msgstr "关闭"
msgid "Cull Mode"
msgstr "剔除模å¼"
+msgid "SDF Collision"
+msgstr "SDF 碰撞"
+
+msgid "Occluder Light Mask"
+msgstr "é®æŒ¡å™¨å…‰ç…§æŽ©ç "
+
msgid "Width Curve"
msgstr "宽度曲线"
@@ -3163,6 +4318,9 @@ msgstr "路径最大è·ç¦»"
msgid "Navigation Layers"
msgstr "导航层"
+msgid "Path Metadata Flags"
+msgstr "路径元数æ®æ ‡å¿—"
+
msgid "Avoidance"
msgstr "é¿éšœ"
@@ -3178,6 +4336,12 @@ msgstr "时间下é™"
msgid "Max Speed"
msgstr "最大速度"
+msgid "Bidirectional"
+msgstr "åŒå‘çš„"
+
+msgid "Start Position"
+msgstr "开始ä½ç½®"
+
msgid "Enter Cost"
msgstr "进入消耗"
@@ -3187,8 +4351,8 @@ msgstr "移动消耗"
msgid "Estimate Radius"
msgstr "ä¼°ç®—åŠå¾„"
-msgid "Transform"
-msgstr "å˜æ¢"
+msgid "Navigation Polygon"
+msgstr "导航多边形"
msgid "Rotation Degrees"
msgstr "旋转角度"
@@ -3205,6 +4369,9 @@ msgstr "全局旋转角度"
msgid "Global Scale"
msgstr "全局缩放"
+msgid "Global Skew"
+msgstr "全局倾斜"
+
msgid "Global Transform"
msgstr "全局å˜æ¢"
@@ -3238,18 +4405,39 @@ msgstr "曲线"
msgid "Progress"
msgstr "进度"
+msgid "Progress Ratio"
+msgstr "进度比率"
+
msgid "H Offset"
msgstr "æ°´å¹³å移"
msgid "V Offset"
msgstr "åž‚ç›´å移"
+msgid "Rotates"
+msgstr "旋转"
+
msgid "Cubic Interp"
msgstr "三次æ’值"
msgid "Lookahead"
msgstr "æå‰é‡"
+msgid "Bone 2D Nodepath"
+msgstr "骨骼 2D 节点路径"
+
+msgid "Bone 2D Index"
+msgstr "骨骼 2D 索引"
+
+msgid "Auto Configure Joint"
+msgstr "自动é…置关节"
+
+msgid "Simulate Physics"
+msgstr "模拟物ç†"
+
+msgid "Follow Bone When Simulating"
+msgstr "模拟时跟éšéª¨éª¼"
+
msgid "Physics Material Override"
msgstr "物ç†æ质覆盖"
@@ -3259,12 +4447,21 @@ msgstr "常线速度"
msgid "Constant Angular Velocity"
msgstr "常角速度"
+msgid "Sync to Physics"
+msgstr "åŒæ­¥åˆ°ç‰©ç†"
+
msgid "Mass"
msgstr "è´¨é‡"
msgid "Inertia"
msgstr "惯性"
+msgid "Center of Mass Mode"
+msgstr "质心模å¼"
+
+msgid "Center of Mass"
+msgstr "质心"
+
msgid "Gravity Scale"
msgstr "é‡åŠ›ç¼©æ”¾"
@@ -3274,6 +4471,9 @@ msgstr "自定义集æˆå™¨"
msgid "Continuous CD"
msgstr "连续碰撞检测"
+msgid "Max Contacts Reported"
+msgstr "报告的最大接触"
+
msgid "Contact Monitor"
msgstr "接触监视器"
@@ -3283,24 +4483,75 @@ msgstr "ç¡çœ "
msgid "Can Sleep"
msgstr "å¯ä»¥ç¡çœ "
+msgid "Lock Rotation"
+msgstr "é”定旋转"
+
+msgid "Freeze"
+msgstr "冻结"
+
+msgid "Freeze Mode"
+msgstr "冻结模å¼"
+
msgid "Linear"
msgstr "线性"
+msgid "Damp Mode"
+msgstr "阻尼模å¼"
+
msgid "Damp"
msgstr "阻尼"
msgid "Angular"
msgstr "角"
+msgid "Constant Forces"
+msgstr "æ’力"
+
msgid "Torque"
msgstr "力矩"
+msgid "Motion Mode"
+msgstr "è¿åŠ¨æ¨¡å¼"
+
+msgid "Up Direction"
+msgstr "å‘上方å‘"
+
+msgid "Slide on Ceiling"
+msgstr "在天花æ¿ä¸Šæ»‘动"
+
+msgid "Wall Min Slide Angle"
+msgstr "墙体最å°æ»‘动角度"
+
+msgid "Floor"
+msgstr "地é¢"
+
+msgid "Stop on Slope"
+msgstr "在斜å¡ä¸Šåœæ­¢"
+
+msgid "Constant Speed"
+msgstr "æ’定速度"
+
+msgid "Block on Wall"
+msgstr "阻止上墙"
+
msgid "Max Angle"
msgstr "最大角"
+msgid "Snap Length"
+msgstr "å¸é™„长度"
+
msgid "Moving Platform"
msgstr "å¯ç§»åŠ¨å¹³å°"
+msgid "On Leave"
+msgstr "离开时"
+
+msgid "Floor Layers"
+msgstr "地é¢å±‚"
+
+msgid "Wall Layers"
+msgstr "墙体层"
+
msgid "Safe Margin"
msgstr "安全边è·"
@@ -3319,6 +4570,9 @@ msgstr "内部顶点数"
msgid "Exclude Parent"
msgstr "排除父节点"
+msgid "Target Position"
+msgstr "目标ä½ç½®"
+
msgid "Collide With"
msgstr "å‚与碰撞"
@@ -3340,12 +4594,27 @@ msgstr "æ›´æ–°"
msgid "Margin"
msgstr "è¾¹è·"
+msgid "Max Results"
+msgstr "最大结果"
+
+msgid "Auto Calculate Length and Angle"
+msgstr "自动计算长度和角度"
+
+msgid "Bone Angle"
+msgstr "骨骼角度"
+
msgid "Editor Settings"
msgstr "编辑器设置"
+msgid "Show Bone Gizmo"
+msgstr "显示骨骼å°å·¥å…·"
+
msgid "Rest"
msgstr "放æ¾"
+msgid "Modification Stack"
+msgstr "修改堆栈"
+
msgid "Hframes"
msgstr "水平帧数"
@@ -3358,12 +4627,33 @@ msgstr "帧åæ ‡"
msgid "Region"
msgstr "区域"
+msgid "Filter Clip Enabled"
+msgstr "å¯ç”¨è¿‡æ»¤è£å‰ª"
+
msgid "Tile Set"
msgstr "图å—集"
+msgid "Cell Quadrant Size"
+msgstr "å•å…ƒæ ¼è±¡é™å¤§å°"
+
+msgid "Collision Animatable"
+msgstr "碰撞å¯åŠ¨ç”»åŒ–"
+
+msgid "Collision Visibility Mode"
+msgstr "碰撞å¯è§æ€§æ¨¡å¼"
+
+msgid "Navigation Visibility Mode"
+msgstr "导航å¯è§æ€§æ¨¡å¼"
+
msgid "Layers"
msgstr "层"
+msgid "Texture Normal"
+msgstr "法线纹ç†"
+
+msgid "Texture Pressed"
+msgstr "按下纹ç†"
+
msgid "Bitmask"
msgstr "掩ç "
@@ -3382,6 +4672,18 @@ msgstr "å¯è§æ¨¡å¼"
msgid "Node Path"
msgstr "节点路径"
+msgid "Wind"
+msgstr "风"
+
+msgid "Force Magnitude"
+msgstr "力é‡å¤§å°"
+
+msgid "Attenuation Factor"
+msgstr "è¡°å‡ç³»æ•°"
+
+msgid "Source Path"
+msgstr "æ¥æºè·¯å¾„"
+
msgid "Reverb Bus"
msgstr "æ··å“总线"
@@ -3424,12 +4726,21 @@ msgstr "跟踪"
msgid "Bone Name"
msgstr "骨骼å称"
+msgid "Bone Idx"
+msgstr "骨骼索引"
+
+msgid "Override Pose"
+msgstr "覆盖姿势"
+
msgid "Keep Aspect"
msgstr "ä¿æŒé•¿å®½æ¯”"
msgid "Cull Mask"
msgstr "剔除é®ç½©"
+msgid "Attributes"
+msgstr "属性"
+
msgid "Doppler Tracking"
msgstr "多普勒跟踪"
@@ -3448,6 +4759,9 @@ msgstr "Far"
msgid "Ray Pickable"
msgstr "射线å¯æ‹¾å–"
+msgid "Capture on Drag"
+msgstr "拖拽时æ•èŽ·"
+
msgid "Box Extents"
msgstr "ç›’å­èŒƒå›´"
@@ -3472,14 +4786,17 @@ msgstr "ç¦ç”¨ Z"
msgid "Flatness"
msgstr "æ‰å¹³åº¦"
-msgid "Extents"
-msgstr "范围"
+msgid "Scale Curve Z"
+msgstr "缩放曲线 Z"
msgid "Albedo"
msgstr "å照率"
msgid "Normal"
-msgstr "正常"
+msgstr "法线"
+
+msgid "Orm"
+msgstr "Orm"
msgid "Emission"
msgstr "自å‘å…‰"
@@ -3487,15 +4804,33 @@ msgstr "自å‘å…‰"
msgid "Parameters"
msgstr "å‚æ•°"
+msgid "Emission Energy"
+msgstr "自å‘光能é‡"
+
msgid "Modulate"
msgstr "调制"
+msgid "Albedo Mix"
+msgstr "å照率混åˆ"
+
+msgid "Normal Fade"
+msgstr "法线淡化"
+
+msgid "Vertical Fade"
+msgstr "垂直淡化"
+
msgid "Distance Fade"
msgstr "è·ç¦»æ·¡å‡º"
+msgid "Begin"
+msgstr "起点"
+
msgid "Visibility AABB"
msgstr "å¯è§æ€§ AABB"
+msgid "Transform Align"
+msgstr "å˜æ¢å¯¹é½"
+
msgid "Draw Passes"
msgstr "绘制阶段"
@@ -3505,9 +4840,24 @@ msgstr "阶段"
msgid "Thickness"
msgstr "粗细"
+msgid "Bake Mask"
+msgstr "烘焙é®ç½©"
+
msgid "Update Mode"
msgstr "更新模å¼"
+msgid "Follow Camera Enabled"
+msgstr "å¯ç”¨è·Ÿéšç›¸æœº"
+
+msgid "Directionality"
+msgstr "æ–¹å‘性"
+
+msgid "Skeleton Path"
+msgstr "骨架路径"
+
+msgid "Solver Priority"
+msgstr "求解器优先级"
+
msgid "Params"
msgstr "å‚æ•°"
@@ -3580,15 +4930,27 @@ msgstr "Y"
msgid "Z"
msgstr "Z"
+msgid "Linear Motor"
+msgstr "线性马达"
+
msgid "Force Limit"
msgstr "力度é™åˆ¶"
+msgid "Linear Spring"
+msgstr "线性弹簧"
+
msgid "Equilibrium Point"
msgstr "平衡点"
msgid "ERP"
msgstr "ERP"
+msgid "Angular Motor"
+msgstr "角度马达"
+
+msgid "Angular Spring"
+msgstr "角度弹簧"
+
msgid "Pixel Size"
msgstr "åƒç´ å¤§å°"
@@ -3616,6 +4978,15 @@ msgstr "Alpha 切除"
msgid "Alpha Scissor Threshold"
msgstr "Alpha è£å‰ªé˜ˆå€¼"
+msgid "Alpha Antialiasing Mode"
+msgstr "Alpha 抗锯齿模å¼"
+
+msgid "Alpha Antialiasing Edge"
+msgstr "边缘 Alpha 抗锯齿"
+
+msgid "Texture Filter"
+msgstr "纹ç†è¿‡æ»¤å™¨"
+
msgid "Render Priority"
msgstr "渲染优先级"
@@ -3640,9 +5011,42 @@ msgstr "垂直对é½"
msgid "Uppercase"
msgstr "大写"
+msgid "Autowrap Mode"
+msgstr "自动æ¢è¡Œæ¨¡å¼"
+
+msgid "BiDi"
+msgstr "BiDi"
+
+msgid "Text Direction"
+msgstr "文本方å‘"
+
+msgid "Structured Text BiDi Override"
+msgstr "结构化文本 BiDi 覆盖"
+
+msgid "Structured Text BiDi Override Options"
+msgstr "结构化文本 BiDi 覆盖选项"
+
+msgid "Intensity Lumens"
+msgstr "强度æµæ˜Ž"
+
+msgid "Intensity Lux"
+msgstr "强度勒克斯"
+
+msgid "Temperature"
+msgstr "温度"
+
msgid "Indirect Energy"
msgstr "间接能é‡"
+msgid "Volumetric Fog Energy"
+msgstr "体积雾能é‡"
+
+msgid "Projector"
+msgstr "投影"
+
+msgid "Angular Distance"
+msgstr "角度è·ç¦»"
+
msgid "Negative"
msgstr "逆转"
@@ -3679,6 +5083,15 @@ msgstr "拆分 3"
msgid "Blend Splits"
msgstr "æ··åˆæ‹†åˆ†"
+msgid "Fade Start"
+msgstr "淡化起点"
+
+msgid "Pancake Size"
+msgstr "Pancake 大å°"
+
+msgid "Sky Mode"
+msgstr "天空模å¼"
+
msgid "Omni"
msgstr "å…¨å‘"
@@ -3691,18 +5104,27 @@ msgstr "èšå…‰"
msgid "Angle Attenuation"
msgstr "角度衰å‡"
+msgid "Light Texture"
+msgstr "ç¯å…‰çº¹ç†"
+
msgid "Quality"
msgstr "è´¨é‡"
msgid "Bounces"
msgstr "弹射"
+msgid "Directional"
+msgstr "定å‘"
+
msgid "Interior"
msgstr "内部"
msgid "Use Denoiser"
msgstr "使用é™å™ªå™¨"
+msgid "Max Texture Size"
+msgstr "最大纹ç†å¤§å°"
+
msgid "Custom Sky"
msgstr "自定义天空"
@@ -3712,27 +5134,60 @@ msgstr "自定义颜色"
msgid "Custom Energy"
msgstr "自定义能é‡"
+msgid "Camera Attributes"
+msgstr "相机属性"
+
msgid "Subdiv"
msgstr "细分"
msgid "Light Data"
msgstr "光照数æ®"
+msgid "Surface Material Override"
+msgstr "表é¢æ质覆盖"
+
msgid "Agent Height Offset"
msgstr "代ç†é«˜åº¦å移"
msgid "Ignore Y"
msgstr "忽略 Y"
+msgid "Navigation Mesh"
+msgstr "导航网格"
+
+msgid "Quaternion"
+msgstr "四元数"
+
+msgid "Basis"
+msgstr "基"
+
+msgid "Rotation Edit Mode"
+msgstr "旋转编辑模å¼"
+
+msgid "Rotation Order"
+msgstr "旋转顺åº"
+
+msgid "Top Level"
+msgstr "顶层"
+
msgid "Visibility"
msgstr "å¯è§æ€§"
msgid "Visible"
msgstr "å¯è§"
+msgid "Visibility Parent"
+msgstr "å¯è§æ€§çˆ¶çº§"
+
+msgid "Bake"
+msgstr "烘焙"
+
msgid "Rotation Mode"
msgstr "旋转模å¼"
+msgid "Tilt Enabled"
+msgstr "å¯ç”¨å€¾æ–œ"
+
msgid "Axis Lock"
msgstr "è½´é”定"
@@ -3844,6 +5299,12 @@ msgstr "摩擦"
msgid "Bounce"
msgstr "åå¼¹"
+msgid "Linear Damp Mode"
+msgstr "线性阻尼模å¼"
+
+msgid "Angular Damp Mode"
+msgstr "角度阻尼模å¼"
+
msgid "Linear Velocity"
msgstr "线性速度"
@@ -3859,9 +5320,24 @@ msgstr "盒投影"
msgid "Enable Shadows"
msgstr "å¯ç”¨é˜´å½±"
+msgid "Mesh LOD Threshold"
+msgstr "网格 LOD 阈值"
+
+msgid "Ambient"
+msgstr "环境"
+
+msgid "Color Energy"
+msgstr "色彩能é‡"
+
msgid "Bones"
msgstr "骨骼"
+msgid "Show Rest Only"
+msgstr "仅显示放æ¾"
+
+msgid "Animate Physical Bones"
+msgstr "动画物ç†éª¨éª¼"
+
msgid "Root Bone"
msgstr "根骨骼"
@@ -3940,6 +5416,15 @@ msgstr "刹车"
msgid "Steering"
msgstr "æ–¹å‘控制"
+msgid "VehicleBody3D Motion"
+msgstr "VehicleBody3D è¿åŠ¨"
+
+msgid "Use as Traction"
+msgstr "用作牵引"
+
+msgid "Use as Steering"
+msgstr "用作转å‘"
+
msgid "Wheel"
msgstr "车轮"
@@ -3979,6 +5464,9 @@ msgstr "æ质覆盖"
msgid "Material Overlay"
msgstr "æ质覆盖层"
+msgid "Transparency"
+msgstr "é€æ˜Ž"
+
msgid "Cast Shadow"
msgstr "投射阴影"
@@ -3988,11 +5476,32 @@ msgstr "é¢å¤–剔除边è·"
msgid "Custom AABB"
msgstr "自定义 AABB"
+msgid "LOD Bias"
+msgstr "LOD åå·®"
+
+msgid "Ignore Occlusion Culling"
+msgstr "忽略é®æŒ¡å‰”除"
+
+msgid "Global Illumination"
+msgstr "全局照明"
+
msgid "Lightmap Scale"
msgstr "光照贴图缩放"
+msgid "Visibility Range"
+msgstr "能è§åº¦èŒƒå›´"
+
+msgid "Begin Margin"
+msgstr "起始边è·"
+
msgid "End"
-msgstr "结æŸ"
+msgstr "行尾"
+
+msgid "End Margin"
+msgstr "结æŸè¾¹è·"
+
+msgid "Fade Mode"
+msgstr "淡化模å¼"
msgid "Dynamic Range"
msgstr "动æ€èŒƒå›´"
@@ -4000,12 +5509,21 @@ msgstr "动æ€èŒƒå›´"
msgid "Propagation"
msgstr "ä¼ æ’­"
+msgid "Use Two Bounces"
+msgstr "使用二次åå¼¹"
+
+msgid "Tracker"
+msgstr "追踪器"
+
msgid "Pose"
msgstr "姿势"
msgid "World Scale"
msgstr "世界缩放"
+msgid "Play Mode"
+msgstr "播放模å¼"
+
msgid "Sync"
msgstr "åŒæ­¥"
@@ -4033,8 +5551,11 @@ msgstr "éšæœºå»¶è¿Ÿ"
msgid "Xfade Time"
msgstr "淡入淡出时间"
-msgid "Reset"
-msgstr "é‡ç½®"
+msgid "Xfade Curve"
+msgstr "淡入淡出曲线"
+
+msgid "Request"
+msgstr "请求"
msgid "Active"
msgstr "激活"
@@ -4045,8 +5566,17 @@ msgstr "å åŠ é‡"
msgid "Blend Amount"
msgstr "æ··åˆé‡"
-msgid "Seek Position"
-msgstr "寻é“ä½ç½®"
+msgid "Current Index"
+msgstr "当å‰ç´¢å¼•"
+
+msgid "Current State"
+msgstr "当å‰çŠ¶æ€"
+
+msgid "Transition Request"
+msgstr "过渡请求"
+
+msgid "Reset"
+msgstr "é‡ç½®"
msgid "Switch"
msgstr "切æ¢"
@@ -4054,6 +5584,9 @@ msgstr "切æ¢"
msgid "Switch Mode"
msgstr "切æ¢æ¨¡å¼"
+msgid "Advance"
+msgstr "å‰è¿›"
+
msgid "Condition"
msgstr "æ¡ä»¶"
@@ -4069,6 +5602,9 @@ msgstr "当å‰åŠ¨ç”»"
msgid "Assigned Animation"
msgstr "分é…动画"
+msgid "Reset on Save"
+msgstr "ä¿å­˜æ—¶é‡ç½®"
+
msgid "Current Animation Length"
msgstr "当å‰åŠ¨ç”»é•¿åº¦"
@@ -4087,12 +5623,18 @@ msgstr "默认混åˆæ—¶é—´"
msgid "Method Call Mode"
msgstr "方法调用模å¼"
+msgid "Movie Quit on Finish"
+msgstr "结æŸæ—¶é€€å‡ºç”µå½±"
+
msgid "Tree Root"
msgstr "æ ‘æ ¹"
msgid "Anim Player"
msgstr "动画播放器"
+msgid "Advance Expression Base Node"
+msgstr "å‰è¿›è¡¨è¾¾å¼åŸºç¡€èŠ‚点"
+
msgid "Root Motion"
msgstr "æ ¹è¿åŠ¨"
@@ -4129,42 +5671,177 @@ msgstr "外部ä¿æŒæŒ‰ä¸‹"
msgid "Button Group"
msgstr "按钮组"
+msgid "Shortcut Feedback"
+msgstr "å¿«æ·é”®å馈"
+
+msgid "Shortcut in Tooltip"
+msgstr "工具æ示显示快æ·é”®"
+
+msgid "Text Overrun Behavior"
+msgstr "文本超é™è¡Œä¸º"
+
msgid "Clip Text"
msgstr "è£å‰ªæ–‡æœ¬"
+msgid "Icon Alignment"
+msgstr "图标对é½"
+
msgid "Expand Icon"
msgstr "扩展图标"
msgid "Use Top Left"
msgstr "使用左上角"
+msgid "Symbol Lookup on Click"
+msgstr "点击查询符å·"
+
+msgid "Line Folding"
+msgstr "折å è¡Œ"
+
+msgid "Line Length Guidelines"
+msgstr "行长度å‚考线"
+
+msgid "Draw Breakpoints Gutter"
+msgstr "绘制断点æ "
+
+msgid "Draw Bookmarks"
+msgstr "绘制书签"
+
+msgid "Draw Executing Lines"
+msgstr "绘制执行行"
+
+msgid "Draw Line Numbers"
+msgstr "绘制行å·"
+
+msgid "Zero Pad Line Numbers"
+msgstr "è¡Œå·ç”¨é›¶å¡«å……"
+
+msgid "Draw Fold Gutter"
+msgstr "绘制折å æ "
+
+msgid "Delimiters"
+msgstr "分隔符"
+
+msgid "Comments"
+msgstr "注释"
+
+msgid "Code Completion"
+msgstr "代ç è¡¥å…¨"
+
+msgid "Prefixes"
+msgstr "å‰ç¼€"
+
+msgid "Indentation"
+msgstr "缩进"
+
+msgid "Use Spaces"
+msgstr "使用空格"
+
+msgid "Automatic"
+msgstr "自动"
+
+msgid "Automatic Prefixes"
+msgstr "自动å‰ç¼€"
+
+msgid "Auto Brace Completion"
+msgstr "自动补全大括å·"
+
+msgid "Highlight Matching"
+msgstr "高亮匹é…项"
+
msgid "Edit Alpha"
msgstr "编辑 Alpha"
+msgid "Color Mode"
+msgstr "颜色模å¼"
+
msgid "Deferred Mode"
msgstr "延迟模å¼"
+msgid "Picker Shape"
+msgstr "拾å–器形状"
+
+msgid "Can Add Swatches"
+msgstr "å¯æ·»åŠ è‰²æ¿"
+
+msgid "Customization"
+msgstr "自定义"
+
+msgid "Sampler Visible"
+msgstr "采样器å¯è§"
+
+msgid "Color Modes Visible"
+msgstr "颜色模å¼å¯è§"
+
+msgid "Sliders Visible"
+msgstr "滑动æ¡å¯è§"
+
+msgid "Hex Visible"
+msgstr "å六进制å¯è§"
+
msgid "Presets Visible"
msgstr "预设å¯è§"
+msgid "Clip Contents"
+msgstr "è£å‰ªå†…容"
+
+msgid "Custom Minimum Size"
+msgstr "自定义最å°å°ºå¯¸"
+
+msgid "Layout Direction"
+msgstr "布局方å‘"
+
+msgid "Layout Mode"
+msgstr "布局模å¼"
+
+msgid "Anchors Preset"
+msgstr "锚点预设"
+
+msgid "Anchor Points"
+msgstr "锚点"
+
+msgid "Anchor Offsets"
+msgstr "锚点å移"
+
msgid "Grow Direction"
msgstr "伸长方å‘"
msgid "Pivot Offset"
msgstr "轴心å移"
+msgid "Container Sizing"
+msgstr "容器大å°"
+
msgid "Stretch Ratio"
msgstr "拉伸比例"
msgid "Localization"
msgstr "本地化"
+msgid "Auto Translate"
+msgstr "自动翻译"
+
+msgid "Localize Numeral System"
+msgstr "本地化数字系统"
+
msgid "Tooltip"
msgstr "工具æ示"
msgid "Focus"
msgstr "èšç„¦"
+msgid "Neighbor Left"
+msgstr "左邻"
+
+msgid "Neighbor Top"
+msgstr "上邻"
+
+msgid "Neighbor Right"
+msgstr "å³é‚»"
+
+msgid "Neighbor Bottom"
+msgstr "下邻"
+
msgid "Next"
msgstr "下一个"
@@ -4174,18 +5851,42 @@ msgstr "上一个"
msgid "Mouse"
msgstr "é¼ æ ‡"
+msgid "Force Pass Scroll Events"
+msgstr "强制传递滚动事件"
+
msgid "Default Cursor Shape"
msgstr "默认光标形状"
+msgid "Shortcut Context"
+msgstr "å¿«æ·é”®ä¸Šä¸‹æ–‡"
+
+msgid "Type Variation"
+msgstr "类型å˜ç§"
+
+msgid "OK Button Text"
+msgstr "确定按钮文本"
+
msgid "Dialog"
msgstr "对è¯æ¡†"
+msgid "Hide on OK"
+msgstr "确定时éšè—"
+
+msgid "Close on Escape"
+msgstr "ESC 时关闭"
+
msgid "Autowrap"
msgstr "自动æ¢è¡Œ"
+msgid "Cancel Button Text"
+msgstr "å–消按钮文本"
+
msgid "Mode Overrides Title"
msgstr "模å¼è¦†ç›–标题"
+msgid "Root Subfolder"
+msgstr "根部å­æ–‡ä»¶å¤¹"
+
msgid "Filters"
msgstr "过滤"
@@ -4201,6 +5902,15 @@ msgstr "å¸é™„è·ç¦»"
msgid "Use Snap"
msgstr "使用å¸é™„"
+msgid "Panning Scheme"
+msgstr "平移方案"
+
+msgid "Connection Lines"
+msgstr "连接线"
+
+msgid "Curvature"
+msgstr "曲率"
+
msgid "Zoom Min"
msgstr "缩放下é™"
@@ -4213,12 +5923,27 @@ msgstr "缩放步长"
msgid "Show Zoom Label"
msgstr "显示缩放标签"
+msgid "UI"
+msgstr "UI"
+
+msgid "Arrange Nodes Button Hidden"
+msgstr "éšè—排列节点按钮"
+
msgid "Title"
msgstr "标题"
+msgid "Position Offset"
+msgstr "ä½ç½®å移"
+
msgid "Show Close"
msgstr "显示关闭"
+msgid "Draggable"
+msgstr "å¯æ‹–动"
+
+msgid "Selectable"
+msgstr "å¯é€‰æ‹©"
+
msgid "Selected"
msgstr "选中"
@@ -4264,6 +5989,12 @@ msgstr "图标缩放"
msgid "Fixed Icon Size"
msgstr "固定图标大å°"
+msgid "Label Settings"
+msgstr "标签设置"
+
+msgid "Displayed Text"
+msgstr "文本显示"
+
msgid "Lines Skipped"
msgstr "跳过行数"
@@ -4273,6 +6004,15 @@ msgstr "最大å¯è§è¡Œæ•°"
msgid "Visible Characters"
msgstr "å¯è§å­—符"
+msgid "Visible Characters Behavior"
+msgstr "å¯è§å­—符行为"
+
+msgid "Visible Ratio"
+msgstr "å¯è§æ¯”例"
+
+msgid "Placeholder Text"
+msgstr "å ä½ç¬¦æ–‡æœ¬"
+
msgid "Max Length"
msgstr "最大长度"
@@ -4282,12 +6022,18 @@ msgstr "秘密"
msgid "Secret Character"
msgstr "秘密字符"
+msgid "Expand to Text Length"
+msgstr "扩展至文本长度"
+
msgid "Context Menu Enabled"
msgstr "上下文èœå•å¯ç”¨"
msgid "Virtual Keyboard Enabled"
msgstr "虚拟键盘å¯ç”¨"
+msgid "Virtual Keyboard Type"
+msgstr "虚拟键盘类型"
+
msgid "Clear Button Enabled"
msgstr "清除按钮å¯ç”¨"
@@ -4300,15 +6046,48 @@ msgstr "鼠标中键粘贴å¯ç”¨"
msgid "Selecting Enabled"
msgstr "选择å¯ç”¨"
+msgid "Deselect on Focus Loss Enabled"
+msgstr "焦点丢失时å–消选择å¯ç”¨"
+
msgid "Right Icon"
msgstr "å³ä¾§å›¾æ ‡"
+msgid "Draw Control Chars"
+msgstr "绘制控制字符"
+
+msgid "Select All on Focus"
+msgstr "èšç„¦æ—¶å…¨é€‰"
+
msgid "Blink"
msgstr "é—ªçƒ"
+msgid "Blink Interval"
+msgstr "é—ªçƒé—´éš”"
+
+msgid "Column"
+msgstr "列数"
+
+msgid "Force Displayed"
+msgstr "强制显示"
+
+msgid "Mid Grapheme"
+msgstr "字素内部"
+
msgid "Underline"
msgstr "下划线"
+msgid "URI"
+msgstr "URI"
+
+msgid "Start Index"
+msgstr "起始索引"
+
+msgid "Switch on Hover"
+msgstr "悬åœæ—¶åˆ‡æ¢"
+
+msgid "Prefer Global Menu"
+msgstr "首选全局èœå•"
+
msgid "Draw Center"
msgstr "绘制中心"
@@ -4321,6 +6100,18 @@ msgstr "宫格边è·"
msgid "Axis Stretch"
msgstr "轴拉伸"
+msgid "Fit to Longest Item"
+msgstr "适é…最长项"
+
+msgid "Hide on Item Selection"
+msgstr "项目选择时éšè—"
+
+msgid "Hide on Checkable Item Selection"
+msgstr "项目勾选时éšè—"
+
+msgid "Hide on State Item Selection"
+msgstr "选择状æ€é¡¹ç›®æ—¶éšè—"
+
msgid "Submenu Popup Delay"
msgstr "å­èœå•å¼¹å‡ºå»¶è¿Ÿ"
@@ -4330,6 +6121,9 @@ msgstr "å…许æœç´¢"
msgid "Fill Mode"
msgstr "填充模å¼"
+msgid "Show Percentage"
+msgstr "显示百分比"
+
msgid "Min Value"
msgstr "最å°å€¼"
@@ -4363,14 +6157,26 @@ msgstr "边框宽度"
msgid "Elapsed Time"
msgstr "å·²ç»è¿‡æ—¶é—´"
+msgid "Outline"
+msgstr "轮廓"
+
msgid "Env"
msgstr "环境"
+msgid "Glyph Index"
+msgstr "字形索引"
+
+msgid "Glyph Count"
+msgstr "字形计数"
+
+msgid "Glyph Flags"
+msgstr "字形标志"
+
msgid "Relative Index"
msgstr "相对索引"
-msgid "Fit Content Height"
-msgstr "适é…内容高度"
+msgid "Bbcode Enabled"
+msgstr "å¯ç”¨ Bbcode"
msgid "Scroll Active"
msgstr "滚动激活"
@@ -4381,12 +6187,27 @@ msgstr "滚动跟éš"
msgid "Tab Size"
msgstr "制表符大å°"
+msgid "Markup"
+msgstr "标记"
+
msgid "Custom Effects"
msgstr "自定义特效"
msgid "Meta Underlined"
msgstr "元数æ®ä¸‹åˆ’线"
+msgid "Hint Underlined"
+msgstr "下划线æ示"
+
+msgid "Threaded"
+msgstr "多线程"
+
+msgid "Progress Bar Delay"
+msgstr "进度æ¡å»¶è¿Ÿ"
+
+msgid "Text Selection"
+msgstr "文本选区"
+
msgid "Selection Enabled"
msgstr "å¯ç”¨é€‰æ‹©"
@@ -4396,6 +6217,15 @@ msgstr "自定义步长"
msgid "Follow Focus"
msgstr "è·Ÿéšç„¦ç‚¹"
+msgid "Horizontal Scroll Mode"
+msgstr "水平滚动模å¼"
+
+msgid "Vertical Scroll Mode"
+msgstr "垂直滚动模å¼"
+
+msgid "Scroll Deadzone"
+msgstr "滚动死区"
+
msgid "Default Scroll Deadzone"
msgstr "默认滚动死区"
@@ -4405,6 +6235,15 @@ msgstr "å¯æ»šåŠ¨"
msgid "Tick Count"
msgstr "刻度数é‡"
+msgid "Ticks on Borders"
+msgstr "边界刻度"
+
+msgid "Update on Text Changed"
+msgstr "文本更改时更新"
+
+msgid "Custom Arrow Step"
+msgstr "自定义箭头步长"
+
msgid "Split Offset"
msgstr "拆分å移"
@@ -4414,30 +6253,75 @@ msgstr "折å "
msgid "Dragger Visibility"
msgstr "拖动器å¯è§æ€§"
-msgid "Stretch"
-msgstr "拉伸"
-
msgid "Stretch Shrink"
msgstr "拉伸收缩"
msgid "Current Tab"
msgstr "当å‰é€‰é¡¹å¡"
+msgid "Tab Alignment"
+msgstr "选项å¡å¯¹é½"
+
+msgid "Clip Tabs"
+msgstr "è£å‰ªé€‰é¡¹å¡"
+
msgid "Tab Close Display Policy"
msgstr "选项å¡å…³é—­æ˜¾ç¤ºç­–ç•¥"
+msgid "Max Tab Width"
+msgstr "最大选项å¡å®½åº¦"
+
msgid "Scrolling Enabled"
msgstr "å¯ç”¨æ»šåŠ¨"
+msgid "Drag to Rearrange Enabled"
+msgstr "å¯ç”¨æ‹–放é‡æŽ’"
+
+msgid "Tabs Rearrange Group"
+msgstr "选项å¡é‡æ–°æŽ’列组"
+
+msgid "Scroll to Selected"
+msgstr "滚动到选定"
+
+msgid "Select With RMB"
+msgstr "å³é”®é€‰æ‹©"
+
+msgid "Tabs"
+msgstr "选项å¡"
+
msgid "Tabs Visible"
msgstr "选项å¡å¯è§"
+msgid "Use Hidden Tabs for Min Size"
+msgstr "最å°å¤§å°è€ƒè™‘éšè—选项å¡"
+
+msgid "Drag and Drop Selection Enabled"
+msgstr "å¯ç”¨æ‹–放选择"
+
+msgid "Wrap Mode"
+msgstr "包裹模å¼"
+
msgid "Syntax Highlighter"
msgstr "语法高亮器"
+msgid "Smooth"
+msgstr "平滑"
+
+msgid "Past End of File"
+msgstr "超过文件末尾"
+
+msgid "Fit Content Height"
+msgstr "适é…内容高度"
+
msgid "Draw"
msgstr "绘制"
+msgid "Move on Right Click"
+msgstr "å³é”®ç‚¹å‡»æ—¶ç§»åŠ¨"
+
+msgid "Multiple"
+msgstr "多个"
+
msgid "Hover"
msgstr "悬åœ"
@@ -4447,9 +6331,15 @@ msgstr "èšç„¦"
msgid "Click Mask"
msgstr "点击é®ç½©"
+msgid "Ignore Texture Size"
+msgstr "忽略纹ç†å¤§å°"
+
msgid "Nine Patch Stretch"
msgstr "ä¹å®«æ ¼æ‹‰ä¼¸"
+msgid "Stretch Margin"
+msgstr "拉伸边è·"
+
msgid "Under"
msgstr "下方"
@@ -4474,6 +6364,9 @@ msgstr "填充角度"
msgid "Center Offset"
msgstr "中心å移"
+msgid "Expand Mode"
+msgstr "扩展模å¼"
+
msgid "Custom Minimum Height"
msgstr "自定义最å°é«˜åº¦"
@@ -4483,12 +6376,21 @@ msgstr "列标题å¯è§"
msgid "Hide Folding"
msgstr "éšè—折å "
+msgid "Enable Recursive Folding"
+msgstr "å¯ç”¨é€’归折å "
+
msgid "Hide Root"
msgstr "éšè—æ ¹"
msgid "Drop Mode Flags"
msgstr "拖放模å¼æ ‡å¿—"
+msgid "Scroll Horizontal Enabled"
+msgstr "å¯ç”¨æ°´å¹³æ»šåŠ¨"
+
+msgid "Scroll Vertical Enabled"
+msgstr "å¯ç”¨åž‚直滚动"
+
msgid "Audio Track"
msgstr "音频轨é“"
@@ -4513,12 +6415,27 @@ msgstr "自我调制"
msgid "Show Behind Parent"
msgstr "显示在父级之åŽ"
+msgid "Clip Children"
+msgstr "è£å‰ªå­é¡¹"
+
msgid "Light Mask"
msgstr "光线é®ç½©"
+msgid "Visibility Layer"
+msgstr "å¯è§å±‚"
+
+msgid "Ordering"
+msgstr "排åº"
+
msgid "Z Index"
msgstr "Z 索引"
+msgid "Z as Relative"
+msgstr "Z 为相对é‡"
+
+msgid "Y Sort Enabled"
+msgstr "å¯ç”¨ Y 排åº"
+
msgid "Repeat"
msgstr "é‡å¤"
@@ -4531,6 +6448,9 @@ msgstr "漫åå°„"
msgid "NormalMap"
msgstr "法线贴图"
+msgid "Shininess"
+msgstr "光泽度"
+
msgid "Follow Viewport"
msgstr "è·Ÿéšè§†å£"
@@ -4540,6 +6460,9 @@ msgstr "下载文件"
msgid "Download Chunk Size"
msgstr "下载分å—大å°"
+msgid "Accept Gzip"
+msgstr "接收 Gzip"
+
msgid "Body Size Limit"
msgstr "å“应体大å°é™åˆ¶"
@@ -4549,12 +6472,18 @@ msgstr "最大跳转"
msgid "Timeout"
msgstr "超时"
+msgid "Multiplayer Peer"
+msgstr "多人对等体"
+
msgid "Transfer Mode"
msgstr "传输模å¼"
msgid "Transfer Channel"
msgstr "传输通é“"
+msgid "Scene File Path"
+msgstr "场景文件路径"
+
msgid "Owner"
msgstr "拥有者"
@@ -4570,6 +6499,9 @@ msgstr "剩余时间"
msgid "Debug Collisions Hint"
msgstr "调试碰撞æ示"
+msgid "Debug Paths Hint"
+msgstr "调试路径æ示"
+
msgid "Debug Navigation Hint"
msgstr "调试导航æ示"
@@ -4597,21 +6529,63 @@ msgstr "接触颜色"
msgid "Geometry Color"
msgstr "几何体颜色"
+msgid "Geometry Width"
+msgstr "几何体宽度"
+
msgid "Draw 2D Outlines"
msgstr "绘制 2D 轮廓"
msgid "Anti Aliasing"
msgstr "抗锯齿"
+msgid "MSAA 2D"
+msgstr "MSAA 2D"
+
+msgid "MSAA 3D"
+msgstr "MSAA 3D"
+
+msgid "Viewport"
+msgstr "视å£"
+
+msgid "Transparent Background"
+msgstr "é€æ˜ŽèƒŒæ™¯"
+
+msgid "Screen Space AA"
+msgstr "å±å¹•ç©ºé—´ AA"
+
+msgid "Use TAA"
+msgstr "使用 TAA"
+
msgid "Use Debanding"
msgstr "使用去æ¡å¸¦"
-msgid "Occlusion Culling"
-msgstr "é®æŒ¡å‰”除"
+msgid "Use Occlusion Culling"
+msgstr "使用é®æŒ¡å‰”除"
+
+msgid "Snap 2D Transforms to Pixel"
+msgstr "å°† 2D å˜æ¢æ•æ‰åˆ°åƒç´ "
+
+msgid "Snap 2D Vertices to Pixel"
+msgstr "å°† 2D 顶点å¸é™„到åƒç´ "
+
+msgid "Lights and Shadows"
+msgstr "ç¯å…‰ä¸Žé˜´å½±"
+
+msgid "Positional Shadow"
+msgstr "ä½ç½®é˜´å½±"
msgid "Atlas Size"
msgstr "图集大å°"
+msgid "Atlas 16 Bits"
+msgstr "图集 16 ä½"
+
+msgid "SDF"
+msgstr "SDF"
+
+msgid "Oversize"
+msgstr "显示缩放"
+
msgid "Enable Object Picking"
msgstr "å¯ç”¨å¯¹è±¡æ‹¾å–"
@@ -4627,6 +6601,15 @@ msgstr "Viewport 路径"
msgid "Disable 3D"
msgstr "ç¦ç”¨ 3D"
+msgid "Use XR"
+msgstr "使用 XR"
+
+msgid "Own World 3D"
+msgstr "自有 3D 世界"
+
+msgid "World 3D"
+msgstr "3D 世界"
+
msgid "World 2D"
msgstr "2D 世界"
@@ -4639,6 +6622,27 @@ msgstr "输入本地处ç†"
msgid "Debug Draw"
msgstr "调试绘制"
+msgid "Scaling 3D"
+msgstr "缩放 3D"
+
+msgid "Scaling 3D Mode"
+msgstr "缩放 3D 模å¼"
+
+msgid "Scaling 3D Scale"
+msgstr "缩放 3D 比例"
+
+msgid "Texture Mipmap Bias"
+msgstr "çº¹ç† Mipmap åç½®"
+
+msgid "FSR Sharpness"
+msgstr "FSR é”度"
+
+msgid "Variable Rate Shading"
+msgstr "å¯å˜é€ŸçŽ‡ç€è‰²"
+
+msgid "Canvas Items"
+msgstr "画布项"
+
msgid "Audio Listener"
msgstr "音频监å¬å™¨"
@@ -4654,6 +6658,12 @@ msgstr "对象拾å–"
msgid "Disable Input"
msgstr "ç¦ç”¨è¾“å…¥"
+msgid "Positional Shadow Atlas"
+msgstr "ä½ç½®é˜´å½±å›¾é›†"
+
+msgid "16 Bits"
+msgstr "16 ä½"
+
msgid "Quad 0"
msgstr "四方形 0"
@@ -4672,6 +6682,15 @@ msgstr "画布å˜æ¢"
msgid "Global Canvas Transform"
msgstr "全局画布å˜æ¢"
+msgid "Canvas Cull Mask"
+msgstr "画布剔除é®ç½©"
+
+msgid "Size 2D Override"
+msgstr "2D 大å°è¦†ç›–"
+
+msgid "Size 2D Override Stretch"
+msgstr "2D 大å°è¦†ç›–拉伸"
+
msgid "Render Target"
msgstr "渲染目标"
@@ -4681,17 +6700,41 @@ msgstr "清å±æ¨¡å¼"
msgid "Current Screen"
msgstr "当å‰å±å¹•"
+msgid "Mouse Passthrough Polygon"
+msgstr "鼠标穿é€å¤šè¾¹å½¢"
+
+msgid "Wrap Controls"
+msgstr "包裹控件"
+
+msgid "Transient"
+msgstr "瞬æ€"
+
msgid "Exclusive"
msgstr "独å "
+msgid "Unresizable"
+msgstr "ä¸å¯è°ƒæ•´å¤§å°"
+
+msgid "Unfocusable"
+msgstr "无法èšç„¦"
+
+msgid "Popup Window"
+msgstr "弹出窗å£"
+
+msgid "Mouse Passthrough"
+msgstr "鼠标穿é€"
+
msgid "Min Size"
msgstr "最å°å¤§å°"
msgid "Max Size"
msgstr "大å°ä¸Šé™"
-msgid "Aspect"
-msgstr "比例"
+msgid "Content Scale"
+msgstr "内容缩放"
+
+msgid "Swap Cancel OK"
+msgstr "交æ¢å–消确定"
msgid "Layer Names"
msgstr "层å称"
@@ -4714,6 +6757,9 @@ msgstr "3D 物ç†"
msgid "3D Navigation"
msgstr "3D 导航"
+msgid "Polyphony"
+msgstr "å¤éŸ³"
+
msgid "Format"
msgstr "æ ¼å¼"
@@ -4723,12 +6769,72 @@ msgstr "混音率"
msgid "Stereo"
msgstr "立体声"
+msgid "Profile"
+msgstr "é…置文件"
+
+msgid "Bonemap"
+msgstr "骨骼映射"
+
msgid "Exposure"
msgstr "æ›å…‰"
+msgid "Sensitivity"
+msgstr "çµæ•åº¦"
+
+msgid "Multiplier"
+msgstr "乘数"
+
msgid "Auto Exposure"
msgstr "自动æ›å…‰"
+msgid "DOF Blur"
+msgstr "景深模糊"
+
+msgid "Far Enabled"
+msgstr "远端å¯ç”¨"
+
+msgid "Far Distance"
+msgstr "远端è·ç¦»"
+
+msgid "Far Transition"
+msgstr "远端过渡"
+
+msgid "Near Enabled"
+msgstr "近端å¯ç”¨"
+
+msgid "Near Distance"
+msgstr "近端è·ç¦»"
+
+msgid "Near Transition"
+msgstr "近端过渡"
+
+msgid "Min Sensitivity"
+msgstr "最å°çµæ•åº¦"
+
+msgid "Max Sensitivity"
+msgstr "最大çµæ•åº¦"
+
+msgid "Frustum"
+msgstr "视锥"
+
+msgid "Focus Distance"
+msgstr "焦点è·ç¦»"
+
+msgid "Focal Length"
+msgstr "焦è·"
+
+msgid "Aperture"
+msgstr "光圈"
+
+msgid "Shutter Speed"
+msgstr "快门速度"
+
+msgid "Min Exposure Value"
+msgstr "最å°æ›å…‰å€¼"
+
+msgid "Max Exposure Value"
+msgstr "最大æ›å…‰å€¼"
+
msgid "Light Mode"
msgstr "光照模å¼"
@@ -4747,6 +6853,9 @@ msgstr "ç²’å­åŠ¨ç”»å¾ªçŽ¯"
msgid "Segments"
msgstr "分段"
+msgid "Backface Collision"
+msgstr "背é¢ç¢°æ’ž"
+
msgid "Bake Resolution"
msgstr "烘焙分辨率"
@@ -4762,18 +6871,69 @@ msgstr "é¢æ¿"
msgid "Font Color"
msgstr "字体颜色"
+msgid "Font Pressed Color"
+msgstr "字体颜色按下"
+
+msgid "Font Hover Color"
+msgstr "字体颜色悬åœ"
+
+msgid "Font Focus Color"
+msgstr "字体颜色èšç„¦"
+
+msgid "Font Hover Pressed Color"
+msgstr "字体颜色悬åœä¸”按下"
+
+msgid "Font Disabled Color"
+msgstr "字体颜色ç¦ç”¨"
+
+msgid "Font Outline Color"
+msgstr "字体轮廓颜色"
+
+msgid "Icon Normal Color"
+msgstr "图标正常颜色"
+
+msgid "Icon Pressed Color"
+msgstr "图标按下颜色"
+
+msgid "Icon Hover Color"
+msgstr "图标悬åœé¢œè‰²"
+
+msgid "Icon Hover Pressed Color"
+msgstr "图标悬åœæŒ‰ä¸‹é¢œè‰²"
+
+msgid "Icon Focus Color"
+msgstr "图标èšç„¦é¢œè‰²"
+
+msgid "Icon Disabled Color"
+msgstr "图标ç¦ç”¨é¢œè‰²"
+
msgid "H Separation"
msgstr "水平间è·"
msgid "Underline Spacing"
msgstr "下划线间è·"
+msgid "Normal Mirrored"
+msgstr "正常镜åƒ"
+
+msgid "Hover Mirrored"
+msgstr "悬åœé•œåƒ"
+
+msgid "Pressed Mirrored"
+msgstr "按下镜åƒ"
+
+msgid "Disabled Mirrored"
+msgstr "ç¦ç”¨é•œåƒ"
+
msgid "Arrow"
msgstr "箭头"
msgid "Arrow Margin"
msgstr "箭头边è·"
+msgid "Modulate Arrow"
+msgstr "调制箭头"
+
msgid "Hover Pressed"
msgstr "悬åœä¸”按下"
@@ -4787,29 +6947,65 @@ msgid "Unchecked Disabled"
msgstr "未勾选且ç¦ç”¨"
msgid "Radio Checked"
-msgstr "å•é€‰é€‰ä¸­"
+msgstr "å•é€‰å·²å‹¾é€‰"
msgid "Radio Checked Disabled"
-msgstr "å•é€‰é€‰ä¸­ä¸”ç¦ç”¨"
+msgstr "å•é€‰å·²å‹¾é€‰ä¸”ç¦ç”¨"
msgid "Radio Unchecked"
-msgstr "å•é€‰æœªé€‰ä¸­"
+msgstr "å•é€‰æœªå‹¾é€‰"
msgid "Radio Unchecked Disabled"
msgstr "å•é€‰æœªé€‰ä¸­ä¸”ç¦ç”¨"
+msgid "Check V Offset"
+msgstr "勾选图标垂直å移"
+
+msgid "Checked Mirrored"
+msgstr "勾选镜åƒ"
+
+msgid "Checked Disabled Mirrored"
+msgstr "勾选ç¦ç”¨é•œåƒ"
+
+msgid "Unchecked Mirrored"
+msgstr "未勾选镜åƒ"
+
+msgid "Unchecked Disabled Mirrored"
+msgstr "未勾选ç¦ç”¨é•œåƒ"
+
+msgid "Font Shadow Color"
+msgstr "字体阴影颜色"
+
msgid "Shadow Offset X"
msgstr "阴影 X å移"
msgid "Shadow Offset Y"
msgstr "阴影 Y å移"
+msgid "Shadow Outline Size"
+msgstr "阴影轮廓大å°"
+
+msgid "Font Selected Color"
+msgstr "字体颜色选中"
+
+msgid "Font Uneditable Color"
+msgstr "字体颜色ä¸å¯ç¼–辑"
+
+msgid "Font Placeholder Color"
+msgstr "字体颜色å ä½ç¬¦"
+
msgid "Clear Button Color"
msgstr "清除按钮颜色"
msgid "Clear Button Color Pressed"
msgstr "清除按钮颜色按下"
+msgid "Minimum Character Width"
+msgstr "最å°å­—符宽度"
+
+msgid "Caret Width"
+msgstr "光标宽度"
+
msgid "Clear"
msgstr "清除"
@@ -4822,12 +7018,27 @@ msgstr "选项å¡"
msgid "Space"
msgstr "空格"
+msgid "Font Readonly Color"
+msgstr "字体颜色åªè¯»"
+
msgid "Breakpoint"
msgstr "断点"
+msgid "Bookmark"
+msgstr "书签"
+
+msgid "Executing Line"
+msgstr "执行行"
+
+msgid "Can Fold"
+msgstr "å¯æŠ˜å "
+
msgid "Folded"
msgstr "已折å "
+msgid "Folded EOL Icon"
+msgstr "æŠ˜å  EOL 图标"
+
msgid "Completion Lines"
msgstr "补全行数"
@@ -4882,30 +7093,60 @@ msgstr "手柄ç¦ç”¨"
msgid "Tick"
msgstr "刻度"
+msgid "Grabber Offset"
+msgstr "抓å–器å移"
+
msgid "Updown"
msgstr "上下"
+msgid "Embedded Border"
+msgstr "嵌入å¼è¾¹æ¡†"
+
msgid "Title Font"
msgstr "标题字体"
+msgid "Title Font Size"
+msgstr "标题字体大å°"
+
msgid "Title Color"
msgstr "标题颜色"
+msgid "Title Outline Modulate"
+msgstr "标题轮廓调制"
+
+msgid "Title Outline Size"
+msgstr "标题轮廓大å°"
+
msgid "Title Height"
msgstr "标题高度"
+msgid "Resize Margin"
+msgstr "调整边è·"
+
msgid "Close"
msgstr "关闭"
+msgid "Close Pressed"
+msgstr "关闭按下"
+
msgid "Close H Offset"
msgstr "关闭水平å移"
msgid "Close V Offset"
msgstr "关闭垂直å移"
+msgid "Buttons Separation"
+msgstr "按钮间è·"
+
msgid "Parent Folder"
msgstr "父文件夹"
+msgid "Back Folder"
+msgstr "返回文件夹"
+
+msgid "Forward Folder"
+msgstr "å‰è¿›æ–‡ä»¶å¤¹"
+
msgid "Reload"
msgstr "é‡æ–°åŠ è½½"
@@ -4918,6 +7159,15 @@ msgstr "文件夹"
msgid "File"
msgstr "文件"
+msgid "Folder Icon Color"
+msgstr "文件夹图标颜色"
+
+msgid "File Icon Color"
+msgstr "文件图标颜色"
+
+msgid "File Disabled Color"
+msgstr "文件ç¦ç”¨é¢œè‰²"
+
msgid "Panel Disabled"
msgstr "é¢æ¿ç¦ç”¨"
@@ -4933,18 +7183,45 @@ msgstr "带å称分隔线å³ä¾§"
msgid "Submenu"
msgstr "å­èœå•"
+msgid "Submenu Mirrored"
+msgstr "å­èœå•é•œåƒ"
+
msgid "Font Separator"
-msgstr "分隔线字体"
+msgstr "分隔符字体"
+
+msgid "Font Separator Size"
+msgstr "分隔符字体大å°"
+
+msgid "Font Accelerator Color"
+msgstr "字体加速器颜色"
+
+msgid "Font Separator Color"
+msgstr "字体分隔符颜色"
+
+msgid "Font Separator Outline Color"
+msgstr "字体分隔符轮廓颜色"
msgid "V Separation"
msgstr "åž‚ç›´é—´è·"
+msgid "Separator Outline Size"
+msgstr "分隔符轮廓大å°"
+
+msgid "Item Start Padding"
+msgstr "项目首端填充"
+
+msgid "Item End Padding"
+msgstr "项目末端填充"
+
msgid "Selected Frame"
msgstr "选中框架"
msgid "Comment Focus"
msgstr "注释èšç„¦"
+msgid "Slot"
+msgstr "æ’槽"
+
msgid "Resizer"
msgstr "大å°è°ƒæ•´å™¨"
@@ -4960,6 +7237,9 @@ msgstr "é—´è·"
msgid "Title Offset"
msgstr "标题å移"
+msgid "Title H Offset"
+msgstr "标题水平å移"
+
msgid "Close Offset"
msgstr "关闭å移"
@@ -4993,12 +7273,18 @@ msgstr "自定义按钮按下"
msgid "Custom Button Hover"
msgstr "自定义按钮悬åœ"
+msgid "Indeterminate"
+msgstr "ä¸ç¡®å®š"
+
msgid "Select Arrow"
msgstr "选择箭头"
msgid "Arrow Collapsed"
msgstr "箭头折å "
+msgid "Arrow Collapsed Mirrored"
+msgstr "箭头折å é•œåƒ"
+
msgid "Title Button Font"
msgstr "标题按钮字体"
@@ -5014,6 +7300,12 @@ msgstr "放置ä½ç½®é¢œè‰²"
msgid "Relationship Line Color"
msgstr "关系线颜色"
+msgid "Parent HL Line Color"
+msgstr "父 HL 线颜色"
+
+msgid "Children HL Line Color"
+msgstr "å­ HL 线颜色"
+
msgid "Custom Button Font Highlight"
msgstr "自定义按钮字体高亮"
@@ -5026,6 +7318,18 @@ msgstr "按钮边è·"
msgid "Draw Relationship Lines"
msgstr "绘制关系线"
+msgid "Relationship Line Width"
+msgstr "关系线宽度"
+
+msgid "Parent HL Line Width"
+msgstr "父 HL 线宽度"
+
+msgid "Children HL Line Width"
+msgstr "å­ HL 线宽度"
+
+msgid "Parent HL Line Margin"
+msgstr "父 HL 线边è·"
+
msgid "Draw Guides"
msgstr "绘制å‚考线"
@@ -5041,18 +7345,42 @@ msgstr "图标边è·"
msgid "Line Separation"
msgstr "行间è·"
+msgid "Tab Selected"
+msgstr "选项å¡å·²é€‰"
+
+msgid "Tab Unselected"
+msgstr "选项å¡æœªé€‰"
+
msgid "Tab Disabled"
msgstr "选项å¡ç¦ç”¨"
+msgid "Tabbar Background"
+msgstr "选项å¡æ èƒŒæ™¯"
+
+msgid "Drop Mark"
+msgstr "放下标记"
+
msgid "Menu"
msgstr "èœå•"
msgid "Menu Highlight"
msgstr "èœå•é«˜äº®"
+msgid "Font Unselected Color"
+msgstr "字体颜色未选"
+
+msgid "Drop Mark Color"
+msgstr "放下标记颜色"
+
msgid "Side Margin"
msgstr "侧边è·"
+msgid "Icon Separation"
+msgstr "图标间è·"
+
+msgid "Button Highlight"
+msgstr "按钮高亮"
+
msgid "Large"
msgstr "大å·"
@@ -5068,18 +7396,45 @@ msgstr "H 宽度"
msgid "Label Width"
msgstr "标签宽度"
+msgid "Folded Arrow"
+msgstr "折å ç®­å¤´"
+
+msgid "Expanded Arrow"
+msgstr "展开箭头"
+
msgid "Screen Picker"
msgstr "å±å¹•å–色器"
+msgid "Shape Circle"
+msgstr "形状圆"
+
+msgid "Shape Rect"
+msgstr "形状矩形"
+
+msgid "Shape Rect Wheel"
+msgstr "形状矩形轮"
+
msgid "Add Preset"
msgstr "添加预设"
+msgid "Sample BG"
+msgstr "采样背景"
+
msgid "Overbright Indicator"
msgstr "过亮指示器"
+msgid "Bar Arrow"
+msgstr "æ¡å½¢ç®­å¤´"
+
+msgid "Picker Cursor"
+msgstr "选å–器光标"
+
msgid "Color Hue"
msgstr "颜色色相"
+msgid "Color Okhsl Hue"
+msgstr "颜色 Okhsl 色相"
+
msgid "BG"
msgstr "背景"
@@ -5104,12 +7459,48 @@ msgstr "加粗斜体字体"
msgid "Mono Font"
msgstr "等宽字体"
+msgid "Normal Font Size"
+msgstr "正常字体大å°"
+
+msgid "Bold Font Size"
+msgstr "粗体字体大å°"
+
+msgid "Italics Font Size"
+msgstr "斜体字体大å°"
+
+msgid "Bold Italics Font Size"
+msgstr "加粗斜体字体大å°"
+
+msgid "Mono Font Size"
+msgstr "等宽字体大å°"
+
msgid "Table H Separation"
msgstr "表格水平间è·"
msgid "Table V Separation"
msgstr "表格垂直间è·"
+msgid "Table Odd Row BG"
+msgstr "表格奇数行背景"
+
+msgid "Table Even Row BG"
+msgstr "表格å¶æ•°è¡ŒèƒŒæ™¯"
+
+msgid "Table Border"
+msgstr "表格边框"
+
+msgid "Text Highlight H Padding"
+msgstr "文本高亮水平填充"
+
+msgid "Text Highlight V Padding"
+msgstr "文本高亮竖直填充"
+
+msgid "H Grabber"
+msgstr "水平抓å–器"
+
+msgid "V Grabber"
+msgstr "竖直抓å–器"
+
msgid "Margin Left"
msgstr "左边è·"
@@ -5122,6 +7513,9 @@ msgstr "å³è¾¹è·"
msgid "Margin Bottom"
msgstr "下边è·"
+msgid "Minimum Grab Thickness"
+msgstr "最å°æŠ“å–厚度"
+
msgid "Autohide"
msgstr "自动éšè—"
@@ -5132,10 +7526,10 @@ msgid "More"
msgstr "更多"
msgid "Grid Minor"
-msgstr "次网格"
+msgstr "次栅格"
msgid "Grid Major"
-msgstr "主网格"
+msgstr "主栅格"
msgid "Selection Fill"
msgstr "选中项填充"
@@ -5146,9 +7540,18 @@ msgstr "选中项æè¾¹"
msgid "Activity"
msgstr "活动"
+msgid "Port Hotzone Inner Extent"
+msgstr "端å£çƒ­åŒºå†…部范围"
+
+msgid "Port Hotzone Outer Extent"
+msgstr "端å£çƒ­åŒºå¤–部范围"
+
msgid "Node"
msgstr "节点"
+msgid "Energy Multiplier"
+msgstr "能é‡å€å¢žå™¨"
+
msgid "Canvas Max Layer"
msgstr "画布最大层"
@@ -5158,6 +7561,9 @@ msgstr "ç›¸æœºæº ID"
msgid "Sky"
msgstr "天空"
+msgid "Custom FOV"
+msgstr "自定义 FOV"
+
msgid "Ambient Light"
msgstr "环境光"
@@ -5167,12 +7573,18 @@ msgstr "æ¥æº"
msgid "Sky Contribution"
msgstr "天空贡献"
+msgid "Reflected Light"
+msgstr "åå°„å…‰"
+
msgid "Tonemap"
msgstr "色调映射"
msgid "White"
msgstr "白点"
+msgid "SSR"
+msgstr "SSR"
+
msgid "Max Steps"
msgstr "最大步数"
@@ -5188,15 +7600,57 @@ msgstr "深度公差"
msgid "SSAO"
msgstr "SSAO"
+msgid "Power"
+msgstr "力é‡"
+
msgid "Detail"
msgstr "细节"
+msgid "Horizon"
+msgstr "地平线"
+
+msgid "Sharpness"
+msgstr "边缘é”度"
+
msgid "Light Affect"
msgstr "光照影å“"
msgid "AO Channel Affect"
msgstr "AO 通é“å½±å“"
+msgid "SSIL"
+msgstr "SSIL"
+
+msgid "Normal Rejection"
+msgstr "法线拒ç»"
+
+msgid "SDFGI"
+msgstr "SDFGI"
+
+msgid "Use Occlusion"
+msgstr "使用é®æŒ¡"
+
+msgid "Read Sky Light"
+msgstr "读å–天空光照"
+
+msgid "Bounce Feedback"
+msgstr "åå¼¹å馈"
+
+msgid "Cascades"
+msgstr "级è”"
+
+msgid "Min Cell Size"
+msgstr "最å°å•å…ƒæ ¼å¤§å°"
+
+msgid "Cascade 0 Distance"
+msgstr "çº§è” 0 è·ç¦»"
+
+msgid "Y Scale"
+msgstr "Y 比例"
+
+msgid "Probe Bias"
+msgstr "探针åç½®"
+
msgid "Glow"
msgstr "辉光"
@@ -5239,12 +7693,51 @@ msgstr "HDR 缩放"
msgid "HDR Luminance Cap"
msgstr "HDR 亮度上é™"
+msgid "Map Strength"
+msgstr "映射强度"
+
+msgid "Map"
+msgstr "映射"
+
msgid "Fog"
msgstr "雾"
+msgid "Light Color"
+msgstr "光线颜色"
+
+msgid "Light Energy"
+msgstr "光线能é‡"
+
+msgid "Sun Scatter"
+msgstr "太阳散射"
+
+msgid "Density"
+msgstr "密度"
+
+msgid "Aerial Perspective"
+msgstr "空气é€è§†"
+
+msgid "Sky Affect"
+msgstr "天空影å“"
+
+msgid "Height Density"
+msgstr "高度密度"
+
+msgid "Volumetric Fog"
+msgstr "体积雾"
+
+msgid "GI Inject"
+msgstr "GI 注入"
+
msgid "Anisotropy"
msgstr "å„å‘异性"
+msgid "Detail Spread"
+msgstr "细节传播"
+
+msgid "Ambient Inject"
+msgstr "环境光注入"
+
msgid "Adjustments"
msgstr "调整"
@@ -5257,12 +7750,51 @@ msgstr "饱和度"
msgid "Color Correction"
msgstr "颜色校正"
+msgid "Height Falloff"
+msgstr "高度衰å‡"
+
+msgid "Edge Fade"
+msgstr "边缘淡化"
+
+msgid "Density Texture"
+msgstr "密度纹ç†"
+
+msgid "Font Name"
+msgstr "字体å称"
+
+msgid "Style Name"
+msgstr "æ ·å¼å称"
+
+msgid "Font Style"
+msgstr "字体样å¼"
+
+msgid "Font Weight"
+msgstr "å­—é‡"
+
+msgid "Font Stretch"
+msgstr "字体拉伸"
+
+msgid "OpenType Feature Overrides"
+msgstr "OpenType 功能覆盖"
+
+msgid "Base Font"
+msgstr "基础字体"
+
msgid "Features"
msgstr "特性"
msgid "Extra Spacing"
msgstr "é¢å¤–é—´è·"
+msgid "Glyph"
+msgstr "å­—å½¢"
+
+msgid "Font Names"
+msgstr "字体å称"
+
+msgid "Font Italic"
+msgstr "字体斜体"
+
msgid "Interpolation Mode"
msgstr "æ’值模å¼"
@@ -5293,6 +7825,9 @@ msgstr "深度绘制模å¼"
msgid "Shading"
msgstr "ç€è‰²"
+msgid "Shading Mode"
+msgstr "ç€è‰²æ¨¡å¼"
+
msgid "Diffuse Mode"
msgstr "漫å射模å¼"
@@ -5305,17 +7840,29 @@ msgstr "ç¦ç”¨çŽ¯å¢ƒå…‰"
msgid "Vertex Color"
msgstr "顶点颜色"
+msgid "Use as Albedo"
+msgstr "用作å照率"
+
msgid "Is sRGB"
msgstr "是 sRGB"
+msgid "Texture Force sRGB"
+msgstr "纹ç†å¼ºåˆ¶ sRGB"
+
+msgid "Texture MSDF"
+msgstr "çº¹ç† MSDF"
+
+msgid "ORM"
+msgstr "ORM"
+
msgid "Metallic"
-msgstr "金属性"
+msgstr "金属度"
msgid "Texture Channel"
msgstr "纹ç†é€šé“"
msgid "Operator"
-msgstr "æ“作符"
+msgstr "è¿ç®—"
msgid "On UV2"
msgstr "使用 UV2"
@@ -5347,9 +7894,18 @@ msgstr "翻转切线"
msgid "Flip Binormal"
msgstr "翻转次法线"
+msgid "Flip Texture"
+msgstr "翻转纹ç†"
+
msgid "Subsurface Scattering"
msgstr "次表é¢æ•£å°„"
+msgid "Back Lighting"
+msgstr "背部照明"
+
+msgid "Backlight"
+msgstr "背光"
+
msgid "Refraction"
msgstr "折射"
@@ -5395,33 +7951,66 @@ msgstr "使用点大å°"
msgid "Point Size"
msgstr "点大å°"
+msgid "Use Particle Trails"
+msgstr "使用粒å­å°¾è¿¹"
+
msgid "Proximity Fade"
msgstr "接近淡出"
msgid "Distance"
msgstr "è·ç¦»"
+msgid "MSDF"
+msgstr "MSDF"
+
+msgid "Pixel Range"
+msgstr "åƒç´ èŒƒå›´"
+
msgid "Lightmap Size Hint"
msgstr "光照贴图大å°æ示"
+msgid "Blend Shape Mode"
+msgstr "æ··åˆå½¢çŠ¶æ¨¡å¼"
+
+msgid "Shadow Mesh"
+msgstr "阴影网格"
+
msgid "Item"
msgstr "项目"
msgid "Mesh Transform"
msgstr "网格å˜æ¢"
+msgid "Navigation Mesh Transform"
+msgstr "导航网格å˜æ¢"
+
msgid "Preview"
msgstr "预览"
msgid "Transform Format"
msgstr "å˜æ¢æ ¼å¼"
+msgid "Use Custom Data"
+msgstr "使用自定义数æ®"
+
msgid "Instance Count"
msgstr "实例数"
msgid "Visible Instance Count"
msgstr "å¯è§å®žä¾‹æ•°"
+msgid "Transform Array"
+msgstr "å˜æ¢æ•°ç»„"
+
+msgid "Transform 2D Array"
+msgstr "å˜æ¢ 2D 数组"
+
+msgid "Color Array"
+msgstr "颜色数组"
+
+msgid "Custom Data Array"
+msgstr "自定义数æ®æ•°ç»„"
+
msgid "Partition Type"
msgstr "分区类型"
@@ -5497,15 +8086,48 @@ msgstr "颜色纹ç†"
msgid "Point Count"
msgstr "点数"
+msgid "Scale Min"
+msgstr "最å°ç¼©æ”¾"
+
+msgid "Scale Max"
+msgstr "最大缩放"
+
msgid "Scale Curve"
msgstr "缩放曲线"
+msgid "Noise Strength"
+msgstr "噪声强度"
+
+msgid "Noise Speed"
+msgstr "噪声速度"
+
+msgid "Noise Speed Random"
+msgstr "噪声速度éšæœº"
+
+msgid "Influence Min"
+msgstr "最å°å½±å“"
+
+msgid "Influence Max"
+msgstr "最大影å“"
+
+msgid "Keep Velocity"
+msgstr "ä¿æŒé€Ÿåº¦"
+
+msgid "Use Scale"
+msgstr "使用缩放"
+
msgid "Rough"
msgstr "ç²—ç³™"
msgid "Absorbent"
msgstr "å¸æ”¶"
+msgid "Add UV2"
+msgstr "添加 UV2"
+
+msgid "UV2 Padding"
+msgstr "UV2 å¡«å……"
+
msgid "Subdivide Width"
msgstr "细分宽度"
@@ -5521,6 +8143,15 @@ msgstr "顶部åŠå¾„"
msgid "Bottom Radius"
msgstr "底部åŠå¾„"
+msgid "Cap Top"
+msgstr "顶盖"
+
+msgid "Cap Bottom"
+msgstr "底盖"
+
+msgid "Left to Right"
+msgstr "从左到å³"
+
msgid "Is Hemisphere"
msgstr "是å¦åŠçƒ"
@@ -5536,6 +8167,18 @@ msgstr "B"
msgid "Custom Solver Bias"
msgstr "自定义求解器åç½®"
+msgid "Target Nodepath"
+msgstr "目标节点路径"
+
+msgid "Use Gravity"
+msgstr "使用é‡åŠ›"
+
+msgid "Bone Index"
+msgstr "骨骼索引"
+
+msgid "Bone 2D Node"
+msgstr "Bone2D 节点"
+
msgid "Bind Count"
msgstr "绑定数"
@@ -5545,6 +8188,9 @@ msgstr "绑定"
msgid "Bone"
msgstr "骨骼"
+msgid "Sky Material"
+msgstr "天空æè´¨"
+
msgid "Radiance Size"
msgstr "è¾å°„大å°"
@@ -5566,6 +8212,36 @@ msgstr "太阳"
msgid "Panorama"
msgstr "全景"
+msgid "Rayleigh"
+msgstr "瑞利散射"
+
+msgid "Coefficient"
+msgstr "系数"
+
+msgid "Mie"
+msgstr "ç±³æ°æ•£å°„"
+
+msgid "Eccentricity"
+msgstr "å心率"
+
+msgid "Turbidity"
+msgstr "浊度"
+
+msgid "Ground Color"
+msgstr "地é¢é¢œè‰²"
+
+msgid "Content Margins"
+msgstr "内容边è·"
+
+msgid "Texture Margins"
+msgstr "纹ç†è¾¹è·"
+
+msgid "Expand Margins"
+msgstr "扩展边è·"
+
+msgid "Sub-Region"
+msgstr "å­åŒºåŸŸ"
+
msgid "Blend"
msgstr "æ··åˆ"
@@ -5590,8 +8266,17 @@ msgstr "å‘å‰ä¼¸é•¿"
msgid "Grow End"
msgstr "å‘åŽä¼¸é•¿"
-msgid "Image"
-msgstr "图åƒ"
+msgid "Keyword Colors"
+msgstr "关键è¯é¢œè‰²"
+
+msgid "Member Keyword Colors"
+msgstr "æˆå‘˜å…³é”®è¯é¢œè‰²"
+
+msgid "Size Override"
+msgstr "尺寸覆盖"
+
+msgid "Keep Compressed Buffer"
+msgstr "ä¿æŒåŽ‹ç¼©ç¼“冲"
msgid "Load Path"
msgstr "加载路径"
@@ -5608,6 +8293,15 @@ msgstr "基础纹ç†"
msgid "Image Size"
msgstr "图åƒå¤§å°"
+msgid "Curve X"
+msgstr "曲线 X"
+
+msgid "Curve Y"
+msgstr "曲线 Y"
+
+msgid "Curve Z"
+msgstr "曲线 Z"
+
msgid "Use HDR"
msgstr "使用 HDR"
@@ -5617,6 +8311,9 @@ msgstr "起点"
msgid "To"
msgstr "终点"
+msgid "Frames"
+msgstr "帧"
+
msgid "Current Frame"
msgstr "当å‰å¸§"
@@ -5629,24 +8326,99 @@ msgstr "æº"
msgid "Camera Is Active"
msgstr "相机是å¦æ´»åŠ¨"
+msgid "Default Base Scale"
+msgstr "默认基础缩放"
+
msgid "Default Font"
msgstr "默认字体"
+msgid "Default Font Size"
+msgstr "默认字体大å°"
+
+msgid "Tile Shape"
+msgstr "图å—形状"
+
+msgid "Tile Layout"
+msgstr "图å—布局"
+
+msgid "Tile Offset Axis"
+msgstr "图å—å移轴"
+
+msgid "Tile Size"
+msgstr "图å—大å°"
+
+msgid "UV Clipping"
+msgstr "UV è£å‰ª"
+
+msgid "Occlusion Layers"
+msgstr "é®æŒ¡å±‚"
+
+msgid "Physics Layers"
+msgstr "物ç†å±‚"
+
+msgid "Terrain Sets"
+msgstr "地形集"
+
+msgid "Custom Data Layers"
+msgstr "自定义数æ®å±‚"
+
msgid "Transpose"
msgstr "转置"
+msgid "Y Sort Origin"
+msgstr "Y 排åºåŽŸç‚¹"
+
+msgid "Terrains"
+msgstr "地形"
+
+msgid "Terrain Set"
+msgstr "地形集"
+
+msgid "Terrain"
+msgstr "地形"
+
+msgid "Miscellaneous"
+msgstr "æ‚项"
+
+msgid "Probability"
+msgstr "概率"
+
+msgid "Output Port for Preview"
+msgstr "预览输出端å£"
+
msgid "Modes"
msgstr "模å¼"
+msgid "Varyings"
+msgstr "Varying"
+
msgid "Input Name"
msgstr "输入å称"
+msgid "Parameter Name"
+msgstr "å‚æ•°å称"
+
+msgid "Qualifier"
+msgstr "修饰符"
+
+msgid "Varying Name"
+msgstr "Varying å称"
+
+msgid "Varying Type"
+msgstr "Varying 类型"
+
+msgid "Op Type"
+msgstr "æ“作类型"
+
msgid "Constant"
msgstr "常é‡"
msgid "Texture Type"
msgstr "纹ç†ç±»åž‹"
+msgid "Texture Array"
+msgstr "纹ç†æ•°ç»„"
+
msgid "Cube Map"
msgstr "立方体贴图"
@@ -5665,6 +8437,12 @@ msgstr "默认值"
msgid "Color Default"
msgstr "颜色默认"
+msgid "Use All Surfaces"
+msgstr "使用所有表é¢"
+
+msgid "Surface Index"
+msgstr "表é¢ç´¢å¼•"
+
msgid "Canvas"
msgstr "画布"
@@ -5674,18 +8452,6 @@ msgstr "导航地图"
msgid "Direct Space State"
msgstr "DirectSpaceState"
-msgid "Default Gravity"
-msgstr "默认é‡åŠ›"
-
-msgid "Default Gravity Vector"
-msgstr "默认é‡åŠ›å‘é‡"
-
-msgid "Default Cell Size"
-msgstr "默认å•å…ƒæ ¼å¤§å°"
-
-msgid "Default Edge Connection Margin"
-msgstr "默认边界连接边è·"
-
msgid "Fallback Environment"
msgstr "回退环境"
@@ -5695,9 +8461,24 @@ msgstr "场景"
msgid "Plane"
msgstr "å¹³é¢"
+msgid "Fallback values"
+msgstr "回退值"
+
+msgid "Stylebox"
+msgstr "æ ·å¼ç›’"
+
+msgid "Streams"
+msgstr "æµ"
+
+msgid "Playback Mode"
+msgstr "播放模å¼"
+
msgid "Random Pitch"
msgstr "éšæœºéŸ³é«˜"
+msgid "Random Volume Offset dB"
+msgstr "éšæœºéŸ³é‡å移 dB"
+
msgid "Buffer Length"
msgstr "缓冲长度"
@@ -5809,20 +8590,26 @@ msgstr "撤离时间(毫秒)"
msgid "Surround"
msgstr "环绕"
+msgid "Enable Input"
+msgstr "å¯ç”¨è¾“å…¥"
+
msgid "Output Latency"
msgstr "输出延迟"
msgid "Channel Disable Threshold dB"
msgstr "声é“ç¦ç”¨é˜ˆå€¼ dB"
+msgid "Video"
+msgstr "视频"
+
msgid "Video Delay Compensation (ms)"
msgstr "视频延迟补å¿ï¼ˆæ¯«ç§’)"
msgid "Bus Count"
msgstr "总线数é‡"
-msgid "Capture Device"
-msgstr "æ•èŽ·è®¾å¤‡"
+msgid "Playback Speed Scale"
+msgstr "播放速度缩放"
msgid "Feed"
msgstr "æº"
@@ -5830,11 +8617,56 @@ msgstr "æº"
msgid "Is Active"
msgstr "是å¦æ¿€æ´»"
-msgid "Sleep Threshold Linear"
-msgstr "ç¡çœ çº¿é€Ÿåº¦é˜ˆå€¼"
+msgid "Movie Writer"
+msgstr "Movie Writer"
-msgid "Sleep Threshold Angular"
-msgstr "ç¡çœ è§’速度阈值"
+msgid "Movie File"
+msgstr "电影文件"
+
+msgid "Disable V-Sync"
+msgstr "ç¦ç”¨åž‚ç›´åŒæ­¥"
+
+msgid "Pathfinding Algorithm"
+msgstr "寻路算法"
+
+msgid "Path Postprocessing"
+msgstr "路径åŽå¤„ç†"
+
+msgid "Metadata Flags"
+msgstr "元数æ®æ ‡å¿—"
+
+msgid "Path Types"
+msgstr "路径类型"
+
+msgid "Path Rids"
+msgstr "路径 RID"
+
+msgid "Path Owner IDs"
+msgstr "路径所有者 ID"
+
+msgid "Default Cell Size"
+msgstr "默认å•å…ƒæ ¼å¤§å°"
+
+msgid "Default Edge Connection Margin"
+msgstr "默认边界连接边è·"
+
+msgid "Default Link Connection Radius"
+msgstr "默认链接连接边è·"
+
+msgid "Edge Connection Color"
+msgstr "边界连接颜色"
+
+msgid "Geometry Edge Color"
+msgstr "几何体边颜色"
+
+msgid "Geometry Face Color"
+msgstr "几何体é¢é¢œè‰²"
+
+msgid "Geometry Edge Disabled Color"
+msgstr "几何体边ç¦ç”¨é¢œè‰²"
+
+msgid "Geometry Face Disabled Color"
+msgstr "几何体é¢ç¦ç”¨é¢œè‰²"
msgid "Inverse Mass"
msgstr "逆转质é‡"
@@ -5863,12 +8695,30 @@ msgstr "与区域碰撞"
msgid "Shape RID"
msgstr "形状 RID"
+msgid "Exclude Objects"
+msgstr "排除对象"
+
+msgid "Default Gravity"
+msgstr "默认é‡åŠ›"
+
+msgid "Default Gravity Vector"
+msgstr "默认é‡åŠ›å‘é‡"
+
+msgid "Sleep Threshold Linear"
+msgstr "ç¡çœ çº¿é€Ÿåº¦é˜ˆå€¼"
+
+msgid "Sleep Threshold Angular"
+msgstr "ç¡çœ è§’速度阈值"
+
msgid "Physics Engine"
msgstr "物ç†å¼•æ“Ž"
msgid "Principal Inertia Axes"
msgstr "主惯性轴"
+msgid "Max Collisions"
+msgstr "最大碰撞数"
+
msgid "Vertex"
msgstr "顶点"
@@ -5884,29 +8734,50 @@ msgstr "剔除"
msgid "Unshaded"
msgstr "ä¸ç€è‰²"
+msgid "Wireframe"
+msgstr "线框"
+
+msgid "Skip Vertex Transform"
+msgstr "跳过顶点å˜æ¢"
+
+msgid "World Vertex Coords"
+msgstr "世界顶点åæ ‡"
+
msgid "Ensure Correct Normals"
msgstr "ç¡®ä¿æ­£ç¡®æ³•çº¿"
+msgid "Shadows Disabled"
+msgstr "ç¦ç”¨é˜´å½±"
+
+msgid "Ambient Light Disabled"
+msgstr "ç¦ç”¨çŽ¯å¢ƒå…‰"
+
msgid "Vertex Lighting"
msgstr "顶点光照"
-msgid "Render Loop Enabled"
-msgstr "å¯ç”¨æ¸²æŸ“循环"
+msgid "Particle Trails"
+msgstr "ç²’å­å°¾è¿¹"
-msgid "VRAM Compression"
-msgstr "VRAM 压缩"
+msgid "Disable Velocity"
+msgstr "ç¦ç”¨é€Ÿåº¦"
-msgid "Import BPTC"
-msgstr "导入 BPTC"
+msgid "Keep Data"
+msgstr "ä¿ç•™æ•°æ®"
-msgid "Import S3TC"
-msgstr "导入 S3TC"
+msgid "Use Half Res Pass"
+msgstr "使用二分之一分辨率阶段"
-msgid "Import ETC"
-msgstr "导入 ETC"
+msgid "Use Quarter Res Pass"
+msgstr "使用四分之一分辨率阶段"
-msgid "Import ETC2"
-msgstr "导入 ETC2"
+msgid "Disable Fog"
+msgstr "ç¦ç”¨é›¾"
+
+msgid "Render Loop Enabled"
+msgstr "å¯ç”¨æ¸²æŸ“循环"
+
+msgid "VRAM Compression"
+msgstr "VRAM 压缩"
msgid "Lossless Compression"
msgstr "æ— æŸåŽ‹ç¼©"
@@ -5914,27 +8785,93 @@ msgstr "æ— æŸåŽ‹ç¼©"
msgid "Force PNG"
msgstr "强制 PNG"
+msgid "Use Physical Light Units"
+msgstr "使用物ç†å…‰çº¿å•ä½"
+
+msgid "Soft Shadow Filter Quality"
+msgstr "柔和阴影过滤器质é‡"
+
msgid "Shadow Atlas"
msgstr "阴影图集"
+msgid "Shader Compiler"
+msgstr "ç€è‰²å™¨ç¼–译器"
+
+msgid "Shader Cache"
+msgstr "ç€è‰²å™¨ç¼“å­˜"
+
+msgid "Use Zstd Compression"
+msgstr "使用 Zstd 压缩"
+
+msgid "Strip Debug"
+msgstr "剥离调试"
+
msgid "Reflections"
msgstr "åå°„"
+msgid "Sky Reflections"
+msgstr "天空åå°„"
+
msgid "Texture Array Reflections"
msgstr "纹ç†æ•°ç»„åå°„"
+msgid "GGX Samples"
+msgstr "GGX 样本"
+
+msgid "Fast Filter High Quality"
+msgstr "高质é‡å¿«é€Ÿè¿‡æ»¤å™¨"
+
+msgid "Reflection Atlas"
+msgstr "å射图集"
+
+msgid "Reflection Size"
+msgstr "å射大å°"
+
+msgid "Reflection Count"
+msgstr "åå°„æ•°é‡"
+
+msgid "GI"
+msgstr "全局光"
+
+msgid "Use Half Resolution"
+msgstr "åŠåˆ†è¾¨çŽ‡"
+
msgid "Overrides"
msgstr "é‡å†™"
msgid "Force Vertex Shading"
msgstr "强制顶点ç€è‰²"
+msgid "Force Lambert over Burley"
+msgstr "强制 Lambert è€Œéž Burley"
+
msgid "Depth Prepass"
msgstr "深度å‰ç½®é˜¶æ®µ"
+msgid "Disable for Vendors"
+msgstr "针对厂商ç¦ç”¨"
+
+msgid "Default Filters"
+msgstr "默认过滤器"
+
msgid "Use Nearest Mipmap Filter"
msgstr "使用最近 Mipmap 过滤"
+msgid "Depth of Field"
+msgstr "景深"
+
+msgid "Depth of Field Use Jitter"
+msgstr "景深使用抖动"
+
+msgid "Occlusion Rays per Thread"
+msgstr "æ¯çº¿ç¨‹é®æŒ¡å°„线"
+
+msgid "Upscale Mode"
+msgstr "放大模å¼"
+
+msgid "Global Shader Variables"
+msgstr "全局ç€è‰²å™¨å˜é‡"
+
msgid "Buffer Size"
msgstr "缓冲区大å°"
@@ -5944,12 +8881,21 @@ msgstr "ç€è‰²å™¨"
msgid "Is Primary"
msgstr "是å¦ä¸»è¦"
+msgid "Play Area Mode"
+msgstr "游玩区模å¼"
+
msgid "AR"
msgstr "AR"
msgid "Is Anchor Detection Enabled"
msgstr "锚点检测是å¦å¯ç”¨"
+msgid "Has Tracking Data"
+msgstr "有跟踪数æ®"
+
+msgid "Tracking Confidence"
+msgstr "追踪置信度"
+
msgid "Primary Interface"
msgstr "主接å£"
diff --git a/editor/translations/properties/zh_TW.po b/editor/translations/properties/zh_TW.po
index adadc3a969..93130d6ec7 100644
--- a/editor/translations/properties/zh_TW.po
+++ b/editor/translations/properties/zh_TW.po
@@ -44,16 +44,16 @@ 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-01-14 10:06+0000\n"
-"Last-Translator: Edison Lee <edisonlee@edisonlee55.com>\n"
+"PO-Revision-Date: 2023-02-10 10:44+0000\n"
+"Last-Translator: abcabcc <xmmandxpp@outlook.com>\n"
"Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/"
-"godot-engine/godot/zh_Hant/>\n"
+"godot-engine/godot-properties/zh_Hant/>\n"
"Language: zh_TW\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.15.1-dev\n"
+"X-Generator: Weblate 4.16-dev\n"
msgid "Application"
msgstr "應用"
@@ -64,9 +64,15 @@ msgstr "設置"
msgid "Name"
msgstr "å稱"
+msgid "Description"
+msgstr "說明"
+
msgid "Run"
msgstr "執行"
+msgid "Main Scene"
+msgstr "主場景"
+
msgid "Disable stdout"
msgstr "åœç”¨æ¨™æº–輸出"
@@ -94,18 +100,27 @@ msgstr "視窗"
msgid "Size"
msgstr "大å°"
+msgid "Mode"
+msgstr "模å¼"
+
msgid "Resizable"
msgstr "å¯èª¿æ•´å¤§å°çš„"
msgid "Borderless"
msgstr "無邊框"
+msgid "No Focus"
+msgstr "關閉èšç„¦"
+
msgid "Energy Saving"
msgstr "節能"
msgid "Keep Screen On"
msgstr "ä¿æŒèž¢å¹•é–‹å•Ÿ"
+msgid "Audio"
+msgstr "音訊"
+
msgid "Editor"
msgstr "編輯器"
@@ -127,6 +142,9 @@ msgstr "åµéŒ¯"
msgid "Settings"
msgstr "設定"
+msgid "Compression"
+msgstr "壓縮"
+
msgid "Crash Handler"
msgstr "當機處ç†å¸¸å¼"
@@ -136,6 +154,21 @@ msgstr "訊æ¯"
msgid "Rendering"
msgstr "算繪"
+msgid "Limits"
+msgstr "é™åˆ¶"
+
+msgid "Force Right to Left Layout Direction"
+msgstr "強制畫é¢ä½ˆå±€ç”±å³è‡³å·¦"
+
+msgid "GUI"
+msgstr "圖形使用者介é¢"
+
+msgid "Vulkan"
+msgstr "Vulkan"
+
+msgid "Max Descriptors per Pool"
+msgstr "å„池最大æ述符數"
+
msgid "Low Processor Usage Mode"
msgstr "低處ç†å™¨ä½¿ç”¨çŽ‡æ¨¡å¼"
@@ -145,6 +178,9 @@ msgstr "低處ç†å™¨ä½¿ç”¨çŽ‡æ¨¡å¼ç¡çœ ï¼ˆå¾®ç§’)"
msgid "Print Error Messages"
msgstr "顯示錯誤訊æ¯"
+msgid "Physics Ticks per Second"
+msgstr "æ¯ç§’物ç†é€±æœŸæ•¸"
+
msgid "Time Scale"
msgstr "時間縮放"
@@ -160,9 +196,15 @@ msgstr "使用累ç©è¼¸å…¥"
msgid "Device"
msgstr "è£ç½®"
+msgid "Command or Control Autoremap"
+msgstr "自動é‡å°æ˜  Command å’Œ Control"
+
msgid "Pressed"
msgstr "按下"
+msgid "Keycode"
+msgstr "éµç¢¼"
+
msgid "Unicode"
msgstr "Unicode"
@@ -208,6 +250,9 @@ msgstr "軸數值"
msgid "Index"
msgstr "索引"
+msgid "Double Tap"
+msgstr "雙擊"
+
msgid "Action"
msgstr "æ“作"
@@ -235,6 +280,12 @@ msgstr "控制器值"
msgid "Big Endian"
msgstr "大端"
+msgid "Network"
+msgstr "網路"
+
+msgid "Page Size"
+msgstr "分é å¤§å°"
+
msgid "Blocking Mode Enabled"
msgstr "啟用阻塞模å¼"
@@ -271,15 +322,15 @@ msgstr "路徑"
msgid "Data Array"
msgstr "資料陣列"
-msgid "Blocking Handshake"
-msgstr "åœç”¨æ¡æ‰‹"
-
msgid "Max Pending Connections"
msgstr "最大等待連接數"
msgid "Offset"
msgstr "å移"
+msgid "Cell Size"
+msgstr "單元格大å°"
+
msgid "Seed"
msgstr "種å­"
@@ -289,6 +340,15 @@ msgstr "狀態"
msgid "Source Code"
msgstr "原始碼"
+msgid "Worker Pool"
+msgstr "工作池"
+
+msgid "Use System Threads for Low Priority Tasks"
+msgstr "將系統執行緒用於低優先度任務"
+
+msgid "Low Priority Thread Ratio"
+msgstr "低優先度執行緒的比率"
+
msgid "Locale"
msgstr "地å€"
@@ -298,6 +358,9 @@ msgstr "測試"
msgid "Fallback"
msgstr "後備語言"
+msgid "Double Vowels"
+msgstr "é‡è¤‡æ¯éŸ³"
+
msgid "Prefix"
msgstr "å‰ç¶´"
@@ -343,15 +406,6 @@ msgstr "å‹•ç•«"
msgid "Easing"
msgstr "緩入緩出"
-msgid "Interface"
-msgstr "ç•Œé¢"
-
-msgid "Editors"
-msgstr "編輯器"
-
-msgid "Network"
-msgstr "網路"
-
msgid "Remote Port"
msgstr "é ç«¯é˜œ"
@@ -421,8 +475,8 @@ msgstr "已勾é¸"
msgid "Keying"
msgstr "輸入"
-msgid "Main Scene"
-msgstr "主場景"
+msgid "Interface"
+msgstr "ç•Œé¢"
msgid "Show Update Spinner"
msgstr "顯示更新旋轉圖"
@@ -484,6 +538,12 @@ msgstr "編輯器語言"
msgid "Display Scale"
msgstr "顯示縮放"
+msgid "Enable Pseudolocalization"
+msgstr "啟用模擬翻譯模å¼"
+
+msgid "Use Embedded Menu"
+msgstr "使用嵌入å¼é¸å–®"
+
msgid "Custom Display Scale"
msgstr "自訂顯示縮放"
@@ -493,6 +553,12 @@ msgstr "主è¦å­—體大å°"
msgid "Code Font Size"
msgstr "程å¼ç¢¼å­—體大å°"
+msgid "Code Font Contextual Ligatures"
+msgstr "程å¼ç¢¼å­—é«”å‰å¾Œåˆå­—"
+
+msgid "Code Font Custom OpenType Features"
+msgstr "程å¼ç¢¼å­—體自定義 OpenType 功能"
+
msgid "Font Hinting"
msgstr "字體微調"
@@ -506,19 +572,28 @@ msgid "Code Font"
msgstr "程å¼ç¢¼å­—é«”"
msgid "Low Processor Mode Sleep (µsec)"
-msgstr "低處ç†å™¨ç¡çœ æ¨¡å¼ï¼ˆå¾®ç§’)"
+msgstr "處ç†å™¨ç¯€èƒ½æ¨¡å¼ç¡çœ  (微秒)"
msgid "Unfocused Low Processor Mode Sleep (µsec)"
-msgstr "未èšç„¦ä½Žè™•ç†å™¨ç¡çœ æ¨¡å¼ï¼ˆå¾®ç§’)"
+msgstr "未èšç„¦æ™‚處ç†å™¨ç¯€èƒ½æ¨¡å¼ç¡çœ  (微秒)"
msgid "Separate Distraction Mode"
-msgstr "ç¨ç«‹å°ˆæ³¨æ¨¡å¼"
+msgstr "將專注模å¼åˆ†é›¢"
msgid "Automatically Open Screenshots"
msgstr "自動開啟截圖"
+msgid "Single Window Mode"
+msgstr "單視窗模å¼"
+
msgid "Mouse Extra Buttons Navigate History"
-msgstr "使用é¡å¤–滑鼠按éµæŸ¥çœ‹æ­·å²"
+msgstr "使用追加滑鼠按éµä»¥æŸ¥çœ‹æ­·å²ç´€éŒ„"
+
+msgid "Save Each Scene on Quit"
+msgstr "æ¯æ¬¡é€€å‡ºæ™‚儲存場景"
+
+msgid "Accept Dialog Cancel OK Buttons"
+msgstr "接å—å°è©±æ¡†çš„å–消/確定按鈕"
msgid "Theme"
msgstr "主題"
@@ -721,6 +796,9 @@ msgstr "幫助æºå­—體大å°"
msgid "Help Title Font Size"
msgstr "幫助標題字體大å°"
+msgid "Editors"
+msgstr "編輯器"
+
msgid "Grid Map"
msgstr "網格地圖"
@@ -1129,6 +1207,9 @@ msgstr "輪廓尺寸"
msgid "Variation"
msgstr "變化"
+msgid "Transform"
+msgstr "變æ›"
+
msgid "Collada"
msgstr "Collada"
@@ -1153,15 +1234,9 @@ msgstr "建立自"
msgid "Delimiter"
msgstr "分隔符號"
-msgid "Mode"
-msgstr "模å¼"
-
msgid "Lossy Quality"
msgstr "低å“質"
-msgid "BPTC LDR"
-msgstr "BPTC LDR"
-
msgid "Mipmaps"
msgstr "Mipmap"
@@ -1175,7 +1250,7 @@ msgid "Vertical"
msgstr "åž‚ç›´"
msgid "Layout"
-msgstr "ç•«é¢é…ç½®"
+msgstr "é…置;畫é¢ä½ˆå±€"
msgid "Amount"
msgstr "數é‡"
@@ -1216,12 +1291,6 @@ msgstr "最佳化器"
msgid "Max Angular Error"
msgstr "最大角度誤差"
-msgid "Compression"
-msgstr "壓縮"
-
-msgid "Page Size"
-msgstr "分é å¤§å°"
-
msgid "Nodes"
msgstr "節點"
@@ -1327,6 +1396,9 @@ msgstr "使用執行緒"
msgid "Available URLs"
msgstr "å¯ç”¨ URL"
+msgid "Unset"
+msgstr "未設置"
+
msgid "Error"
msgstr "錯誤"
@@ -1444,9 +1516,6 @@ msgstr "執行緒"
msgid "Thread Model"
msgstr "執行緒模型"
-msgid "Audio"
-msgstr "音訊"
-
msgid "Handheld"
msgstr "攜帶型"
@@ -1477,15 +1546,18 @@ msgstr "iOS"
msgid "Hide Home Indicator"
msgstr "éš±è— Home æ©«æ¢"
+msgid "Input Devices"
+msgstr "輸入è£ç½®"
+
+msgid "Pointing"
+msgstr "指點"
+
msgid "Boot Splash"
msgstr "å•Ÿå‹•ç•«é¢"
msgid "BG Color"
msgstr "背景é¡è‰²"
-msgid "Input Devices"
-msgstr "輸入è£ç½®"
-
msgid "Environment"
msgstr "環境"
@@ -1495,21 +1567,24 @@ msgstr "é è¨­æ¸…除é¡è‰²"
msgid "Show Image"
msgstr "顯示圖åƒ"
+msgid "Image"
+msgstr "圖åƒ"
+
msgid "Fullsize"
msgstr "全尺寸"
msgid "Use Filter"
msgstr "使用篩é¸å™¨"
+msgid "Icon"
+msgstr "圖示"
+
msgid "Buffering"
msgstr "ç·©è¡"
msgid "Agile Event Flushing"
msgstr "æ•æ·äº‹ä»¶åˆ·æ–°"
-msgid "Pointing"
-msgstr "指點"
-
msgid "Emulate Touch From Mouse"
msgstr "以滑鼠模擬觸控"
@@ -1531,12 +1606,15 @@ msgstr "專案"
msgid "Main Loop Type"
msgstr "主迴圈類型"
+msgid "Stretch"
+msgstr "伸縮"
+
+msgid "Aspect"
+msgstr "æ–¹ä½"
+
msgid "Auto Accept Quit"
msgstr "自動接å—退出"
-msgid "GUI"
-msgstr "圖形使用者介é¢"
-
msgid "Fonts"
msgstr "å­—é«”"
@@ -1855,9 +1933,6 @@ msgstr "IGD 控制 URL"
msgid "IGD Our Addr"
msgstr "IGD 我方ä½å€"
-msgid "Limits"
-msgstr "é™åˆ¶"
-
msgid "WebRTC"
msgstr "WebRTC"
@@ -1903,9 +1978,6 @@ msgstr "自é©æ‡‰å‰æ™¯ 432 X 432"
msgid "Adaptive Background 432 X 432"
msgstr "自é©æ‡‰èƒŒæ™¯ 432 X 432"
-msgid "Use Custom Build"
-msgstr "使用自定義建構"
-
msgid "Min SDK"
msgstr "æœ€å° SDK"
@@ -1972,9 +2044,6 @@ msgstr "相機使用æè¿°"
msgid "Microphone Usage Description"
msgstr "麥克風使用æè¿°"
-msgid "Icon"
-msgstr "圖示"
-
msgid "Codesign"
msgstr "程å¼ç¢¼ç°½ç« "
@@ -2047,9 +2116,6 @@ msgstr "Apple 團隊 ID"
msgid "Short Name"
msgstr "短å稱"
-msgid "Description"
-msgstr "說明"
-
msgid "Publisher Display Name"
msgstr "發布者顯示å稱"
@@ -2161,9 +2227,6 @@ msgstr "路徑最大è·é›¢"
msgid "Max Speed"
msgstr "最大速度"
-msgid "Transform"
-msgstr "變æ›"
-
msgid "Rotation Degrees"
msgstr "旋轉角度"
@@ -2341,15 +2404,15 @@ msgstr "隨機延é²"
msgid "Xfade Time"
msgstr "Xfade 時間"
-msgid "Reset"
-msgstr "é‡è¨­"
-
msgid "Add Amount"
msgstr "增加數é‡"
msgid "Blend Amount"
msgstr "æ··åˆé‡"
+msgid "Reset"
+msgstr "é‡è¨­"
+
msgid "Switch"
msgstr "切æ›"
@@ -2431,9 +2494,6 @@ msgstr "分é å¤§å°"
msgid "Split Offset"
msgstr "拆分å移"
-msgid "Stretch"
-msgstr "伸縮"
-
msgid "Current Tab"
msgstr "當å‰åˆ†é "
@@ -2494,9 +2554,6 @@ msgstr "最å°å°ºå¯¸"
msgid "Max Size"
msgstr "最大大å°"
-msgid "Aspect"
-msgstr "æ–¹ä½"
-
msgid "Format"
msgstr "æ ¼å¼"
@@ -2680,9 +2737,6 @@ msgstr "å³ä¸‹"
msgid "Bottom Left"
msgstr "左下"
-msgid "Image"
-msgstr "圖åƒ"
-
msgid "Image Size"
msgstr "圖片大å°"
@@ -2698,9 +2752,6 @@ msgstr "常數"
msgid "Function"
msgstr "函å¼"
-msgid "Default Edge Connection Margin"
-msgstr "é è¨­é‚Šç·£é€£æŽ¥é‚Šè·"
-
msgid "Plane"
msgstr "å¹³é¢"
@@ -2719,11 +2770,8 @@ msgstr "FFT 大å°"
msgid "Time Pullout (ms)"
msgstr "撤離時間(毫秒)"
-msgid "Sleep Threshold Linear"
-msgstr "線性ç¡çœ é€Ÿåº¦é–¾å€¼"
-
-msgid "Sleep Threshold Angular"
-msgstr "ç¡çœ è§’速度閾值"
+msgid "Default Edge Connection Margin"
+msgstr "é è¨­é‚Šç·£é€£æŽ¥é‚Šè·"
msgid "Inverse Mass"
msgstr "逆質é‡"
@@ -2752,6 +2800,12 @@ msgstr "å€åŸŸé–“碰撞"
msgid "Shape RID"
msgstr "形狀RID"
+msgid "Sleep Threshold Linear"
+msgstr "線性ç¡çœ é€Ÿåº¦é–¾å€¼"
+
+msgid "Sleep Threshold Angular"
+msgstr "ç¡çœ è§’速度閾值"
+
msgid "Physics Engine"
msgstr "物ç†å¼•æ“Ž"
@@ -2773,18 +2827,6 @@ msgstr "啟用算繪迴圈"
msgid "VRAM Compression"
msgstr "VRAM壓縮"
-msgid "Import BPTC"
-msgstr "匯入BPTC"
-
-msgid "Import S3TC"
-msgstr "匯入S3TC"
-
-msgid "Import ETC"
-msgstr "匯入ETC"
-
-msgid "Import ETC2"
-msgstr "匯入ETC2"
-
msgid "Force PNG"
msgstr "強制 PNG"
diff --git a/main/main.cpp b/main/main.cpp
index 3aa9a44a21..ae3a6d2a94 100644
--- a/main/main.cpp
+++ b/main/main.cpp
@@ -72,6 +72,7 @@
#include "servers/movie_writer/movie_writer_mjpeg.h"
#include "servers/navigation_server_2d.h"
#include "servers/navigation_server_3d.h"
+#include "servers/navigation_server_3d_dummy.h"
#include "servers/physics_server_2d.h"
#include "servers/physics_server_3d.h"
#include "servers/register_server_types.h"
@@ -93,13 +94,17 @@
#include "editor/editor_settings.h"
#include "editor/editor_translation.h"
#include "editor/progress_dialog.h"
-#include "editor/project_converter_3_to_4.h"
#include "editor/project_manager.h"
#include "editor/register_editor_types.h"
+
#ifndef NO_EDITOR_SPLASH
#include "main/splash_editor.gen.h"
#endif
-#endif
+
+#ifndef DISABLE_DEPRECATED
+#include "editor/project_converter_3_to_4.h"
+#endif // DISABLE_DEPRECATED
+#endif // TOOLS_ENABLED
#include "modules/modules_enabled.gen.h" // For mono.
@@ -163,8 +168,10 @@ static OS::ProcessID editor_pid = 0;
static bool found_project = false;
static bool auto_build_solutions = false;
static String debug_server_uri;
+#ifndef DISABLE_DEPRECATED
static int converter_max_kb_file = 4 * 1024; // 4MB
static int converter_max_line_length = 100000;
+#endif // DISABLE_DEPRECATED
HashMap<Main::CLIScope, Vector<String>> forwardable_cli_arguments;
#endif
@@ -278,8 +285,21 @@ void finalize_display() {
void initialize_navigation_server() {
ERR_FAIL_COND(navigation_server_3d != nullptr);
+ // Init 3D Navigation Server
navigation_server_3d = NavigationServer3DManager::new_default_server();
+
+ // Fall back to dummy if no default server has been registered.
+ if (!navigation_server_3d) {
+ WARN_PRINT_ONCE("No NavigationServer3D implementation has been registered! Falling back to a dummy implementation: navigation features will be unavailable.");
+ navigation_server_3d = memnew(NavigationServer3DDummy);
+ }
+
+ // Should be impossible, but make sure it's not null.
+ ERR_FAIL_NULL_MSG(navigation_server_3d, "Failed to initialize NavigationServer3D.");
+
+ // Init 2D Navigation Server
navigation_server_2d = memnew(NavigationServer2D);
+ ERR_FAIL_NULL_MSG(navigation_server_2d, "Failed to initialize NavigationServer2D.");
}
void finalize_navigation_server() {
@@ -423,10 +443,12 @@ void Main::print_help(const char *p_binary) {
OS::get_singleton()->print(" The target directory must exist.\n");
OS::get_singleton()->print(" --export-debug <preset> <path> Export the project in debug mode using the given preset and output path. See --export-release description for other considerations.\n");
OS::get_singleton()->print(" --export-pack <preset> <path> Export the project data only using the given preset and output path. The <path> extension determines whether it will be in PCK or ZIP format.\n");
+#ifndef DISABLE_DEPRECATED
OS::get_singleton()->print(" --convert-3to4 [<max_file_kb>] [<max_line_size>]\n");
OS::get_singleton()->print(" Converts project from Godot 3.x to Godot 4.x.\n");
OS::get_singleton()->print(" --validate-conversion-3to4 [<max_file_kb>] [<max_line_size>]\n");
OS::get_singleton()->print(" Shows what elements will be renamed when converting project from Godot 3.x to Godot 4.x.\n");
+#endif // DISABLE_DEPRECATED
OS::get_singleton()->print(" --doctool [<path>] Dump the engine API reference to the given <path> (defaults to current dir) in XML format, merging if existing files are found.\n");
OS::get_singleton()->print(" --no-docbase Disallow dumping the base types (used with --doctool).\n");
OS::get_singleton()->print(" --build-solutions Build the scripting solutions (e.g. for C# projects). Implies --editor and requires a valid project to edit.\n");
@@ -1108,6 +1130,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
editor = true;
cmdline_tool = true;
main_args.push_back(I->get());
+#ifndef DISABLE_DEPRECATED
} else if (I->get() == "--convert-3to4") {
// Actually handling is done in start().
cmdline_tool = true;
@@ -1138,6 +1161,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
}
}
}
+#endif // DISABLE_DEPRECATED
} else if (I->get() == "--doctool") {
// Actually handling is done in start().
cmdline_tool = true;
@@ -1147,7 +1171,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
audio_driver = NULL_AUDIO_DRIVER;
display_driver = NULL_DISPLAY_DRIVER;
main_args.push_back(I->get());
-#endif
+#endif // TOOLS_ENABLED
} else if (I->get() == "--path") { // set path of project to start or edit
if (I->next()) {
@@ -1819,7 +1843,6 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
GLOBAL_DEF("display/window/ios/hide_home_indicator", true);
GLOBAL_DEF("display/window/ios/hide_status_bar", true);
GLOBAL_DEF("display/window/ios/suppress_ui_gesture", true);
- GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "input_devices/pointing/ios/touch_delay", PROPERTY_HINT_RANGE, "0,1,0.001"), 0.15);
// XR project settings.
GLOBAL_DEF_RST_BASIC("xr/openxr/enabled", false);
@@ -2370,7 +2393,7 @@ bool Main::start() {
bool converting_project = false;
bool validating_converting_project = false;
#endif // DISABLE_DEPRECATED
-#endif
+#endif // TOOLS_ENABLED
main_timer_sync.init(OS::get_singleton()->get_ticks_usec());
List<String> args = OS::get_singleton()->get_cmdline_args();
@@ -2395,7 +2418,7 @@ bool Main::start() {
editor = true;
} else if (args[i] == "-p" || args[i] == "--project-manager") {
project_manager = true;
-#endif
+#endif // TOOLS_ENABLED
} else if (args[i].length() && args[i][0] != '-' && positional_arg.is_empty()) {
positional_arg = args[i];
@@ -2553,18 +2576,22 @@ bool Main::start() {
#ifndef DISABLE_DEPRECATED
if (converting_project) {
- int exit_code = ProjectConverter3To4(converter_max_kb_file, converter_max_line_length).convert();
- OS::get_singleton()->set_exit_code(exit_code);
+ int ret = ProjectConverter3To4(converter_max_kb_file, converter_max_line_length).convert();
+ if (ret) {
+ OS::get_singleton()->set_exit_code(EXIT_SUCCESS);
+ }
return false;
}
if (validating_converting_project) {
- int exit_code = ProjectConverter3To4(converter_max_kb_file, converter_max_line_length).validate_conversion();
- OS::get_singleton()->set_exit_code(exit_code);
+ bool ret = ProjectConverter3To4(converter_max_kb_file, converter_max_line_length).validate_conversion();
+ if (ret) {
+ OS::get_singleton()->set_exit_code(EXIT_SUCCESS);
+ }
return false;
}
#endif // DISABLE_DEPRECATED
-#endif
+#endif // TOOLS_ENABLED
if (script.is_empty() && game_path.is_empty() && String(GLOBAL_GET("application/run/main_scene")) != "") {
game_path = GLOBAL_GET("application/run/main_scene");
diff --git a/modules/csg/csg_shape.cpp b/modules/csg/csg_shape.cpp
index 13c7a8202c..afb8e62eea 100644
--- a/modules/csg/csg_shape.cpp
+++ b/modules/csg/csg_shape.cpp
@@ -1255,6 +1255,30 @@ Vector3 CSGBox3D::get_size() const {
return size;
}
+#ifndef DISABLE_DEPRECATED
+// Kept for compatibility from 3.x to 4.0.
+bool CSGBox3D::_set(const StringName &p_name, const Variant &p_value) {
+ if (p_name == "width") {
+ size.x = p_value;
+ _make_dirty();
+ update_gizmos();
+ return true;
+ } else if (p_name == "height") {
+ size.y = p_value;
+ _make_dirty();
+ update_gizmos();
+ return true;
+ } else if (p_name == "depth") {
+ size.z = p_value;
+ _make_dirty();
+ update_gizmos();
+ return true;
+ } else {
+ return false;
+ }
+}
+#endif
+
void CSGBox3D::set_material(const Ref<Material> &p_material) {
material = p_material;
_make_dirty();
diff --git a/modules/csg/csg_shape.h b/modules/csg/csg_shape.h
index 9012c37679..c244107bfb 100644
--- a/modules/csg/csg_shape.h
+++ b/modules/csg/csg_shape.h
@@ -248,6 +248,10 @@ class CSGBox3D : public CSGPrimitive3D {
protected:
static void _bind_methods();
+#ifndef DISABLE_DEPRECATED
+ // Kept for compatibility from 3.x to 4.0.
+ bool _set(const StringName &p_name, const Variant &p_value);
+#endif
public:
void set_size(const Vector3 &p_size);
diff --git a/modules/gdscript/doc_classes/@GDScript.xml b/modules/gdscript/doc_classes/@GDScript.xml
index 923b2fe30d..0b7e4e50e6 100644
--- a/modules/gdscript/doc_classes/@GDScript.xml
+++ b/modules/gdscript/doc_classes/@GDScript.xml
@@ -4,7 +4,7 @@
Built-in GDScript functions.
</brief_description>
<description>
- A list of GDScript-specific utility functions accessed in any script.
+ A list of GDScript-specific utility functions and annotations accessible from any script.
For the list of the global functions and constants see [@GlobalScope].
</description>
<tutorials>
@@ -20,7 +20,7 @@
<description>
Returns a [Color] constructed from red ([param r8]), green ([param g8]), blue ([param b8]), and optionally alpha ([param a8]) integer channels, each divided by [code]255.0[/code] for their final value.
[codeblock]
- var red = Color8(255, 0, 0) # Same as Color(1, 0, 0)
+ var red = Color8(255, 0, 0) # Same as Color(1, 0, 0).
var dark_blue = Color8(0, 0, 51) # Same as Color(0, 0, 0.2).
var my_color = Color8(306, 255, 0, 102) # Same as Color(1.2, 1, 0, 0.4).
[/codeblock]
@@ -37,10 +37,10 @@
[codeblock]
# Imagine we always want speed to be between 0 and 20.
var speed = -10
- assert(speed &lt; 20) # True, the program will continue
- assert(speed &gt;= 0) # False, the program will stop
- assert(speed &gt;= 0 and speed &lt; 20) # You can also combine the two conditional statements in one check
- assert(speed &lt; 20, "the speed limit is 20") # Show a message
+ assert(speed &lt; 20) # True, the program will continue.
+ assert(speed &gt;= 0) # False, the program will stop.
+ assert(speed &gt;= 0 and speed &lt; 20) # You can also combine the two conditional statements in one check.
+ assert(speed &lt; 20, "the speed limit is 20") # Show a message.
[/codeblock]
</description>
</method>
@@ -140,7 +140,7 @@
<param index="0" name="path" type="String" />
<description>
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].
- [b]Note:[/b] Resource paths can be obtained by right-clicking on a resource in the FileSystem dock and choosing "Copy Path" or by dragging the file from the FileSystem dock into the script.
+ [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.
[codeblock]
# Load a scene called "main" located in the root of the project directory and cache it in a variable.
var main = load("res://main.tscn") # main will contain a PackedScene resource.
@@ -155,7 +155,7 @@
<param index="0" name="path" type="String" />
<description>
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 requires [param path] to be a constant [String]. If you want to load a resource from a dynamic/variable path, use [method load].
- [b]Note:[/b] Resource paths can be obtained by right clicking on a resource in the Assets Panel and choosing "Copy Path" or by dragging the file from the FileSystem dock into the script.
+ [b]Note:[/b] Resource paths can be obtained by right-clicking on a resource in the Assets Panel and choosing "Copy Path", or by dragging the file from the FileSystem dock into the current script.
[codeblock]
# Create instance of a scene.
var diamond = preload("res://diamond.tscn").instantiate()
@@ -259,10 +259,12 @@
<annotation name="@export">
<return type="void" />
<description>
- Mark the following property as exported (editable in the Inspector dock and saved to disk). To control the type of the exported property use the type hint notation.
+ Mark the following property as exported (editable in the Inspector dock and saved to disk). To control the type of the exported property, use the type hint notation.
[codeblock]
+ @export var string = ""
@export var int_number = 5
@export var float_number: float = 5
+ @export var image : Image
[/codeblock]
</description>
</annotation>
@@ -273,20 +275,20 @@
Define a new category for the following exported properties. This helps to organize properties in the Inspector dock.
See also [constant PROPERTY_USAGE_CATEGORY].
[codeblock]
- @export_category("My Properties")
- @export var number = 3
- @export var string = ""
+ @export_category("Statistics")
+ @export var hp = 30
+ @export var speed = 1.25
[/codeblock]
- [b]Note:[/b] Categories in the property list are supposed to indicate different base types, so the use of this annotation is not encouraged. See [annotation @export_group] and [annotation @export_subgroup] instead.
+ [b]Note:[/b] Categories in the Inspector dock's list usually divide properties coming from different classes (Node, Node2D, Sprite, etc.). For better clarity, it's recommended to use [annotation @export_group] and [annotation @export_subgroup], instead.
</description>
</annotation>
<annotation name="@export_color_no_alpha">
<return type="void" />
<description>
- Export a [Color] property without transparency (its alpha fixed as [code]1.0[/code]).
+ Export a [Color] property without allowing its transparency ([member Color.a]) to be edited.
See also [constant PROPERTY_HINT_COLOR_NO_ALPHA].
[codeblock]
- @export_color_no_alpha var modulate_color: Color
+ @export_color_no_alpha var dye_color : Color
[/codeblock]
</description>
</annotation>
@@ -296,7 +298,7 @@
Export a [String] property as a path to a directory. The path will be limited to the project folder and its subfolders. See [annotation @export_global_dir] to allow picking from the entire filesystem.
See also [constant PROPERTY_HINT_DIR].
[codeblock]
- @export_dir var sprite_folder: String
+ @export_dir var sprite_folder_path: String
[/codeblock]
</description>
</annotation>
@@ -343,8 +345,8 @@
If [param filter] is provided, only matching files will be available for picking.
See also [constant PROPERTY_HINT_FILE].
[codeblock]
- @export_file var sound_effect_file: String
- @export_file("*.txt") var notes_file: String
+ @export_file var sound_effect_path: String
+ @export_file("*.txt") var notes_path: String
[/codeblock]
</description>
</annotation>
@@ -436,10 +438,10 @@
<annotation name="@export_global_dir">
<return type="void" />
<description>
- Export a [String] property as a path to a directory. The path can be picked from the entire filesystem. See [annotation @export_dir] to limit it to the project folder and its subfolders.
+ Export a [String] property as an absolute path to a directory. The path can be picked from the entire filesystem. See [annotation @export_dir] to limit it to the project folder and its subfolders.
See also [constant PROPERTY_HINT_GLOBAL_DIR].
[codeblock]
- @export_global_dir var sprite_folder: String
+ @export_global_dir var sprite_folder_path: String
[/codeblock]
</description>
</annotation>
@@ -447,12 +449,12 @@
<return type="void" />
<param index="0" name="filter" type="String" default="&quot;&quot;" />
<description>
- Export a [String] property as a path to a file. The path can be picked from the entire filesystem. See [annotation @export_file] to limit it to the project folder and its subfolders.
+ Export a [String] property as an absolute path to a file. The path can be picked from the entire filesystem. See [annotation @export_file] to limit it to the project folder and its subfolders.
If [param filter] is provided, only matching files will be available for picking.
See also [constant PROPERTY_HINT_GLOBAL_FILE].
[codeblock]
- @export_global_file var sound_effect_file: String
- @export_global_file("*.txt") var notes_file: String
+ @export_global_file var sound_effect_path: String
+ @export_global_file("*.txt") var notes_path: String
[/codeblock]
</description>
</annotation>
@@ -466,13 +468,13 @@
Groups cannot be nested, use [annotation @export_subgroup] to add subgroups within groups.
See also [constant PROPERTY_USAGE_GROUP].
[codeblock]
- @export_group("My Properties")
- @export var number = 3
- @export var string = ""
+ @export_group("Racer Properties")
+ @export var nickname = "Nick"
+ @export var age = 26
- @export_group("Prefixed Properties", "prefix_")
- @export var prefix_number = 3
- @export var prefix_string = ""
+ @export_group("Car Properties", "car_")
+ @export var car_label = "Speedy"
+ @export var car_number = 3
@export_group("", "")
@export var ungrouped_number = 3
@@ -544,13 +546,13 @@
Define a new subgroup for the following exported properties. This helps to organize properties in the Inspector dock. Subgroups work exactly like groups, except they need a parent group to exist. See [annotation @export_group].
See also [constant PROPERTY_USAGE_SUBGROUP].
[codeblock]
- @export_group("My Properties")
- @export var number = 3
- @export var string = ""
+ @export_group("Racer Properties")
+ @export var nickname = "Nick"
+ @export var age = 26
- @export_subgroup("My Prefixed Properties", "prefix_")
- @export var prefix_number = 3
- @export var prefix_string = ""
+ @export_subgroup("Car Properties", "car_")
+ @export var car_label = "Speedy"
+ @export var car_number = 3
[/codeblock]
[b]Note:[/b] Subgroups cannot be nested, they only provide one extra level of depth. Just like the next group ends the previous group, so do the subsequent subgroups.
</description>
@@ -571,7 +573,7 @@
<annotation name="@onready">
<return type="void" />
<description>
- Mark the following property as assigned on [Node]'s ready state change. Values for these properties are not assigned immediately upon the node's creation, and instead are computed and stored right before [method Node._ready].
+ Mark the following property as assigned when the [Node] is ready. Values for these properties are not assigned immediately when the node is initialized ([method Object._init]), and instead are computed and stored right before [method Node._ready].
[codeblock]
@onready var character_name: Label = $Label
[/codeblock]
diff --git a/modules/gdscript/gdscript.cpp b/modules/gdscript/gdscript.cpp
index a876229276..fe79f37454 100644
--- a/modules/gdscript/gdscript.cpp
+++ b/modules/gdscript/gdscript.cpp
@@ -2578,7 +2578,6 @@ GDScriptLanguage::GDScriptLanguage() {
#ifdef DEBUG_ENABLED
GLOBAL_DEF("debug/gdscript/warnings/enable", true);
- GLOBAL_DEF("debug/gdscript/warnings/treat_warnings_as_errors", false);
GLOBAL_DEF("debug/gdscript/warnings/exclude_addons", true);
for (int i = 0; i < (int)GDScriptWarning::WARNING_MAX; i++) {
GDScriptWarning::Code code = (GDScriptWarning::Code)i;
diff --git a/modules/gdscript/gdscript_analyzer.cpp b/modules/gdscript/gdscript_analyzer.cpp
index 602d07d9a7..d0525be853 100644
--- a/modules/gdscript/gdscript_analyzer.cpp
+++ b/modules/gdscript/gdscript_analyzer.cpp
@@ -42,6 +42,11 @@
#include "gdscript_utility_functions.h"
#include "scene/resources/packed_scene.h"
+#if defined(TOOLS_ENABLED) && !defined(DISABLE_DEPRECATED)
+#define SUGGEST_GODOT4_RENAMES
+#include "editor/renames_map_3_to_4.h"
+#endif
+
#define UNNAMED_ENUM "<anonymous enum>"
#define ENUM_SEPARATOR "::"
@@ -1737,6 +1742,7 @@ void GDScriptAnalyzer::resolve_assignable(GDScriptParser::AssignableNode *p_assi
}
type.is_constant = is_constant;
+ type.is_read_only = false;
p_assignable->set_datatype(type);
}
@@ -2601,9 +2607,8 @@ void GDScriptAnalyzer::reduce_binary_op(GDScriptParser::BinaryOpNode *p_binary_o
p_binary_op->set_datatype(result);
}
-#ifdef TOOLS_ENABLED
-#ifndef DISABLE_DEPRECATED
-const char *GDScriptAnalyzer::get_rename_from_map(const char *map[][2], String key) {
+#ifdef SUGGEST_GODOT4_RENAMES
+const char *get_rename_from_map(const char *map[][2], String key) {
for (int index = 0; map[index][0]; index++) {
if (map[index][0] == key) {
return map[index][1];
@@ -2614,39 +2619,39 @@ const char *GDScriptAnalyzer::get_rename_from_map(const char *map[][2], String k
// Checks if an identifier/function name has been renamed in Godot 4, uses ProjectConverter3To4 for rename map.
// Returns the new name if found, nullptr otherwise.
-const char *GDScriptAnalyzer::check_for_renamed_identifier(String identifier, GDScriptParser::Node::Type type) {
+const char *check_for_renamed_identifier(String identifier, GDScriptParser::Node::Type type) {
switch (type) {
case GDScriptParser::Node::IDENTIFIER: {
// Check properties
- const char *result = get_rename_from_map(ProjectConverter3To4::gdscript_properties_renames, identifier);
+ const char *result = get_rename_from_map(RenamesMap3To4::gdscript_properties_renames, identifier);
if (result) {
return result;
}
// Check enum values
- result = get_rename_from_map(ProjectConverter3To4::enum_renames, identifier);
+ result = get_rename_from_map(RenamesMap3To4::enum_renames, identifier);
if (result) {
return result;
}
// Check color constants
- result = get_rename_from_map(ProjectConverter3To4::color_renames, identifier);
+ result = get_rename_from_map(RenamesMap3To4::color_renames, identifier);
if (result) {
return result;
}
// Check type names
- result = get_rename_from_map(ProjectConverter3To4::class_renames, identifier);
+ result = get_rename_from_map(RenamesMap3To4::class_renames, identifier);
if (result) {
return result;
}
- return get_rename_from_map(ProjectConverter3To4::builtin_types_renames, identifier);
+ return get_rename_from_map(RenamesMap3To4::builtin_types_renames, identifier);
}
case GDScriptParser::Node::CALL: {
- const char *result = get_rename_from_map(ProjectConverter3To4::gdscript_function_renames, identifier);
+ const char *result = get_rename_from_map(RenamesMap3To4::gdscript_function_renames, identifier);
if (result) {
return result;
}
// Built-in Types are mistaken for function calls when the built-in type is not found.
// Check built-in types if function rename not found
- return get_rename_from_map(ProjectConverter3To4::builtin_types_renames, identifier);
+ return get_rename_from_map(RenamesMap3To4::builtin_types_renames, identifier);
}
// Signal references don't get parsed through the GDScriptAnalyzer. No support for signal rename hints.
default:
@@ -2654,8 +2659,7 @@ const char *GDScriptAnalyzer::check_for_renamed_identifier(String identifier, GD
return nullptr;
}
}
-#endif // DISABLE_DEPRECATED
-#endif // TOOLS_ENABLED
+#endif // SUGGEST_GODOT4_RENAMES
void GDScriptAnalyzer::reduce_call(GDScriptParser::CallNode *p_call, bool p_is_await, bool p_is_root) {
bool all_is_constant = true;
@@ -3078,8 +3082,7 @@ void GDScriptAnalyzer::reduce_call(GDScriptParser::CallNode *p_call, bool p_is_a
}
if (!found && (is_self || (base_type.is_hard_type() && base_type.kind == GDScriptParser::DataType::BUILTIN))) {
String base_name = is_self && !p_call->is_super ? "self" : base_type.to_string();
-#ifdef TOOLS_ENABLED
-#ifndef DISABLE_DEPRECATED
+#ifdef SUGGEST_GODOT4_RENAMES
String rename_hint = String();
if (GLOBAL_GET(GDScriptWarning::get_settings_path_from_code(GDScriptWarning::Code::RENAMED_IN_GD4_HINT)).booleanize()) {
const char *renamed_function_name = check_for_renamed_identifier(p_call->function_name, p_call->type);
@@ -3088,12 +3091,9 @@ void GDScriptAnalyzer::reduce_call(GDScriptParser::CallNode *p_call, bool p_is_a
}
}
push_error(vformat(R"*(Function "%s()" not found in base %s.%s)*", p_call->function_name, base_name, rename_hint), p_call->is_super ? p_call : p_call->callee);
-#else // !DISABLE_DEPRECATED
- push_error(vformat(R"*(Function "%s()" not found in base %s.)*", p_call->function_name, base_name), p_call->is_super ? p_call : p_call->callee);
-#endif // DISABLE_DEPRECATED
#else
push_error(vformat(R"*(Function "%s()" not found in base %s.)*", p_call->function_name, base_name), p_call->is_super ? p_call : p_call->callee);
-#endif
+#endif // SUGGEST_GODOT4_RENAMES
} else if (!found && (!p_call->is_super && base_type.is_hard_type() && base_type.kind == GDScriptParser::DataType::NATIVE && base_type.is_meta_type)) {
push_error(vformat(R"*(Static function "%s()" not found in base "%s".)*", p_call->function_name, base_type.native_type), p_call);
}
@@ -3283,8 +3283,7 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
p_identifier->reduced_value = result;
p_identifier->set_datatype(type_from_variant(result, p_identifier));
} else if (base.is_hard_type()) {
-#ifdef TOOLS_ENABLED
-#ifndef DISABLE_DEPRECATED
+#ifdef SUGGEST_GODOT4_RENAMES
String rename_hint = String();
if (GLOBAL_GET(GDScriptWarning::get_settings_path_from_code(GDScriptWarning::Code::RENAMED_IN_GD4_HINT)).booleanize()) {
const char *renamed_identifier_name = check_for_renamed_identifier(name, p_identifier->type);
@@ -3293,12 +3292,9 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
}
}
push_error(vformat(R"(Cannot find constant "%s" on base "%s".%s)", name, base.to_string(), rename_hint), p_identifier);
-#else // !DISABLE_DEPRECATED
- push_error(vformat(R"(Cannot find constant "%s" on base "%s".)", name, base.to_string()), p_identifier);
-#endif // DISABLE_DEPRECATED
#else
push_error(vformat(R"(Cannot find constant "%s" on base "%s".)", name, base.to_string()), p_identifier);
-#endif
+#endif // SUGGEST_GODOT4_RENAMES
}
} else {
switch (base.builtin_type) {
@@ -3327,8 +3323,7 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
}
}
if (base.is_hard_type()) {
-#ifdef TOOLS_ENABLED
-#ifndef DISABLE_DEPRECATED
+#ifdef SUGGEST_GODOT4_RENAMES
String rename_hint = String();
if (GLOBAL_GET(GDScriptWarning::get_settings_path_from_code(GDScriptWarning::Code::RENAMED_IN_GD4_HINT)).booleanize()) {
const char *renamed_identifier_name = check_for_renamed_identifier(name, p_identifier->type);
@@ -3337,12 +3332,9 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
}
}
push_error(vformat(R"(Cannot find property "%s" on base "%s".%s)", name, base.to_string(), rename_hint), p_identifier);
-#else // !DISABLE_DEPRECATED
- push_error(vformat(R"(Cannot find property "%s" on base "%s".)", name, base.to_string()), p_identifier);
-#endif // DISABLE_DEPRECATED
#else
push_error(vformat(R"(Cannot find property "%s" on base "%s".)", name, base.to_string()), p_identifier);
-#endif
+#endif // SUGGEST_GODOT4_RENAMES
}
}
}
@@ -3682,8 +3674,7 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident
if (GDScriptUtilityFunctions::function_exists(name)) {
push_error(vformat(R"(Built-in function "%s" cannot be used as an identifier.)", name), p_identifier);
} else {
-#ifdef TOOLS_ENABLED
-#ifndef DISABLE_DEPRECATED
+#ifdef SUGGEST_GODOT4_RENAMES
String rename_hint = String();
if (GLOBAL_GET(GDScriptWarning::get_settings_path_from_code(GDScriptWarning::Code::RENAMED_IN_GD4_HINT)).booleanize()) {
const char *renamed_identifier_name = check_for_renamed_identifier(name, p_identifier->type);
@@ -3692,12 +3683,9 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident
}
}
push_error(vformat(R"(Identifier "%s" not declared in the current scope.%s)", name, rename_hint), p_identifier);
-#else // !DISABLE_DEPRECATED
- push_error(vformat(R"(Identifier "%s" not declared in the current scope.)", name), p_identifier);
-#endif // DISABLE_DEPRECATED
#else
push_error(vformat(R"(Identifier "%s" not declared in the current scope.)", name), p_identifier);
-#endif
+#endif // SUGGEST_GODOT4_RENAMES
}
GDScriptParser::DataType dummy;
dummy.kind = GDScriptParser::DataType::VARIANT;
@@ -4291,11 +4279,15 @@ Variant GDScriptAnalyzer::make_variable_default_value(GDScriptParser::VariableNo
}
} else {
GDScriptParser::DataType datatype = p_variable->get_datatype();
- if (datatype.is_hard_type() && datatype.kind == GDScriptParser::DataType::BUILTIN && datatype.builtin_type != Variant::OBJECT) {
- if (datatype.builtin_type == Variant::ARRAY && datatype.has_container_element_type()) {
- result = make_array_from_element_datatype(datatype.get_container_element_type());
- } else {
- VariantInternal::initialize(&result, datatype.builtin_type);
+ if (datatype.is_hard_type()) {
+ if (datatype.kind == GDScriptParser::DataType::BUILTIN && datatype.builtin_type != Variant::OBJECT) {
+ if (datatype.builtin_type == Variant::ARRAY && datatype.has_container_element_type()) {
+ result = make_array_from_element_datatype(datatype.get_container_element_type());
+ } else {
+ VariantInternal::initialize(&result, datatype.builtin_type);
+ }
+ } else if (datatype.kind == GDScriptParser::DataType::ENUM) {
+ result = 0;
}
}
}
diff --git a/modules/gdscript/gdscript_analyzer.h b/modules/gdscript/gdscript_analyzer.h
index a4c84db6b9..cdeba374c7 100644
--- a/modules/gdscript/gdscript_analyzer.h
+++ b/modules/gdscript/gdscript_analyzer.h
@@ -37,10 +37,6 @@
#include "gdscript_cache.h"
#include "gdscript_parser.h"
-#ifdef TOOLS_ENABLED
-#include "editor/project_converter_3_to_4.h"
-#endif
-
class GDScriptAnalyzer {
GDScriptParser *parser = nullptr;
HashMap<String, Ref<GDScriptParserRef>> depended_parsers;
@@ -137,13 +133,6 @@ class GDScriptAnalyzer {
bool is_shadowing(GDScriptParser::IdentifierNode *p_local, const String &p_context);
#endif
-#ifdef TOOLS_ENABLED
-#ifndef DISABLE_DEPRECATED
- const char *get_rename_from_map(const char *map[][2], String key);
- const char *check_for_renamed_identifier(String identifier, GDScriptParser::Node::Type type);
-#endif // DISABLE_DEPRECATED
-#endif // TOOLS_ENABLED
-
public:
Error resolve_inheritance();
Error resolve_interface();
diff --git a/modules/gdscript/gdscript_editor.cpp b/modules/gdscript/gdscript_editor.cpp
index 3543c0a79f..8cfd48b52b 100644
--- a/modules/gdscript/gdscript_editor.cpp
+++ b/modules/gdscript/gdscript_editor.cpp
@@ -3491,14 +3491,6 @@ static Error _lookup_symbol_from_base(const GDScriptParser::DataType &p_base, co
break;
}
- if (context.current_class) {
- if (context.type != GDScriptParser::COMPLETION_SUPER_METHOD) {
- base.type = context.current_class->get_datatype();
- } else {
- base.type = context.current_class->base_type;
- }
- }
-
if (_lookup_symbol_from_base(base.type, p_symbol, is_function, r_result) == OK) {
return OK;
}
diff --git a/modules/gdscript/gdscript_parser.cpp b/modules/gdscript/gdscript_parser.cpp
index c6e4222213..b5cb5a4680 100644
--- a/modules/gdscript/gdscript_parser.cpp
+++ b/modules/gdscript/gdscript_parser.cpp
@@ -175,7 +175,7 @@ void GDScriptParser::push_warning(const Node *p_source, GDScriptWarning::Code p_
warning.leftmost_column = p_source->leftmost_column;
warning.rightmost_column = p_source->rightmost_column;
- if (warn_level == GDScriptWarning::WarnLevel::ERROR || bool(GLOBAL_GET("debug/gdscript/warnings/treat_warnings_as_errors"))) {
+ if (warn_level == GDScriptWarning::WarnLevel::ERROR) {
push_error(warning.get_message() + String(" (Warning treated as error.)"), p_source);
return;
}
@@ -483,24 +483,34 @@ void GDScriptParser::parse_program() {
current_class = head;
bool can_have_class_or_extends = true;
- while (match(GDScriptTokenizer::Token::ANNOTATION)) {
- AnnotationNode *annotation = parse_annotation(AnnotationInfo::SCRIPT | AnnotationInfo::STANDALONE | AnnotationInfo::CLASS_LEVEL);
- if (annotation != nullptr) {
- if (annotation->applies_to(AnnotationInfo::SCRIPT)) {
- // `@icon` needs to be applied in the parser. See GH-72444.
- if (annotation->name == SNAME("@icon")) {
- annotation->apply(this, head);
+ while (!check(GDScriptTokenizer::Token::TK_EOF)) {
+ if (match(GDScriptTokenizer::Token::ANNOTATION)) {
+ AnnotationNode *annotation = parse_annotation(AnnotationInfo::SCRIPT | AnnotationInfo::STANDALONE | AnnotationInfo::CLASS_LEVEL);
+ if (annotation != nullptr) {
+ if (annotation->applies_to(AnnotationInfo::SCRIPT)) {
+ // `@icon` needs to be applied in the parser. See GH-72444.
+ if (annotation->name == SNAME("@icon")) {
+ annotation->apply(this, head);
+ } else {
+ head->annotations.push_back(annotation);
+ }
} else {
- head->annotations.push_back(annotation);
+ annotation_stack.push_back(annotation);
+ // This annotation must appear after script-level annotations
+ // and class_name/extends (ex: could be @onready or @export),
+ // so we stop looking for script-level stuff.
+ can_have_class_or_extends = false;
+ break;
}
- } else {
- annotation_stack.push_back(annotation);
- // This annotation must appear after script-level annotations
- // and class_name/extends (ex: could be @onready or @export),
- // so we stop looking for script-level stuff.
- can_have_class_or_extends = false;
- break;
}
+ } else if (check(GDScriptTokenizer::Token::LITERAL) && current.literal.get_type() == Variant::STRING) {
+ // Allow strings in class body as multiline comments.
+ advance();
+ if (!match(GDScriptTokenizer::Token::NEWLINE)) {
+ push_error("Expected newline after comment string.");
+ }
+ } else {
+ break;
}
}
@@ -524,6 +534,16 @@ void GDScriptParser::parse_program() {
end_statement("superclass");
}
break;
+ case GDScriptTokenizer::Token::LITERAL:
+ if (current.literal.get_type() == Variant::STRING) {
+ // Allow strings in class body as multiline comments.
+ advance();
+ if (!match(GDScriptTokenizer::Token::NEWLINE)) {
+ push_error("Expected newline after comment string.");
+ }
+ break;
+ }
+ [[fallthrough]];
default:
// No tokens are allowed between script annotations and class/extends.
can_have_class_or_extends = false;
@@ -829,6 +849,16 @@ void GDScriptParser::parse_class_body(bool p_is_multiline) {
case GDScriptTokenizer::Token::DEDENT:
class_end = true;
break;
+ case GDScriptTokenizer::Token::LITERAL:
+ if (current.literal.get_type() == Variant::STRING) {
+ // Allow strings in class body as multiline comments.
+ advance();
+ if (!match(GDScriptTokenizer::Token::NEWLINE)) {
+ push_error("Expected newline after comment string.");
+ }
+ break;
+ }
+ [[fallthrough]];
default:
// Display a completion with identifiers.
make_completion_context(COMPLETION_IDENTIFIER, nullptr);
@@ -1675,6 +1705,12 @@ GDScriptParser::Node *GDScriptParser::parse_statement() {
// Standalone lambdas can't be used, so make this an error.
push_error("Standalone lambdas cannot be accessed. Consider assigning it to a variable.", expression);
break;
+ case Node::LITERAL:
+ if (static_cast<GDScriptParser::LiteralNode *>(expression)->value.get_type() == Variant::STRING) {
+ // Allow strings as multiline comments.
+ break;
+ }
+ [[fallthrough]];
default:
push_warning(expression, GDScriptWarning::STANDALONE_EXPRESSION);
}
@@ -2145,7 +2181,12 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_precedence(Precedence p_pr
make_completion_context(COMPLETION_IDENTIFIER, nullptr);
GDScriptTokenizer::Token token = current;
- ParseFunction prefix_rule = get_rule(token.type)->prefix;
+ GDScriptTokenizer::Token::Type token_type = token.type;
+ if (token.is_identifier()) {
+ // Allow keywords that can be treated as identifiers.
+ token_type = GDScriptTokenizer::Token::IDENTIFIER;
+ }
+ ParseFunction prefix_rule = get_rule(token_type)->prefix;
if (prefix_rule == nullptr) {
// Expected expression. Let the caller give the proper error message.
@@ -3010,7 +3051,14 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_get_node(ExpressionNode *p
path_state = PATH_STATE_NODE_NAME;
} else if (current.is_node_name()) {
advance();
- get_node->full_path += previous.get_identifier();
+ String identifier = previous.get_identifier();
+#ifdef DEBUG_ENABLED
+ // Check spoofing.
+ if (TS->has_feature(TextServer::FEATURE_UNICODE_SECURITY) && TS->spoof_check(identifier)) {
+ push_warning(get_node, GDScriptWarning::CONFUSABLE_IDENTIFIER, identifier);
+ }
+#endif
+ get_node->full_path += identifier;
path_state = PATH_STATE_NODE_NAME;
} else if (!check(GDScriptTokenizer::Token::SLASH) && !check(GDScriptTokenizer::Token::PERCENT)) {
diff --git a/modules/gdscript/gdscript_tokenizer.cpp b/modules/gdscript/gdscript_tokenizer.cpp
index d7f1114fd3..d586380c41 100644
--- a/modules/gdscript/gdscript_tokenizer.cpp
+++ b/modules/gdscript/gdscript_tokenizer.cpp
@@ -168,7 +168,11 @@ bool GDScriptTokenizer::Token::is_identifier() const {
switch (type) {
case IDENTIFIER:
case MATCH: // Used in String.match().
- case CONST_INF: // Used in Vector{2,3,4}.INF
+ // Allow constants to be treated as regular identifiers.
+ case CONST_PI:
+ case CONST_INF:
+ case CONST_NAN:
+ case CONST_TAU:
return true;
default:
return false;
@@ -188,6 +192,10 @@ bool GDScriptTokenizer::Token::is_node_name() const {
case CLASS_NAME:
case CLASS:
case CONST:
+ case CONST_PI:
+ case CONST_INF:
+ case CONST_NAN:
+ case CONST_TAU:
case CONTINUE:
case ELIF:
case ELSE:
@@ -530,9 +538,12 @@ void GDScriptTokenizer::make_keyword_list() {
#endif // DEBUG_ENABLED
GDScriptTokenizer::Token GDScriptTokenizer::potential_identifier() {
+ bool only_ascii = _peek(-1) < 128;
+
// Consume all identifier characters.
while (is_unicode_identifier_continue(_peek())) {
- _advance();
+ char32_t c = _advance();
+ only_ascii = only_ascii && c < 128;
}
int len = _current - _start;
@@ -587,7 +598,7 @@ GDScriptTokenizer::Token GDScriptTokenizer::potential_identifier() {
#ifdef DEBUG_ENABLED
// Additional checks for identifiers but only in debug and if it's available in TextServer.
- if (TS->has_feature(TextServer::FEATURE_UNICODE_SECURITY)) {
+ if (!only_ascii && TS->has_feature(TextServer::FEATURE_UNICODE_SECURITY)) {
int64_t confusable = TS->is_confusable(name, keyword_list);
if (confusable >= 0) {
push_error(vformat(R"(Identifier "%s" is visually similar to the GDScript keyword "%s" and thus not allowed.)", name, keyword_list[confusable]));
diff --git a/modules/gdscript/gdscript_vm.cpp b/modules/gdscript/gdscript_vm.cpp
index 6c26e226a5..7a11ea52f0 100644
--- a/modules/gdscript/gdscript_vm.cpp
+++ b/modules/gdscript/gdscript_vm.cpp
@@ -447,6 +447,9 @@ void (*type_init_function_table[])(Variant *) = {
#define OP_GET_BASIS get_basis
#define OP_GET_RID get_rid
+#define METHOD_CALL_ON_NULL_VALUE_ERROR(method_pointer) "Cannot call method '" + (method_pointer)->get_name() + "' on a null value."
+#define METHOD_CALL_ON_FREED_INSTANCE_ERROR(method_pointer) "Cannot call method '" + (method_pointer)->get_name() + "' on a previously freed instance."
+
Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_args, int p_argcount, Callable::CallError &r_err, CallState *p_state) {
OPCODES_TABLE;
@@ -1675,10 +1678,10 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
bool freed = false;
Object *base_obj = base->get_validated_object_with_check(freed);
if (freed) {
- err_text = "Trying to call a function on a previously freed instance.";
+ err_text = METHOD_CALL_ON_FREED_INSTANCE_ERROR(method);
OPCODE_BREAK;
} else if (!base_obj) {
- err_text = "Trying to call a function on a null value.";
+ err_text = METHOD_CALL_ON_NULL_VALUE_ERROR(method);
OPCODE_BREAK;
}
#else
@@ -1839,10 +1842,10 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
bool freed = false; \
Object *base_obj = base->get_validated_object_with_check(freed); \
if (freed) { \
- err_text = "Trying to call a function on a previously freed instance."; \
+ err_text = METHOD_CALL_ON_FREED_INSTANCE_ERROR(method); \
OPCODE_BREAK; \
} else if (!base_obj) { \
- err_text = "Trying to call a function on a null value."; \
+ err_text = METHOD_CALL_ON_NULL_VALUE_ERROR(method); \
OPCODE_BREAK; \
} \
const void **argptrs = call_args_ptr; \
@@ -1941,10 +1944,10 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
bool freed = false;
Object *base_obj = base->get_validated_object_with_check(freed);
if (freed) {
- err_text = "Trying to call a function on a previously freed instance.";
+ err_text = METHOD_CALL_ON_FREED_INSTANCE_ERROR(method);
OPCODE_BREAK;
} else if (!base_obj) {
- err_text = "Trying to call a function on a null value.";
+ err_text = METHOD_CALL_ON_NULL_VALUE_ERROR(method);
OPCODE_BREAK;
}
#else
@@ -1969,7 +1972,13 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
VariantInternal::initialize(ret, Variant::OBJECT);
Object **ret_opaque = VariantInternal::get_object(ret);
method->ptrcall(base_obj, argptrs, ret_opaque);
- VariantInternal::update_object_id(ret);
+ if (method->is_return_type_raw_object_ptr()) {
+ // The Variant has to participate in the ref count since the method returns a raw Object *.
+ VariantInternal::object_assign(ret, *ret_opaque);
+ } else {
+ // The method, in case it returns something, returns an already encapsulated object.
+ VariantInternal::update_object_id(ret);
+ }
#ifdef DEBUG_ENABLED
if (GDScriptLanguage::get_singleton()->profiling) {
@@ -1996,10 +2005,10 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
bool freed = false;
Object *base_obj = base->get_validated_object_with_check(freed);
if (freed) {
- err_text = "Trying to call a function on a previously freed instance.";
+ err_text = METHOD_CALL_ON_FREED_INSTANCE_ERROR(method);
OPCODE_BREAK;
} else if (!base_obj) {
- err_text = "Trying to call a function on a null value.";
+ err_text = METHOD_CALL_ON_NULL_VALUE_ERROR(method);
OPCODE_BREAK;
}
#else
diff --git a/modules/gdscript/language_server/gdscript_text_document.cpp b/modules/gdscript/language_server/gdscript_text_document.cpp
index b9e6921034..35fbdca949 100644
--- a/modules/gdscript/language_server/gdscript_text_document.cpp
+++ b/modules/gdscript/language_server/gdscript_text_document.cpp
@@ -108,6 +108,7 @@ void GDScriptTextDocument::didSave(const Variant &p_param) {
scr->reload(true);
}
scr->update_exports();
+ ScriptEditor::get_singleton()->reload_scripts(true);
ScriptEditor::get_singleton()->update_docs_from_script(scr);
}
}
diff --git a/modules/gdscript/tests/scripts/analyzer/features/typed_array_usage.gd b/modules/gdscript/tests/scripts/analyzer/features/typed_array_usage.gd
index 092ae49d00..7416ecd87a 100644
--- a/modules/gdscript/tests/scripts/analyzer/features/typed_array_usage.gd
+++ b/modules/gdscript/tests/scripts/analyzer/features/typed_array_usage.gd
@@ -86,7 +86,8 @@ func test():
var typed_int := 556
var converted_floats: Array[float] = [typed_int]
- assert(str(converted_floats) == '[556]')
+ converted_floats.push_back(498)
+ assert(str(converted_floats) == '[556, 498]')
assert(converted_floats.get_typed_builtin() == TYPE_FLOAT)
diff --git a/modules/gdscript/tests/scripts/parser/features/allow_id_similar_to_keyword_in_ascii.gd b/modules/gdscript/tests/scripts/parser/features/allow_id_similar_to_keyword_in_ascii.gd
new file mode 100644
index 0000000000..390d314b94
--- /dev/null
+++ b/modules/gdscript/tests/scripts/parser/features/allow_id_similar_to_keyword_in_ascii.gd
@@ -0,0 +1,3 @@
+func test():
+ var P1 = "ok" # Technically it is visually similar to keyword "PI" but allowed since it's in ASCII range.
+ print(P1)
diff --git a/modules/gdscript/tests/scripts/parser/features/allow_id_similar_to_keyword_in_ascii.out b/modules/gdscript/tests/scripts/parser/features/allow_id_similar_to_keyword_in_ascii.out
new file mode 100644
index 0000000000..1b47ed10dc
--- /dev/null
+++ b/modules/gdscript/tests/scripts/parser/features/allow_id_similar_to_keyword_in_ascii.out
@@ -0,0 +1,2 @@
+GDTEST_OK
+ok
diff --git a/modules/gdscript/tests/scripts/parser/features/allow_strings_as_comments.gd b/modules/gdscript/tests/scripts/parser/features/allow_strings_as_comments.gd
new file mode 100644
index 0000000000..3ecd65ad9c
--- /dev/null
+++ b/modules/gdscript/tests/scripts/parser/features/allow_strings_as_comments.gd
@@ -0,0 +1,21 @@
+"""
+This is a comment.
+"""
+
+@tool
+
+"""
+This is also a comment.
+"""
+
+extends RefCounted
+
+'''
+This is a comment too.
+'''
+
+func test():
+ """
+ This too is a comment.
+ """
+ print("ok")
diff --git a/modules/gdscript/tests/scripts/parser/features/allow_strings_as_comments.out b/modules/gdscript/tests/scripts/parser/features/allow_strings_as_comments.out
new file mode 100644
index 0000000000..1b47ed10dc
--- /dev/null
+++ b/modules/gdscript/tests/scripts/parser/features/allow_strings_as_comments.out
@@ -0,0 +1,2 @@
+GDTEST_OK
+ok
diff --git a/modules/gdscript/tests/scripts/parser/features/allowed_keywords_as_identifiers.gd b/modules/gdscript/tests/scripts/parser/features/allowed_keywords_as_identifiers.gd
new file mode 100644
index 0000000000..7e1982597c
--- /dev/null
+++ b/modules/gdscript/tests/scripts/parser/features/allowed_keywords_as_identifiers.gd
@@ -0,0 +1,16 @@
+func test():
+ # The following keywords are allowed as identifiers:
+ var match = "match"
+ print(match)
+
+ var PI = "PI"
+ print(PI)
+
+ var INF = "INF"
+ print(INF)
+
+ var NAN = "NAN"
+ print(NAN)
+
+ var TAU = "TAU"
+ print(TAU)
diff --git a/modules/gdscript/tests/scripts/parser/features/allowed_keywords_as_identifiers.out b/modules/gdscript/tests/scripts/parser/features/allowed_keywords_as_identifiers.out
new file mode 100644
index 0000000000..aae2ae13d5
--- /dev/null
+++ b/modules/gdscript/tests/scripts/parser/features/allowed_keywords_as_identifiers.out
@@ -0,0 +1,6 @@
+GDTEST_OK
+match
+PI
+INF
+NAN
+TAU
diff --git a/modules/gdscript/tests/scripts/parser/warnings/confusable_identifier.gd b/modules/gdscript/tests/scripts/parser/warnings/confusable_identifier.gd
index e2caac8ffd..41b38c4bba 100644
--- a/modules/gdscript/tests/scripts/parser/warnings/confusable_identifier.gd
+++ b/modules/gdscript/tests/scripts/parser/warnings/confusable_identifier.gd
@@ -1,5 +1,12 @@
+extends Node
+
func test():
var port = 0 # Only latin characters.
var pοrt = 1 # The "ο" is Greek omicron.
prints(port, pοrt)
+
+# Do not call this since nodes aren't in the tree. It is just a parser check.
+func nodes():
+ var _node1 = $port # Only latin characters.
+ var _node2 = $pοrt # The "ο" is Greek omicron.
diff --git a/modules/gdscript/tests/scripts/parser/warnings/confusable_identifier.out b/modules/gdscript/tests/scripts/parser/warnings/confusable_identifier.out
index c483396443..c189204285 100644
--- a/modules/gdscript/tests/scripts/parser/warnings/confusable_identifier.out
+++ b/modules/gdscript/tests/scripts/parser/warnings/confusable_identifier.out
@@ -1,6 +1,10 @@
GDTEST_OK
>> WARNING
->> Line: 3
+>> Line: 5
+>> CONFUSABLE_IDENTIFIER
+>> The identifier "pοrt" has misleading characters and might be confused with something else.
+>> WARNING
+>> Line: 12
>> CONFUSABLE_IDENTIFIER
>> The identifier "pοrt" has misleading characters and might be confused with something else.
0 1
diff --git a/modules/gdscript/tests/scripts/parser/warnings/standalone_expression.gd b/modules/gdscript/tests/scripts/parser/warnings/standalone_expression.gd
index 18ea260fa2..dc4223ec2d 100644
--- a/modules/gdscript/tests/scripts/parser/warnings/standalone_expression.gd
+++ b/modules/gdscript/tests/scripts/parser/warnings/standalone_expression.gd
@@ -1,6 +1,5 @@
func test():
# The following statements should all be reported as standalone expressions:
- "This is a standalone expression"
1234
0.0 + 0.0
Color(1, 1, 1)
diff --git a/modules/gdscript/tests/scripts/parser/warnings/standalone_expression.out b/modules/gdscript/tests/scripts/parser/warnings/standalone_expression.out
index 99ec87438e..a2c67a6e51 100644
--- a/modules/gdscript/tests/scripts/parser/warnings/standalone_expression.out
+++ b/modules/gdscript/tests/scripts/parser/warnings/standalone_expression.out
@@ -8,14 +8,10 @@ GDTEST_OK
>> STANDALONE_EXPRESSION
>> Standalone expression (the line has no effect).
>> WARNING
->> Line: 5
+>> Line: 6
>> STANDALONE_EXPRESSION
>> Standalone expression (the line has no effect).
>> WARNING
>> Line: 7
>> STANDALONE_EXPRESSION
>> Standalone expression (the line has no effect).
->> WARNING
->> Line: 8
->> STANDALONE_EXPRESSION
->> Standalone expression (the line has no effect).
diff --git a/modules/gltf/editor/editor_scene_importer_blend.cpp b/modules/gltf/editor/editor_scene_importer_blend.cpp
index 520f33261a..7dcdc8e7cf 100644
--- a/modules/gltf/editor/editor_scene_importer_blend.cpp
+++ b/modules/gltf/editor/editor_scene_importer_blend.cpp
@@ -214,7 +214,14 @@ Node *EditorSceneFormatImporterBlend::import_scene(const String &p_path, uint32_
}
return nullptr;
}
+
+#ifndef DISABLE_DEPRECATED
+ bool trimming = p_options.has("animation/trimming") ? (bool)p_options["animation/trimming"] : false;
+ bool remove_immutable = p_options.has("animation/remove_immutable_tracks") ? (bool)p_options["animation/remove_immutable_tracks"] : true;
+ return gltf->generate_scene(state, (float)p_options["animation/fps"], trimming, remove_immutable);
+#else
return gltf->generate_scene(state, (float)p_options["animation/fps"], (bool)p_options["animation/trimming"], (bool)p_options["animation/remove_immutable_tracks"]);
+#endif
}
Variant EditorSceneFormatImporterBlend::get_option_visibility(const String &p_path, bool p_for_animation, const String &p_option,
diff --git a/modules/gltf/editor/editor_scene_importer_fbx.cpp b/modules/gltf/editor/editor_scene_importer_fbx.cpp
index d829630032..f8f458fcc7 100644
--- a/modules/gltf/editor/editor_scene_importer_fbx.cpp
+++ b/modules/gltf/editor/editor_scene_importer_fbx.cpp
@@ -100,7 +100,14 @@ Node *EditorSceneFormatImporterFBX::import_scene(const String &p_path, uint32_t
}
return nullptr;
}
+
+#ifndef DISABLE_DEPRECATED
+ bool trimming = p_options.has("animation/trimming") ? (bool)p_options["animation/trimming"] : false;
+ bool remove_immutable = p_options.has("animation/remove_immutable_tracks") ? (bool)p_options["animation/remove_immutable_tracks"] : true;
+ return gltf->generate_scene(state, (float)p_options["animation/fps"], trimming, remove_immutable);
+#else
return gltf->generate_scene(state, (float)p_options["animation/fps"], (bool)p_options["animation/trimming"], (bool)p_options["animation/remove_immutable_tracks"]);
+#endif
}
Variant EditorSceneFormatImporterFBX::get_option_visibility(const String &p_path, bool p_for_animation,
diff --git a/modules/gltf/editor/editor_scene_importer_gltf.cpp b/modules/gltf/editor/editor_scene_importer_gltf.cpp
index 012a144d52..5339275439 100644
--- a/modules/gltf/editor/editor_scene_importer_gltf.cpp
+++ b/modules/gltf/editor/editor_scene_importer_gltf.cpp
@@ -47,15 +47,15 @@ void EditorSceneFormatImporterGLTF::get_extensions(List<String> *r_extensions) c
Node *EditorSceneFormatImporterGLTF::import_scene(const String &p_path, uint32_t p_flags,
const HashMap<StringName, Variant> &p_options,
List<String> *r_missing_deps, Error *r_err) {
- Ref<GLTFDocument> doc;
- doc.instantiate();
+ Ref<GLTFDocument> gltf;
+ gltf.instantiate();
Ref<GLTFState> state;
state.instantiate();
if (p_options.has("gltf/embedded_image_handling")) {
int32_t enum_option = p_options["gltf/embedded_image_handling"];
state->set_handle_binary_image(enum_option);
}
- Error err = doc->append_from_file(p_path, state, p_flags);
+ Error err = gltf->append_from_file(p_path, state, p_flags);
if (err != OK) {
if (r_err) {
*r_err = err;
@@ -67,21 +67,11 @@ Node *EditorSceneFormatImporterGLTF::import_scene(const String &p_path, uint32_t
}
#ifndef DISABLE_DEPRECATED
- if (p_options.has("animation/trimming")) {
- if (p_options.has("animation/remove_immutable_tracks")) {
- return doc->generate_scene(state, (float)p_options["animation/fps"], (bool)p_options["animation/trimming"], (bool)p_options["animation/remove_immutable_tracks"]);
- } else {
- return doc->generate_scene(state, (float)p_options["animation/fps"], (bool)p_options["animation/trimming"], true);
- }
- } else {
- if (p_options.has("animation/remove_immutable_tracks")) {
- return doc->generate_scene(state, (float)p_options["animation/fps"], false, (bool)p_options["animation/remove_immutable_tracks"]);
- } else {
- return doc->generate_scene(state, (float)p_options["animation/fps"], false, true);
- }
- }
+ bool trimming = p_options.has("animation/trimming") ? (bool)p_options["animation/trimming"] : false;
+ bool remove_immutable = p_options.has("animation/remove_immutable_tracks") ? (bool)p_options["animation/remove_immutable_tracks"] : true;
+ return gltf->generate_scene(state, (float)p_options["animation/fps"], trimming, remove_immutable);
#else
- return doc->generate_scene(state, (float)p_options["animation/fps"], (bool)p_options["animation/trimming"], (bool)p_options["animation/remove_immutable_tracks"]);
+ return gltf->generate_scene(state, (float)p_options["animation/fps"], (bool)p_options["animation/trimming"], (bool)p_options["animation/remove_immutable_tracks"]);
#endif
}
diff --git a/modules/gltf/gltf_document.cpp b/modules/gltf/gltf_document.cpp
index 028028a103..e3ba290eb2 100644
--- a/modules/gltf/gltf_document.cpp
+++ b/modules/gltf/gltf_document.cpp
@@ -3285,7 +3285,6 @@ Error GLTFDocument::_parse_images(Ref<GLTFState> p_state, const String &p_base_p
tex.instantiate();
tex->set_name(img->get_name());
tex->set_keep_compressed_buffer(true);
- p_state->source_images.push_back(img);
tex->create_from_image(img, PortableCompressedTexture2D::COMPRESSION_MODE_BASIS_UNIVERSAL);
p_state->images.push_back(tex);
p_state->source_images.push_back(img);
diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/BuildInfo.cs b/modules/mono/editor/GodotTools/GodotTools/Build/BuildInfo.cs
index 1e4fd2f09a..7c02f29606 100644
--- a/modules/mono/editor/GodotTools/GodotTools/Build/BuildInfo.cs
+++ b/modules/mono/editor/GodotTools/GodotTools/Build/BuildInfo.cs
@@ -12,6 +12,7 @@ namespace GodotTools.Build
public sealed partial class BuildInfo : RefCounted // TODO Remove RefCounted once we have proper serialization
{
public string Solution { get; private set; }
+ public string Project { get; private set; }
public string Configuration { get; private set; }
public string? RuntimeIdentifier { get; private set; }
public string? PublishOutputDir { get; private set; }
@@ -28,6 +29,7 @@ namespace GodotTools.Build
{
return obj is BuildInfo other &&
other.Solution == Solution &&
+ other.Project == Project &&
other.Configuration == Configuration && other.RuntimeIdentifier == RuntimeIdentifier &&
other.PublishOutputDir == PublishOutputDir && other.Restore == Restore &&
other.Rebuild == Rebuild && other.OnlyClean == OnlyClean &&
@@ -41,6 +43,7 @@ namespace GodotTools.Build
{
int hash = 17;
hash = (hash * 29) + Solution.GetHashCode();
+ hash = (hash * 29) + Project.GetHashCode();
hash = (hash * 29) + Configuration.GetHashCode();
hash = (hash * 29) + (RuntimeIdentifier?.GetHashCode() ?? 0);
hash = (hash * 29) + (PublishOutputDir?.GetHashCode() ?? 0);
@@ -57,22 +60,25 @@ namespace GodotTools.Build
private BuildInfo()
{
Solution = string.Empty;
+ Project = string.Empty;
Configuration = string.Empty;
}
- public BuildInfo(string solution, string configuration, bool restore, bool rebuild, bool onlyClean)
+ public BuildInfo(string solution, string project, string configuration, bool restore, bool rebuild, bool onlyClean)
{
Solution = solution;
+ Project = project;
Configuration = configuration;
Restore = restore;
Rebuild = rebuild;
OnlyClean = onlyClean;
}
- public BuildInfo(string solution, string configuration, string runtimeIdentifier,
+ public BuildInfo(string solution, string project, string configuration, string runtimeIdentifier,
string publishOutputDir, bool restore, bool rebuild, bool onlyClean)
{
Solution = solution;
+ Project = project;
Configuration = configuration;
RuntimeIdentifier = runtimeIdentifier;
PublishOutputDir = publishOutputDir;
diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/BuildManager.cs b/modules/mono/editor/GodotTools/GodotTools/Build/BuildManager.cs
index 349f9d0cb8..ed3a4c6e26 100644
--- a/modules/mono/editor/GodotTools/GodotTools/Build/BuildManager.cs
+++ b/modules/mono/editor/GodotTools/GodotTools/Build/BuildManager.cs
@@ -262,7 +262,7 @@ namespace GodotTools.Build
bool onlyClean = false
)
{
- var buildInfo = new BuildInfo(GodotSharpDirs.ProjectSlnPath, configuration,
+ var buildInfo = new BuildInfo(GodotSharpDirs.ProjectSlnPath, GodotSharpDirs.ProjectCsProjPath, configuration,
restore: true, rebuild, onlyClean);
// If a platform was not specified, try determining the current one. If that fails, let MSBuild auto-detect it.
@@ -282,7 +282,7 @@ namespace GodotTools.Build
[DisallowNull] string publishOutputDir
)
{
- var buildInfo = new BuildInfo(GodotSharpDirs.ProjectSlnPath, configuration,
+ var buildInfo = new BuildInfo(GodotSharpDirs.ProjectSlnPath, GodotSharpDirs.ProjectCsProjPath, configuration,
runtimeIdentifier, publishOutputDir, restore: true, rebuild: false, onlyClean: false);
buildInfo.CustomProperties.Add($"GodotTargetPlatform={platform}");
diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/BuildSystem.cs b/modules/mono/editor/GodotTools/GodotTools/Build/BuildSystem.cs
index d6549c1b70..d550c36b82 100644
--- a/modules/mono/editor/GodotTools/GodotTools/Build/BuildSystem.cs
+++ b/modules/mono/editor/GodotTools/GodotTools/Build/BuildSystem.cs
@@ -139,8 +139,8 @@ namespace GodotTools.Build
// `dotnet clean` / `dotnet build` commands
arguments.Add(buildInfo.OnlyClean ? "clean" : "build");
- // Solution
- arguments.Add(buildInfo.Solution);
+ // C# Project
+ arguments.Add(buildInfo.Project);
// `dotnet clean` doesn't recognize these options
if (!buildInfo.OnlyClean)
@@ -180,8 +180,8 @@ namespace GodotTools.Build
{
arguments.Add("publish"); // `dotnet publish` command
- // Solution
- arguments.Add(buildInfo.Solution);
+ // C# Project
+ arguments.Add(buildInfo.Project);
// Restore
// `dotnet publish` restores by default, unless requested not to
diff --git a/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs b/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs
index 43ead4af69..060c01b3f9 100644
--- a/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs
+++ b/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs
@@ -272,8 +272,7 @@ namespace GodotTools
}
}
- string resourcePath = ProjectSettings.GlobalizePath("res://");
- args.Add(resourcePath);
+ args.Add(Path.GetDirectoryName(GodotSharpDirs.ProjectSlnPath));
string scriptPath = ProjectSettings.GlobalizePath(script.ResourcePath);
diff --git a/modules/mono/glue/GodotSharp/Godot.SourceGenerators.Internal/UnmanagedCallbacksGenerator.cs b/modules/mono/glue/GodotSharp/Godot.SourceGenerators.Internal/UnmanagedCallbacksGenerator.cs
index 3226ca79e5..6b000cc89b 100644
--- a/modules/mono/glue/GodotSharp/Godot.SourceGenerators.Internal/UnmanagedCallbacksGenerator.cs
+++ b/modules/mono/glue/GodotSharp/Godot.SourceGenerators.Internal/UnmanagedCallbacksGenerator.cs
@@ -168,7 +168,9 @@ using Godot.NativeInterop;
{
var parameter = callback.Parameters[i];
- source.Append(parameter.ToDisplayString());
+ AppendRefKind(source, parameter.RefKind);
+ source.Append(' ');
+ source.Append(parameter.Type.FullQualifiedNameIncludeGlobal());
source.Append(' ');
source.Append(parameter.Name);
diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/GodotSynchronizationContext.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/GodotSynchronizationContext.cs
index 027eab30fc..79030c79cc 100644
--- a/modules/mono/glue/GodotSharp/GodotSharp/Core/GodotSynchronizationContext.cs
+++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/GodotSynchronizationContext.cs
@@ -1,17 +1,44 @@
using System;
using System.Collections.Concurrent;
-using System.Collections.Generic;
using System.Threading;
+using System.Threading.Tasks;
namespace Godot
{
public sealed class GodotSynchronizationContext : SynchronizationContext, IDisposable
{
- private readonly BlockingCollection<KeyValuePair<SendOrPostCallback, object>> _queue = new();
+ private readonly BlockingCollection<(SendOrPostCallback Callback, object State)> _queue = new();
+
+ public override void Send(SendOrPostCallback d, object state)
+ {
+ // Shortcut if we're already on this context
+ // Also necessary to avoid a deadlock, since Send is blocking
+ if (Current == this)
+ {
+ d(state);
+ return;
+ }
+
+ var source = new TaskCompletionSource();
+
+ _queue.Add((st =>
+ {
+ try
+ {
+ d(st);
+ }
+ finally
+ {
+ source.SetResult();
+ }
+ }, state));
+
+ source.Task.Wait();
+ }
public override void Post(SendOrPostCallback d, object state)
{
- _queue.Add(new KeyValuePair<SendOrPostCallback, object>(d, state));
+ _queue.Add((d, state));
}
/// <summary>
@@ -21,7 +48,7 @@ namespace Godot
{
while (_queue.TryTake(out var workItem))
{
- workItem.Key(workItem.Value);
+ workItem.Callback(workItem.State);
}
}
diff --git a/modules/multiplayer/multiplayer_spawner.cpp b/modules/multiplayer/multiplayer_spawner.cpp
index 0aa54b69f9..4b1b6b541d 100644
--- a/modules/multiplayer/multiplayer_spawner.cpp
+++ b/modules/multiplayer/multiplayer_spawner.cpp
@@ -103,6 +103,15 @@ void MultiplayerSpawner::add_spawnable_scene(const String &p_path) {
ERR_FAIL_COND(!FileAccess::exists(p_path));
}
spawnable_scenes.push_back(sc);
+#ifdef TOOLS_ENABLED
+ if (Engine::get_singleton()->is_editor_hint()) {
+ return;
+ }
+#endif
+ Node *node = get_spawn_node();
+ if (spawnable_scenes.size() == 1 && node && !node->is_connected("child_entered_tree", callable_mp(this, &MultiplayerSpawner::_node_added))) {
+ node->connect("child_entered_tree", callable_mp(this, &MultiplayerSpawner::_node_added));
+ }
}
int MultiplayerSpawner::get_spawnable_scene_count() const {
@@ -116,6 +125,15 @@ String MultiplayerSpawner::get_spawnable_scene(int p_idx) const {
void MultiplayerSpawner::clear_spawnable_scenes() {
spawnable_scenes.clear();
+#ifdef TOOLS_ENABLED
+ if (Engine::get_singleton()->is_editor_hint()) {
+ return;
+ }
+#endif
+ Node *node = get_spawn_node();
+ if (node && node->is_connected("child_entered_tree", callable_mp(this, &MultiplayerSpawner::_node_added))) {
+ node->disconnect("child_entered_tree", callable_mp(this, &MultiplayerSpawner::_node_added));
+ }
}
Vector<String> MultiplayerSpawner::_get_spawnable_scenes() const {
diff --git a/modules/multiplayer/scene_replication_interface.cpp b/modules/multiplayer/scene_replication_interface.cpp
index 3466cb10df..68b6bc4a24 100644
--- a/modules/multiplayer/scene_replication_interface.cpp
+++ b/modules/multiplayer/scene_replication_interface.cpp
@@ -742,6 +742,7 @@ Error SceneReplicationInterface::on_sync_receive(int p_from, const uint8_t *p_bu
ofs += 4;
uint32_t size = decode_uint32(&p_buffer[ofs]);
ofs += 4;
+ ERR_FAIL_COND_V(size > uint32_t(p_buffer_len - ofs), ERR_INVALID_DATA);
MultiplayerSynchronizer *sync = nullptr;
if (net_id & 0x80000000) {
sync = Object::cast_to<MultiplayerSynchronizer>(multiplayer->get_path_cache()->get_cached_object(p_from, net_id & 0x7FFFFFFF));
@@ -756,14 +757,15 @@ Error SceneReplicationInterface::on_sync_receive(int p_from, const uint8_t *p_bu
}
Node *node = sync->get_root_node();
if (sync->get_multiplayer_authority() != p_from || !node) {
- ERR_CONTINUE(true);
+ // Not valid for me.
+ ofs += size;
+ ERR_CONTINUE_MSG(true, "Ignoring sync data from non-authority or for missing node.");
}
if (!sync->update_inbound_sync_time(time)) {
// State is too old.
ofs += size;
continue;
}
- ERR_FAIL_COND_V(size > uint32_t(p_buffer_len - ofs), ERR_BUG);
const List<NodePath> props = sync->get_replication_config()->get_sync_properties();
Vector<Variant> vars;
vars.resize(props.size());
diff --git a/modules/navigation/godot_navigation_server.cpp b/modules/navigation/godot_navigation_server.cpp
index c3cb1c5f13..79e8c3a6d6 100644
--- a/modules/navigation/godot_navigation_server.cpp
+++ b/modules/navigation/godot_navigation_server.cpp
@@ -757,7 +757,7 @@ COMMAND_1(free, RID, p_object) {
agent_owner.free(p_object);
} else {
- ERR_FAIL_COND("Invalid ID.");
+ ERR_FAIL_COND("Attempted to free a NavigationServer RID that did not exist (or was already freed).");
}
}
diff --git a/modules/webp/SCsub b/modules/webp/SCsub
index 72ad1ea5e4..e78236a60b 100644
--- a/modules/webp/SCsub
+++ b/modules/webp/SCsub
@@ -13,6 +13,7 @@ if env["builtin_libwebp"]:
thirdparty_dir = "#thirdparty/libwebp/"
thirdparty_sources = [
"sharpyuv/sharpyuv.c",
+ "sharpyuv/sharpyuv_cpu.c",
"sharpyuv/sharpyuv_csp.c",
"sharpyuv/sharpyuv_dsp.c",
"sharpyuv/sharpyuv_gamma.c",
diff --git a/modules/websocket/doc_classes/WebSocketMultiplayerPeer.xml b/modules/websocket/doc_classes/WebSocketMultiplayerPeer.xml
index aaeb2025ee..e0d17277ef 100644
--- a/modules/websocket/doc_classes/WebSocketMultiplayerPeer.xml
+++ b/modules/websocket/doc_classes/WebSocketMultiplayerPeer.xml
@@ -16,7 +16,7 @@
<param index="1" name="tls_client_options" type="TLSOptions" default="null" />
<description>
Starts a new multiplayer client connecting to the given [param url]. TLS certificates will be verified against the hostname when connecting using the [code]wss://[/code] protocol. You can pass the optional [param tls_client_options] parameter to customize the trusted certification authorities, or disable the common name verification. See [method TLSOptions.client] and [method TLSOptions.client_unsafe].
- [b]Note[/b]: It is recommended to specify the scheme part of the URL, i.e. the [param url] should start with either [code]ws://[/code] or [code]wss://[/code].
+ [b]Note:[/b] It is recommended to specify the scheme part of the URL, i.e. the [param url] should start with either [code]ws://[/code] or [code]wss://[/code].
</description>
</method>
<method name="create_server">
diff --git a/modules/webxr/native/library_godot_webxr.js b/modules/webxr/native/library_godot_webxr.js
index 1c00ebebb4..5c01d88a30 100644
--- a/modules/webxr/native/library_godot_webxr.js
+++ b/modules/webxr/native/library_godot_webxr.js
@@ -584,12 +584,11 @@ const GodotWebXR = {
}
const buf = GodotRuntime.malloc(point_count * 3 * 4);
- GodotRuntime.setHeapValue(buf, point_count, 'i32');
for (let i = 0; i < point_count; i++) {
const point = GodotWebXR.space.boundsGeometry[i];
- GodotRuntime.setHeapValue(buf + ((i * 3) + 1) * 4, point.x, 'float');
- GodotRuntime.setHeapValue(buf + ((i * 3) + 2) * 4, point.y, 'float');
- GodotRuntime.setHeapValue(buf + ((i * 3) + 3) * 4, point.z, 'float');
+ GodotRuntime.setHeapValue(buf + ((i * 3) + 0) * 4, point.x, 'float');
+ GodotRuntime.setHeapValue(buf + ((i * 3) + 1) * 4, point.y, 'float');
+ GodotRuntime.setHeapValue(buf + ((i * 3) + 2) * 4, point.z, 'float');
}
GodotRuntime.setHeapValue(r_points, buf, 'i32');
diff --git a/platform/android/android_input_handler.cpp b/platform/android/android_input_handler.cpp
index 17903b3965..63045237e9 100644
--- a/platform/android/android_input_handler.cpp
+++ b/platform/android/android_input_handler.cpp
@@ -49,11 +49,19 @@ void AndroidInputHandler::process_joy_event(AndroidInputHandler::JoypadEvent p_e
}
}
-void AndroidInputHandler::_set_key_modifier_state(Ref<InputEventWithModifiers> ev) {
- ev->set_shift_pressed(shift_mem);
- ev->set_alt_pressed(alt_mem);
- ev->set_meta_pressed(meta_mem);
- ev->set_ctrl_pressed(control_mem);
+void AndroidInputHandler::_set_key_modifier_state(Ref<InputEventWithModifiers> ev, Key p_keycode) {
+ if (p_keycode != Key::SHIFT) {
+ ev->set_shift_pressed(shift_mem);
+ }
+ if (p_keycode != Key::ALT) {
+ ev->set_alt_pressed(alt_mem);
+ }
+ if (p_keycode != Key::META) {
+ ev->set_meta_pressed(meta_mem);
+ }
+ if (p_keycode != Key::CTRL) {
+ ev->set_ctrl_pressed(control_mem);
+ }
}
void AndroidInputHandler::process_key_event(int p_physical_keycode, int p_unicode, int p_key_label, bool p_pressed) {
@@ -118,7 +126,7 @@ void AndroidInputHandler::process_key_event(int p_physical_keycode, int p_unicod
ev->set_unicode(fix_unicode(unicode));
ev->set_pressed(p_pressed);
- _set_key_modifier_state(ev);
+ _set_key_modifier_state(ev, keycode);
if (p_physical_keycode == AKEYCODE_BACK) {
if (DisplayServerAndroid *dsa = Object::cast_to<DisplayServerAndroid>(DisplayServer::get_singleton())) {
@@ -129,13 +137,22 @@ void AndroidInputHandler::process_key_event(int p_physical_keycode, int p_unicod
Input::get_singleton()->parse_input_event(ev);
}
-void AndroidInputHandler::_parse_all_touch(bool p_pressed, bool p_double_tap) {
+void AndroidInputHandler::_cancel_all_touch() {
+ _parse_all_touch(false, false, true);
+ touch.clear();
+}
+
+void AndroidInputHandler::_parse_all_touch(bool p_pressed, bool p_double_tap, bool reset_index) {
if (touch.size()) {
//end all if exist
for (int i = 0; i < touch.size(); i++) {
Ref<InputEventScreenTouch> ev;
ev.instantiate();
- ev->set_index(touch[i].id);
+ if (reset_index) {
+ ev->set_index(-1);
+ } else {
+ ev->set_index(touch[i].id);
+ }
ev->set_pressed(p_pressed);
ev->set_position(touch[i].pos);
ev->set_double_tap(p_double_tap);
@@ -196,7 +213,9 @@ void AndroidInputHandler::process_touch_event(int p_event, int p_pointer, const
}
} break;
- case AMOTION_EVENT_ACTION_CANCEL:
+ case AMOTION_EVENT_ACTION_CANCEL: {
+ _cancel_all_touch();
+ } break;
case AMOTION_EVENT_ACTION_UP: { //release
_release_all_touch();
} break;
@@ -236,6 +255,12 @@ void AndroidInputHandler::process_touch_event(int p_event, int p_pointer, const
}
}
+void AndroidInputHandler::_cancel_mouse_event_info(bool p_source_mouse_relative) {
+ buttons_state = BitField<MouseButtonMask>();
+ _parse_mouse_event_info(BitField<MouseButtonMask>(), false, false, p_source_mouse_relative);
+ mouse_event_info.valid = false;
+}
+
void AndroidInputHandler::_parse_mouse_event_info(BitField<MouseButtonMask> event_buttons_mask, bool p_pressed, bool p_double_click, bool p_source_mouse_relative) {
if (!mouse_event_info.valid) {
return;
@@ -243,7 +268,7 @@ void AndroidInputHandler::_parse_mouse_event_info(BitField<MouseButtonMask> even
Ref<InputEventMouseButton> ev;
ev.instantiate();
- _set_key_modifier_state(ev);
+ _set_key_modifier_state(ev, Key::NONE);
if (p_source_mouse_relative) {
ev->set_position(hover_prev_pos);
ev->set_global_position(hover_prev_pos);
@@ -277,7 +302,7 @@ void AndroidInputHandler::process_mouse_event(int p_event_action, int p_event_an
// https://developer.android.com/reference/android/view/MotionEvent.html#ACTION_HOVER_ENTER
Ref<InputEventMouseMotion> ev;
ev.instantiate();
- _set_key_modifier_state(ev);
+ _set_key_modifier_state(ev, Key::NONE);
ev->set_position(p_event_pos);
ev->set_global_position(p_event_pos);
ev->set_relative(p_event_pos - hover_prev_pos);
@@ -296,8 +321,11 @@ void AndroidInputHandler::process_mouse_event(int p_event_action, int p_event_an
_parse_mouse_event_info(event_buttons_mask, true, p_double_click, p_source_mouse_relative);
} break;
+ case AMOTION_EVENT_ACTION_CANCEL: {
+ _cancel_mouse_event_info(p_source_mouse_relative);
+ } break;
+
case AMOTION_EVENT_ACTION_UP:
- case AMOTION_EVENT_ACTION_CANCEL:
case AMOTION_EVENT_ACTION_BUTTON_RELEASE: {
_release_mouse_event_info(p_source_mouse_relative);
} break;
@@ -309,7 +337,7 @@ void AndroidInputHandler::process_mouse_event(int p_event_action, int p_event_an
Ref<InputEventMouseMotion> ev;
ev.instantiate();
- _set_key_modifier_state(ev);
+ _set_key_modifier_state(ev, Key::NONE);
if (p_source_mouse_relative) {
ev->set_position(hover_prev_pos);
ev->set_global_position(hover_prev_pos);
@@ -328,7 +356,7 @@ void AndroidInputHandler::process_mouse_event(int p_event_action, int p_event_an
case AMOTION_EVENT_ACTION_SCROLL: {
Ref<InputEventMouseButton> ev;
ev.instantiate();
- _set_key_modifier_state(ev);
+ _set_key_modifier_state(ev, Key::NONE);
if (p_source_mouse_relative) {
ev->set_position(hover_prev_pos);
ev->set_global_position(hover_prev_pos);
@@ -355,7 +383,7 @@ void AndroidInputHandler::process_mouse_event(int p_event_action, int p_event_an
void AndroidInputHandler::_wheel_button_click(BitField<MouseButtonMask> event_buttons_mask, const Ref<InputEventMouseButton> &ev, MouseButton wheel_button, float factor) {
Ref<InputEventMouseButton> evd = ev->duplicate();
- _set_key_modifier_state(evd);
+ _set_key_modifier_state(evd, Key::NONE);
evd->set_button_index(wheel_button);
evd->set_button_mask(BitField<MouseButtonMask>(event_buttons_mask.operator int64_t() ^ int64_t(mouse_button_to_mask(wheel_button))));
evd->set_factor(factor);
@@ -369,7 +397,7 @@ void AndroidInputHandler::_wheel_button_click(BitField<MouseButtonMask> event_bu
void AndroidInputHandler::process_magnify(Point2 p_pos, float p_factor) {
Ref<InputEventMagnifyGesture> magnify_event;
magnify_event.instantiate();
- _set_key_modifier_state(magnify_event);
+ _set_key_modifier_state(magnify_event, Key::NONE);
magnify_event->set_position(p_pos);
magnify_event->set_factor(p_factor);
Input::get_singleton()->parse_input_event(magnify_event);
@@ -378,7 +406,7 @@ void AndroidInputHandler::process_magnify(Point2 p_pos, float p_factor) {
void AndroidInputHandler::process_pan(Point2 p_pos, Vector2 p_delta) {
Ref<InputEventPanGesture> pan_event;
pan_event.instantiate();
- _set_key_modifier_state(pan_event);
+ _set_key_modifier_state(pan_event, Key::NONE);
pan_event->set_position(p_pos);
pan_event->set_delta(p_delta);
Input::get_singleton()->parse_input_event(pan_event);
diff --git a/platform/android/android_input_handler.h b/platform/android/android_input_handler.h
index 6e53dcfc89..2badd32636 100644
--- a/platform/android/android_input_handler.h
+++ b/platform/android/android_input_handler.h
@@ -76,7 +76,7 @@ private:
MouseEventInfo mouse_event_info;
Point2 hover_prev_pos; // needed to calculate the relative position on hover events
- void _set_key_modifier_state(Ref<InputEventWithModifiers> ev);
+ void _set_key_modifier_state(Ref<InputEventWithModifiers> ev, Key p_keycode);
static MouseButton _button_index_from_mask(BitField<MouseButtonMask> button_mask);
static BitField<MouseButtonMask> _android_button_mask_to_godot_button_mask(int android_button_mask);
@@ -87,10 +87,14 @@ private:
void _release_mouse_event_info(bool p_source_mouse_relative = false);
- void _parse_all_touch(bool p_pressed, bool p_double_tap);
+ void _cancel_mouse_event_info(bool p_source_mouse_relative = false);
+
+ void _parse_all_touch(bool p_pressed, bool p_double_tap, bool reset_index = false);
void _release_all_touch();
+ void _cancel_all_touch();
+
public:
void process_mouse_event(int p_event_action, int p_event_android_buttons_mask, Point2 p_event_pos, Vector2 p_delta, bool p_double_click, bool p_source_mouse_relative);
void process_touch_event(int p_event, int p_pointer, const Vector<TouchPos> &p_points, bool p_double_tap);
diff --git a/platform/android/export/export_plugin.cpp b/platform/android/export/export_plugin.cpp
index fdd2fed836..641258a26c 100644
--- a/platform/android/export/export_plugin.cpp
+++ b/platform/android/export/export_plugin.cpp
@@ -251,7 +251,7 @@ static const int EXPORT_FORMAT_AAB = 1;
static const char *APK_ASSETS_DIRECTORY = "res://android/build/assets";
static const char *AAB_ASSETS_DIRECTORY = "res://android/build/assetPacks/installTime/src/main/assets";
-static const int DEFAULT_MIN_SDK_VERSION = 21; // Should match the value in 'platform/android/java/app/config.gradle#minSdk'
+static const int OPENGL_MIN_SDK_VERSION = 21; // Should match the value in 'platform/android/java/app/config.gradle#minSdk'
static const int VULKAN_MIN_SDK_VERSION = 24;
static const int DEFAULT_TARGET_SDK_VERSION = 32; // Should match the value in 'platform/android/java/app/config.gradle#targetSdk'
@@ -1706,7 +1706,7 @@ void EditorExportPlatformAndroid::get_export_options(List<ExportOption> *r_optio
r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "gradle_build/export_format", PROPERTY_HINT_ENUM, "Export APK,Export AAB"), EXPORT_FORMAT_APK));
// Using String instead of int to default to an empty string (no override) with placeholder for instructions (see GH-62465).
// This implies doing validation that the string is a proper int.
- r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "gradle_build/min_sdk", PROPERTY_HINT_PLACEHOLDER_TEXT, vformat("%d (default)", DEFAULT_MIN_SDK_VERSION)), ""));
+ r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "gradle_build/min_sdk", PROPERTY_HINT_PLACEHOLDER_TEXT, vformat("%d (default)", VULKAN_MIN_SDK_VERSION)), ""));
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "gradle_build/target_sdk", PROPERTY_HINT_PLACEHOLDER_TEXT, vformat("%d (default)", DEFAULT_TARGET_SDK_VERSION)), ""));
Vector<PluginConfigAndroid> plugins_configs = get_plugins();
@@ -2337,7 +2337,7 @@ bool EditorExportPlatformAndroid::has_valid_project_configuration(const Ref<Edit
// Check the min sdk version.
String min_sdk_str = p_preset->get("gradle_build/min_sdk");
- int min_sdk_int = DEFAULT_MIN_SDK_VERSION;
+ int min_sdk_int = VULKAN_MIN_SDK_VERSION;
if (!min_sdk_str.is_empty()) { // Empty means no override, nothing to do.
if (!gradle_build_enabled) {
valid = false;
@@ -2350,9 +2350,9 @@ bool EditorExportPlatformAndroid::has_valid_project_configuration(const Ref<Edit
err += "\n";
} else {
min_sdk_int = min_sdk_str.to_int();
- if (min_sdk_int < DEFAULT_MIN_SDK_VERSION) {
+ if (min_sdk_int < OPENGL_MIN_SDK_VERSION) {
valid = false;
- err += vformat(TTR("\"Min SDK\" cannot be lower than %d, which is the version needed by the Godot library."), DEFAULT_MIN_SDK_VERSION);
+ err += vformat(TTR("\"Min SDK\" cannot be lower than %d, which is the version needed by the Godot library."), OPENGL_MIN_SDK_VERSION);
err += "\n";
}
}
@@ -2808,7 +2808,7 @@ Error EditorExportPlatformAndroid::export_project_helper(const Ref<EditorExportP
String version_name = p_preset->get("version/name");
String min_sdk_version = p_preset->get("gradle_build/min_sdk");
if (!min_sdk_version.is_valid_int()) {
- min_sdk_version = itos(DEFAULT_MIN_SDK_VERSION);
+ min_sdk_version = itos(VULKAN_MIN_SDK_VERSION);
}
String target_sdk_version = p_preset->get("gradle_build/target_sdk");
if (!target_sdk_version.is_valid_int()) {
diff --git a/platform/android/file_access_android.cpp b/platform/android/file_access_android.cpp
index 5df05580a5..1249f2219f 100644
--- a/platform/android/file_access_android.cpp
+++ b/platform/android/file_access_android.cpp
@@ -169,6 +169,10 @@ bool FileAccessAndroid::file_exists(const String &p_path) {
return true;
}
+void FileAccessAndroid::close() {
+ _close();
+}
+
FileAccessAndroid::~FileAccessAndroid() {
_close();
}
diff --git a/platform/android/file_access_android.h b/platform/android/file_access_android.h
index 1d25a28d90..b8f45628e5 100644
--- a/platform/android/file_access_android.h
+++ b/platform/android/file_access_android.h
@@ -78,6 +78,8 @@ public:
virtual uint32_t _get_unix_permissions(const String &p_file) override { return 0; }
virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override { return FAILED; }
+ virtual void close() override;
+
~FileAccessAndroid();
};
diff --git a/platform/android/file_access_filesystem_jandroid.cpp b/platform/android/file_access_filesystem_jandroid.cpp
index 7174d57344..ea8459d1ed 100644
--- a/platform/android/file_access_filesystem_jandroid.cpp
+++ b/platform/android/file_access_filesystem_jandroid.cpp
@@ -333,6 +333,12 @@ void FileAccessFilesystemJAndroid::setup(jobject p_file_access_handler) {
_file_last_modified = env->GetMethodID(cls, "fileLastModified", "(Ljava/lang/String;)J");
}
+void FileAccessFilesystemJAndroid::close() {
+ if (is_open()) {
+ _close();
+ }
+}
+
FileAccessFilesystemJAndroid::FileAccessFilesystemJAndroid() {
id = 0;
}
diff --git a/platform/android/file_access_filesystem_jandroid.h b/platform/android/file_access_filesystem_jandroid.h
index 7829ab7cf9..5e74d9de24 100644
--- a/platform/android/file_access_filesystem_jandroid.h
+++ b/platform/android/file_access_filesystem_jandroid.h
@@ -93,6 +93,8 @@ public:
virtual uint32_t _get_unix_permissions(const String &p_file) override { return 0; }
virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override { return FAILED; }
+ virtual void close() override;
+
FileAccessFilesystemJAndroid();
~FileAccessFilesystemJAndroid();
};
diff --git a/platform/ios/SCsub b/platform/ios/SCsub
index f3925c146f..18ba6617af 100644
--- a/platform/ios/SCsub
+++ b/platform/ios/SCsub
@@ -17,7 +17,6 @@ ios_lib = [
"display_layer.mm",
"godot_app_delegate.m",
"godot_view_renderer.mm",
- "godot_view_gesture_recognizer.mm",
"device_metrics.m",
"keyboard_input_view.mm",
"key_mapping_ios.mm",
diff --git a/platform/ios/godot_view.h b/platform/ios/godot_view.h
index 077584baa6..b00ca37ebe 100644
--- a/platform/ios/godot_view.h
+++ b/platform/ios/godot_view.h
@@ -59,9 +59,4 @@ class String;
- (void)stopRendering;
- (void)startRendering;
-- (void)godotTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
-- (void)godotTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
-- (void)godotTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
-- (void)godotTouchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;
-
@end
diff --git a/platform/ios/godot_view.mm b/platform/ios/godot_view.mm
index 4b10f95ab8..fafec79bf6 100644
--- a/platform/ios/godot_view.mm
+++ b/platform/ios/godot_view.mm
@@ -35,7 +35,6 @@
#include "core/string/ustring.h"
#import "display_layer.h"
#include "display_server_ios.h"
-#import "godot_view_gesture_recognizer.h"
#import "godot_view_renderer.h"
#import <CoreMotion/CoreMotion.h>
@@ -60,8 +59,6 @@ static const float earth_gravity = 9.80665;
@property(strong, nonatomic) CMMotionManager *motionManager;
-@property(strong, nonatomic) GodotViewGestureRecognizer *delayGestureRecognizer;
-
@end
@implementation GodotView
@@ -148,10 +145,6 @@ static const float earth_gravity = 9.80665;
[self.animationTimer invalidate];
self.animationTimer = nil;
}
-
- if (self.delayGestureRecognizer) {
- self.delayGestureRecognizer = nil;
- }
}
- (void)godot_commonInit {
@@ -171,11 +164,6 @@ static const float earth_gravity = 9.80665;
self.motionManager = nil;
}
}
-
- // Initialize delay gesture recognizer
- GodotViewGestureRecognizer *gestureRecognizer = [[GodotViewGestureRecognizer alloc] init];
- self.delayGestureRecognizer = gestureRecognizer;
- [self addGestureRecognizer:self.delayGestureRecognizer];
}
- (void)stopRendering {
@@ -347,58 +335,42 @@ static const float earth_gravity = 9.80665;
}
}
-- (void)godotTouchesBegan:(NSSet *)touchesSet withEvent:(UIEvent *)event {
- NSArray *tlist = [event.allTouches allObjects];
- for (unsigned int i = 0; i < [tlist count]; i++) {
- if ([touchesSet containsObject:[tlist objectAtIndex:i]]) {
- UITouch *touch = [tlist objectAtIndex:i];
- int tid = [self getTouchIDForTouch:touch];
- ERR_FAIL_COND(tid == -1);
- CGPoint touchPoint = [touch locationInView:self];
- DisplayServerIOS::get_singleton()->touch_press(tid, touchPoint.x * self.contentScaleFactor, touchPoint.y * self.contentScaleFactor, true, touch.tapCount > 1);
- }
+- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
+ for (UITouch *touch in touches) {
+ int tid = [self getTouchIDForTouch:touch];
+ ERR_FAIL_COND(tid == -1);
+ CGPoint touchPoint = [touch locationInView:self];
+ DisplayServerIOS::get_singleton()->touch_press(tid, touchPoint.x * self.contentScaleFactor, touchPoint.y * self.contentScaleFactor, true, touch.tapCount > 1);
}
}
-- (void)godotTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
- NSArray *tlist = [event.allTouches allObjects];
- for (unsigned int i = 0; i < [tlist count]; i++) {
- if ([touches containsObject:[tlist objectAtIndex:i]]) {
- UITouch *touch = [tlist objectAtIndex:i];
- int tid = [self getTouchIDForTouch:touch];
- ERR_FAIL_COND(tid == -1);
- CGPoint touchPoint = [touch locationInView:self];
- CGPoint prev_point = [touch previousLocationInView:self];
- CGFloat alt = [touch altitudeAngle];
- CGVector azim = [touch azimuthUnitVectorInView:self];
- DisplayServerIOS::get_singleton()->touch_drag(tid, prev_point.x * self.contentScaleFactor, prev_point.y * self.contentScaleFactor, touchPoint.x * self.contentScaleFactor, touchPoint.y * self.contentScaleFactor, [touch force] / [touch maximumPossibleForce], Vector2(azim.dx, azim.dy) * Math::cos(alt));
- }
+- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
+ for (UITouch *touch in touches) {
+ int tid = [self getTouchIDForTouch:touch];
+ ERR_FAIL_COND(tid == -1);
+ CGPoint touchPoint = [touch locationInView:self];
+ CGPoint prev_point = [touch previousLocationInView:self];
+ CGFloat alt = [touch altitudeAngle];
+ CGVector azim = [touch azimuthUnitVectorInView:self];
+ DisplayServerIOS::get_singleton()->touch_drag(tid, prev_point.x * self.contentScaleFactor, prev_point.y * self.contentScaleFactor, touchPoint.x * self.contentScaleFactor, touchPoint.y * self.contentScaleFactor, [touch force] / [touch maximumPossibleForce], Vector2(azim.dx, azim.dy) * Math::cos(alt));
}
}
-- (void)godotTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
- NSArray *tlist = [event.allTouches allObjects];
- for (unsigned int i = 0; i < [tlist count]; i++) {
- if ([touches containsObject:[tlist objectAtIndex:i]]) {
- UITouch *touch = [tlist objectAtIndex:i];
- int tid = [self getTouchIDForTouch:touch];
- ERR_FAIL_COND(tid == -1);
- [self removeTouch:touch];
- CGPoint touchPoint = [touch locationInView:self];
- DisplayServerIOS::get_singleton()->touch_press(tid, touchPoint.x * self.contentScaleFactor, touchPoint.y * self.contentScaleFactor, false, false);
- }
+- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
+ for (UITouch *touch in touches) {
+ int tid = [self getTouchIDForTouch:touch];
+ ERR_FAIL_COND(tid == -1);
+ [self removeTouch:touch];
+ CGPoint touchPoint = [touch locationInView:self];
+ DisplayServerIOS::get_singleton()->touch_press(tid, touchPoint.x * self.contentScaleFactor, touchPoint.y * self.contentScaleFactor, false, false);
}
}
-- (void)godotTouchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
- NSArray *tlist = [event.allTouches allObjects];
- for (unsigned int i = 0; i < [tlist count]; i++) {
- if ([touches containsObject:[tlist objectAtIndex:i]]) {
- UITouch *touch = [tlist objectAtIndex:i];
- int tid = [self getTouchIDForTouch:touch];
- ERR_FAIL_COND(tid == -1);
- DisplayServerIOS::get_singleton()->touches_canceled(tid);
- }
+- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
+ for (UITouch *touch in touches) {
+ int tid = [self getTouchIDForTouch:touch];
+ ERR_FAIL_COND(tid == -1);
+ DisplayServerIOS::get_singleton()->touches_canceled(tid);
}
[self clearTouches];
}
diff --git a/platform/ios/godot_view_gesture_recognizer.mm b/platform/ios/godot_view_gesture_recognizer.mm
deleted file mode 100644
index 9b71228864..0000000000
--- a/platform/ios/godot_view_gesture_recognizer.mm
+++ /dev/null
@@ -1,186 +0,0 @@
-/**************************************************************************/
-/* godot_view_gesture_recognizer.mm */
-/**************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/**************************************************************************/
-/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
-/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/**************************************************************************/
-
-#import "godot_view_gesture_recognizer.h"
-
-#import "godot_view.h"
-
-#include "core/config/project_settings.h"
-
-// Minimum distance for touches to move to fire
-// a delay timer before scheduled time.
-// Should be the low enough to not cause issues with dragging
-// but big enough to allow click to work.
-const CGFloat kGLGestureMovementDistance = 0.5;
-
-@interface GodotViewGestureRecognizer ()
-
-@property(nonatomic, readwrite, assign) NSTimeInterval delayTimeInterval;
-
-@end
-
-@interface GodotViewGestureRecognizer ()
-
-// Timer used to delay begin touch message.
-// Should work as simple emulation of UIDelayedAction
-@property(strong, nonatomic) NSTimer *delayTimer;
-
-// Delayed touch parameters
-@property(strong, nonatomic) NSSet *delayedTouches;
-@property(strong, nonatomic) UIEvent *delayedEvent;
-
-@end
-
-@implementation GodotViewGestureRecognizer
-
-- (GodotView *)godotView {
- return (GodotView *)self.view;
-}
-
-- (instancetype)init {
- self = [super init];
-
- self.cancelsTouchesInView = YES;
- self.delaysTouchesBegan = YES;
- self.delaysTouchesEnded = YES;
- self.requiresExclusiveTouchType = NO;
-
- self.delayTimeInterval = GLOBAL_GET("input_devices/pointing/ios/touch_delay");
-
- return self;
-}
-
-- (void)dealloc {
- if (self.delayTimer) {
- [self.delayTimer invalidate];
- self.delayTimer = nil;
- }
-
- if (self.delayedTouches) {
- self.delayedTouches = nil;
- }
-
- if (self.delayedEvent) {
- self.delayedEvent = nil;
- }
-}
-
-- (void)delayTouches:(NSSet *)touches andEvent:(UIEvent *)event {
- [self.delayTimer fire];
-
- self.delayedTouches = touches;
- self.delayedEvent = event;
-
- self.delayTimer = [NSTimer
- scheduledTimerWithTimeInterval:self.delayTimeInterval
- target:self
- selector:@selector(fireDelayedTouches:)
- userInfo:nil
- repeats:NO];
-}
-
-- (void)fireDelayedTouches:(id)timer {
- [self.delayTimer invalidate];
- self.delayTimer = nil;
-
- if (self.delayedTouches) {
- [self.godotView godotTouchesBegan:self.delayedTouches withEvent:self.delayedEvent];
- }
-
- self.delayedTouches = nil;
- self.delayedEvent = nil;
-}
-
-- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
- NSSet *cleared = [self copyClearedTouches:touches phase:UITouchPhaseBegan];
- [self delayTouches:cleared andEvent:event];
-
- [super touchesBegan:touches withEvent:event];
-}
-
-- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
- NSSet *cleared = [self copyClearedTouches:touches phase:UITouchPhaseMoved];
-
- if (self.delayTimer) {
- // We should check if movement was significant enough to fire an event
- // for dragging to work correctly.
- for (UITouch *touch in cleared) {
- CGPoint from = [touch locationInView:self.godotView];
- CGPoint to = [touch previousLocationInView:self.godotView];
- CGFloat xDistance = from.x - to.x;
- CGFloat yDistance = from.y - to.y;
-
- CGFloat distance = sqrt(xDistance * xDistance + yDistance * yDistance);
-
- // Early exit, since one of touches has moved enough to fire a drag event.
- if (distance > kGLGestureMovementDistance) {
- [self.delayTimer fire];
- [self.godotView godotTouchesMoved:cleared withEvent:event];
- return;
- }
- }
-
- return;
- }
-
- [self.godotView godotTouchesMoved:cleared withEvent:event];
-
- [super touchesMoved:touches withEvent:event];
-}
-
-- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
- [self.delayTimer fire];
-
- NSSet *cleared = [self copyClearedTouches:touches phase:UITouchPhaseEnded];
- [self.godotView godotTouchesEnded:cleared withEvent:event];
-
- [super touchesEnded:touches withEvent:event];
-}
-
-- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
- [self.delayTimer fire];
- [self.godotView godotTouchesCancelled:touches withEvent:event];
-
- [super touchesCancelled:touches withEvent:event];
-}
-
-- (NSSet *)copyClearedTouches:(NSSet *)touches phase:(UITouchPhase)phaseToSave {
- NSMutableSet *cleared = [touches mutableCopy];
-
- for (UITouch *touch in touches) {
- if (touch.view != self.view || touch.phase != phaseToSave) {
- [cleared removeObject:touch];
- }
- }
-
- return cleared;
-}
-
-@end
diff --git a/platform/linuxbsd/SCsub b/platform/linuxbsd/SCsub
index 3c5dc78c60..4dd74ff9d0 100644
--- a/platform/linuxbsd/SCsub
+++ b/platform/linuxbsd/SCsub
@@ -11,23 +11,30 @@ common_linuxbsd = [
"joypad_linux.cpp",
"freedesktop_portal_desktop.cpp",
"freedesktop_screensaver.cpp",
- "xkbcommon-so_wrap.c",
]
+if env["use_sowrap"]:
+ common_linuxbsd.append("xkbcommon-so_wrap.c")
+
if env["x11"]:
common_linuxbsd += SConscript("x11/SCsub")
if env["speechd"]:
- common_linuxbsd.append(["speechd-so_wrap.c", "tts_linux.cpp"])
+ common_linuxbsd.append("tts_linux.cpp")
+ if env["use_sowrap"]:
+ common_linuxbsd.append("speechd-so_wrap.c")
if env["fontconfig"]:
- common_linuxbsd.append("fontconfig-so_wrap.c")
+ if env["use_sowrap"]:
+ common_linuxbsd.append("fontconfig-so_wrap.c")
if env["udev"]:
- common_linuxbsd.append("libudev-so_wrap.c")
+ if env["use_sowrap"]:
+ common_linuxbsd.append("libudev-so_wrap.c")
if env["dbus"]:
- common_linuxbsd.append("dbus-so_wrap.c")
+ if env["use_sowrap"]:
+ common_linuxbsd.append("dbus-so_wrap.c")
prog = env.add_program("#bin/godot", ["godot_linuxbsd.cpp"] + common_linuxbsd)
diff --git a/platform/linuxbsd/detect.py b/platform/linuxbsd/detect.py
index 36e149f2b4..af2a271476 100644
--- a/platform/linuxbsd/detect.py
+++ b/platform/linuxbsd/detect.py
@@ -43,6 +43,7 @@ def get_opts():
BoolVariable("use_lsan", "Use LLVM/GCC compiler leak sanitizer (LSAN)", False),
BoolVariable("use_tsan", "Use LLVM/GCC compiler thread sanitizer (TSAN)", False),
BoolVariable("use_msan", "Use LLVM compiler memory sanitizer (MSAN)", False),
+ BoolVariable("use_sowrap", "Dynamically load system libraries", True),
BoolVariable("alsa", "Use ALSA", True),
BoolVariable("pulseaudio", "Use PulseAudio", True),
BoolVariable("dbus", "Use D-Bus to handle screensaver and portal desktop settings", True),
@@ -184,6 +185,9 @@ def configure(env: "Environment"):
## Dependencies
+ if env["use_sowrap"]:
+ env.Append(CPPDEFINES=["SOWRAP_ENABLED"])
+
if env["touch"]:
env.Append(CPPDEFINES=["TOUCH_ENABLED"])
@@ -271,26 +275,83 @@ def configure(env: "Environment"):
env.Append(LIBS=["embree3"])
## Flags
-
if env["fontconfig"]:
- env.Append(CPPDEFINES=["FONTCONFIG_ENABLED"])
+ if not env["use_sowrap"]:
+ if os.system("pkg-config --exists fontconfig") == 0: # 0 means found
+ env.ParseConfig("pkg-config fontconfig --cflags --libs")
+ env.Append(CPPDEFINES=["FONTCONFIG_ENABLED"])
+ else:
+ print("Warning: fontconfig development libraries not found. Disabling the system fonts support.")
+ env["fontconfig"] = False
+ else:
+ env.Append(CPPDEFINES=["FONTCONFIG_ENABLED"])
if env["alsa"]:
- env.Append(CPPDEFINES=["ALSA_ENABLED", "ALSAMIDI_ENABLED"])
+ if not env["use_sowrap"]:
+ if os.system("pkg-config --exists alsa") == 0: # 0 means found
+ env.ParseConfig("pkg-config alsa --cflags --libs")
+ env.Append(CPPDEFINES=["ALSA_ENABLED", "ALSAMIDI_ENABLED"])
+ else:
+ print("Warning: ALSA development libraries not found. Disabling the ALSA audio driver.")
+ env["alsa"] = False
+ else:
+ env.Append(CPPDEFINES=["ALSA_ENABLED", "ALSAMIDI_ENABLED"])
if env["pulseaudio"]:
+ if not env["use_sowrap"]:
+ if os.system("pkg-config --exists libpulse") == 0: # 0 means found
+ env.ParseConfig("pkg-config libpulse --cflags --libs")
+ env.Append(CPPDEFINES=["PULSEAUDIO_ENABLED", "_REENTRANT"])
+ else:
+ print("Warning: PulseAudio development libraries not found. Disabling the PulseAudio audio driver.")
+ env["pulseaudio"] = False
env.Append(CPPDEFINES=["PULSEAUDIO_ENABLED", "_REENTRANT"])
if env["dbus"]:
- env.Append(CPPDEFINES=["DBUS_ENABLED"])
+ if not env["use_sowrap"]:
+ if os.system("pkg-config --exists dbus-1") == 0: # 0 means found
+ env.ParseConfig("pkg-config dbus-1 --cflags --libs")
+ env.Append(CPPDEFINES=["DBUS_ENABLED"])
+ else:
+ print("Warning: D-Bus development libraries not found. Disabling screensaver prevention.")
+ env["dbus"] = False
+ else:
+ env.Append(CPPDEFINES=["DBUS_ENABLED"])
if env["speechd"]:
- env.Append(CPPDEFINES=["SPEECHD_ENABLED"])
+ if not env["use_sowrap"]:
+ if os.system("pkg-config --exists speech-dispatcher") == 0: # 0 means found
+ env.ParseConfig("pkg-config speech-dispatcher --cflags --libs")
+ env.Append(CPPDEFINES=["SPEECHD_ENABLED"])
+ else:
+ print("Warning: speech-dispatcher development libraries not found. Disabling text to speech support.")
+ env["speechd"] = False
+ else:
+ env.Append(CPPDEFINES=["SPEECHD_ENABLED"])
+
+ if not env["use_sowrap"]:
+ if os.system("pkg-config --exists xkbcommon") == 0: # 0 means found
+ env.ParseConfig("pkg-config xkbcommon --cflags --libs")
+ env.Append(CPPDEFINES=["XKB_ENABLED"])
+ else:
+ print(
+ "Warning: libxkbcommon development libraries not found. Disabling dead key composition and key label support."
+ )
+ else:
+ env.Append(CPPDEFINES=["XKB_ENABLED"])
if platform.system() == "Linux":
env.Append(CPPDEFINES=["JOYDEV_ENABLED"])
if env["udev"]:
- env.Append(CPPDEFINES=["UDEV_ENABLED"])
+ if not env["use_sowrap"]:
+ if os.system("pkg-config --exists libudev") == 0: # 0 means found
+ env.ParseConfig("pkg-config libudev --cflags --libs")
+ env.Append(CPPDEFINES=["UDEV_ENABLED"])
+ else:
+ print("Warning: libudev development libraries not found. Disabling controller hotplugging support.")
+ env["udev"] = False
+ else:
+ env.Append(CPPDEFINES=["UDEV_ENABLED"])
else:
env["udev"] = False # Linux specific
@@ -298,7 +359,9 @@ def configure(env: "Environment"):
if not env["builtin_zlib"]:
env.ParseConfig("pkg-config zlib --cflags --libs")
- env.Prepend(CPPPATH=["#platform/linuxbsd", "#thirdparty/linuxbsd_headers"])
+ env.Prepend(CPPPATH=["#platform/linuxbsd"])
+ if env["use_sowrap"]:
+ env.Prepend(CPPPATH=["#thirdparty/linuxbsd_headers"])
env.Append(
CPPDEFINES=[
@@ -309,6 +372,35 @@ def configure(env: "Environment"):
)
if env["x11"]:
+ if not env["use_sowrap"]:
+ if os.system("pkg-config --exists x11"):
+ print("Error: X11 libraries not found. Aborting.")
+ sys.exit(255)
+ env.ParseConfig("pkg-config x11 --cflags --libs")
+ if os.system("pkg-config --exists xcursor"):
+ print("Error: Xcursor library not found. Aborting.")
+ sys.exit(255)
+ env.ParseConfig("pkg-config xcursor --cflags --libs")
+ if os.system("pkg-config --exists xinerama"):
+ print("Error: Xinerama library not found. Aborting.")
+ sys.exit(255)
+ env.ParseConfig("pkg-config xinerama --cflags --libs")
+ if os.system("pkg-config --exists xext"):
+ print("Error: Xext library not found. Aborting.")
+ sys.exit(255)
+ env.ParseConfig("pkg-config xext --cflags --libs")
+ if os.system("pkg-config --exists xrandr"):
+ print("Error: XrandR library not found. Aborting.")
+ sys.exit(255)
+ env.ParseConfig("pkg-config xrandr --cflags --libs")
+ if os.system("pkg-config --exists xrender"):
+ print("Error: XRender library not found. Aborting.")
+ sys.exit(255)
+ env.ParseConfig("pkg-config xrender --cflags --libs")
+ if os.system("pkg-config --exists xi"):
+ print("Error: Xi library not found. Aborting.")
+ sys.exit(255)
+ env.ParseConfig("pkg-config xi --cflags --libs")
env.Append(CPPDEFINES=["X11_ENABLED"])
if env["vulkan"]:
@@ -346,7 +438,7 @@ def configure(env: "Environment"):
gnu_ld_version = re.search("^GNU ld [^$]*(\d+\.\d+)$", linker_version_str, re.MULTILINE)
if not gnu_ld_version:
print(
- "Warning: Creating template binaries enabled for PCK embedding is currently only supported with GNU ld, not gold or LLD."
+ "Warning: Creating export template binaries enabled for PCK embedding is currently only supported with GNU ld, not gold, LLD or mold."
)
else:
if float(gnu_ld_version.group(1)) >= 2.30:
diff --git a/platform/linuxbsd/freedesktop_portal_desktop.cpp b/platform/linuxbsd/freedesktop_portal_desktop.cpp
index 72d4e3772f..ec1fcf6698 100644
--- a/platform/linuxbsd/freedesktop_portal_desktop.cpp
+++ b/platform/linuxbsd/freedesktop_portal_desktop.cpp
@@ -36,7 +36,11 @@
#include "core/os/os.h"
#include "core/string/ustring.h"
+#ifdef SOWRAP_ENABLED
#include "dbus-so_wrap.h"
+#else
+#include <dbus/dbus.h>
+#endif
#include "core/variant/variant.h"
@@ -124,12 +128,16 @@ uint32_t FreeDesktopPortalDesktop::get_appearance_color_scheme() {
}
FreeDesktopPortalDesktop::FreeDesktopPortalDesktop() {
+#ifdef SOWRAP_ENABLED
#ifdef DEBUG_ENABLED
int dylibloader_verbose = 1;
#else
int dylibloader_verbose = 0;
#endif
unsupported = (initialize_dbus(dylibloader_verbose) != 0);
+#else
+ unsupported = false;
+#endif
}
#endif // DBUS_ENABLED
diff --git a/platform/linuxbsd/freedesktop_screensaver.cpp b/platform/linuxbsd/freedesktop_screensaver.cpp
index 159fd0df61..d07e781a5f 100644
--- a/platform/linuxbsd/freedesktop_screensaver.cpp
+++ b/platform/linuxbsd/freedesktop_screensaver.cpp
@@ -34,7 +34,11 @@
#include "core/config/project_settings.h"
+#ifdef SOWRAP_ENABLED
#include "dbus-so_wrap.h"
+#else
+#include <dbus/dbus.h>
+#endif
#define BUS_OBJECT_NAME "org.freedesktop.ScreenSaver"
#define BUS_OBJECT_PATH "/org/freedesktop/ScreenSaver"
@@ -127,12 +131,16 @@ void FreeDesktopScreenSaver::uninhibit() {
}
FreeDesktopScreenSaver::FreeDesktopScreenSaver() {
+#ifdef SOWRAP_ENABLED
#ifdef DEBUG_ENABLED
int dylibloader_verbose = 1;
#else
int dylibloader_verbose = 0;
#endif
unsupported = (initialize_dbus(dylibloader_verbose) != 0);
+#else
+ unsupported = false;
+#endif
}
#endif // DBUS_ENABLED
diff --git a/platform/linuxbsd/joypad_linux.cpp b/platform/linuxbsd/joypad_linux.cpp
index b77f989677..0256af0a59 100644
--- a/platform/linuxbsd/joypad_linux.cpp
+++ b/platform/linuxbsd/joypad_linux.cpp
@@ -39,7 +39,11 @@
#include <unistd.h>
#ifdef UDEV_ENABLED
+#ifdef SOWRAP_ENABLED
#include "libudev-so_wrap.h"
+#else
+#include <libudev.h>
+#endif
#endif
#define LONG_BITS (sizeof(long) * 8)
@@ -70,6 +74,7 @@ void JoypadLinux::Joypad::reset() {
JoypadLinux::JoypadLinux(Input *in) {
#ifdef UDEV_ENABLED
+#ifdef SOWRAP_ENABLED
#ifdef DEBUG_ENABLED
int dylibloader_verbose = 1;
#else
@@ -81,6 +86,7 @@ JoypadLinux::JoypadLinux(Input *in) {
} else {
print_verbose("JoypadLinux: udev enabled, but couldn't be loaded. Falling back to /dev/input to detect joypads.");
}
+#endif
#else
print_verbose("JoypadLinux: udev disabled, parsing /dev/input to detect joypads.");
#endif
diff --git a/platform/linuxbsd/os_linuxbsd.cpp b/platform/linuxbsd/os_linuxbsd.cpp
index 41d1f1d050..54bb34ef73 100644
--- a/platform/linuxbsd/os_linuxbsd.cpp
+++ b/platform/linuxbsd/os_linuxbsd.cpp
@@ -1083,12 +1083,16 @@ OS_LinuxBSD::OS_LinuxBSD() {
#endif
#ifdef FONTCONFIG_ENABLED
+#ifdef SOWRAP_ENABLED
#ifdef DEBUG_ENABLED
int dylibloader_verbose = 1;
#else
int dylibloader_verbose = 0;
#endif
font_config_initialized = (initialize_fontconfig(dylibloader_verbose) == 0);
+#else
+ font_config_initialized = true;
+#endif
if (font_config_initialized) {
config = FcInitLoadConfigAndFonts();
if (!config) {
diff --git a/platform/linuxbsd/os_linuxbsd.h b/platform/linuxbsd/os_linuxbsd.h
index 045d3d95ba..9423514944 100644
--- a/platform/linuxbsd/os_linuxbsd.h
+++ b/platform/linuxbsd/os_linuxbsd.h
@@ -41,7 +41,11 @@
#include "servers/audio_server.h"
#ifdef FONTCONFIG_ENABLED
+#ifdef SOWRAP_ENABLED
#include "fontconfig-so_wrap.h"
+#else
+#include <fontconfig/fontconfig.h>
+#endif
#endif
class OS_LinuxBSD : public OS_Unix {
diff --git a/platform/linuxbsd/tts_linux.cpp b/platform/linuxbsd/tts_linux.cpp
index 4662aaf02d..04d7c5444f 100644
--- a/platform/linuxbsd/tts_linux.cpp
+++ b/platform/linuxbsd/tts_linux.cpp
@@ -39,12 +39,18 @@ void TTS_Linux::speech_init_thread_func(void *p_userdata) {
TTS_Linux *tts = (TTS_Linux *)p_userdata;
if (tts) {
MutexLock thread_safe_method(tts->_thread_safe_);
+#ifdef SOWRAP_ENABLED
#ifdef DEBUG_ENABLED
int dylibloader_verbose = 1;
#else
int dylibloader_verbose = 0;
#endif
- if (initialize_speechd(dylibloader_verbose) == 0) {
+ if (initialize_speechd(dylibloader_verbose) != 0) {
+ print_verbose("Text-to-Speech: Cannot load Speech Dispatcher library!");
+ } else {
+#else
+ {
+#endif
CharString class_str;
String config_name = GLOBAL_GET("application/config/name");
if (config_name.length() == 0) {
@@ -64,8 +70,6 @@ void TTS_Linux::speech_init_thread_func(void *p_userdata) {
} else {
print_verbose("Text-to-Speech: Cannot initialize Speech Dispatcher synthesizer!");
}
- } else {
- print_verbose("Text-to-Speech: Cannot load Speech Dispatcher library!");
}
}
}
diff --git a/platform/linuxbsd/tts_linux.h b/platform/linuxbsd/tts_linux.h
index 425654d975..3fe7b659d0 100644
--- a/platform/linuxbsd/tts_linux.h
+++ b/platform/linuxbsd/tts_linux.h
@@ -39,7 +39,11 @@
#include "core/variant/array.h"
#include "servers/display_server.h"
+#ifdef SOWRAP_ENABLED
#include "speechd-so_wrap.h"
+#else
+#include <libspeechd.h>
+#endif
class TTS_Linux {
_THREAD_SAFE_CLASS_
diff --git a/platform/linuxbsd/x11/SCsub b/platform/linuxbsd/x11/SCsub
index 8b2e2aabe4..a4890391ce 100644
--- a/platform/linuxbsd/x11/SCsub
+++ b/platform/linuxbsd/x11/SCsub
@@ -5,15 +5,21 @@ Import("env")
source_files = [
"display_server_x11.cpp",
"key_mapping_x11.cpp",
- "dynwrappers/xlib-so_wrap.c",
- "dynwrappers/xcursor-so_wrap.c",
- "dynwrappers/xinerama-so_wrap.c",
- "dynwrappers/xinput2-so_wrap.c",
- "dynwrappers/xrandr-so_wrap.c",
- "dynwrappers/xrender-so_wrap.c",
- "dynwrappers/xext-so_wrap.c",
]
+if env["use_sowrap"]:
+ source_files.append(
+ [
+ "dynwrappers/xlib-so_wrap.c",
+ "dynwrappers/xcursor-so_wrap.c",
+ "dynwrappers/xinerama-so_wrap.c",
+ "dynwrappers/xinput2-so_wrap.c",
+ "dynwrappers/xrandr-so_wrap.c",
+ "dynwrappers/xrender-so_wrap.c",
+ "dynwrappers/xext-so_wrap.c",
+ ]
+ )
+
if env["vulkan"]:
source_files.append("vulkan_context_x11.cpp")
diff --git a/platform/linuxbsd/x11/detect_prime_x11.cpp b/platform/linuxbsd/x11/detect_prime_x11.cpp
index 8d586599e6..3d07be1c76 100644
--- a/platform/linuxbsd/x11/detect_prime_x11.cpp
+++ b/platform/linuxbsd/x11/detect_prime_x11.cpp
@@ -41,7 +41,13 @@
#include "thirdparty/glad/glad/gl.h"
#include "thirdparty/glad/glad/glx.h"
+#ifdef SOWRAP_ENABLED
#include "dynwrappers/xlib-so_wrap.h"
+#else
+#include <X11/XKBlib.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#endif
#include <cstring>
diff --git a/platform/linuxbsd/x11/display_server_x11.cpp b/platform/linuxbsd/x11/display_server_x11.cpp
index 525c62fbf2..896b7b95eb 100644
--- a/platform/linuxbsd/x11/display_server_x11.cpp
+++ b/platform/linuxbsd/x11/display_server_x11.cpp
@@ -1329,12 +1329,14 @@ void DisplayServerX11::delete_sub_window(WindowID p_id) {
wd.xic = nullptr;
}
XDestroyWindow(x11_display, wd.x11_xim_window);
+#ifdef XKB_ENABLED
if (xkb_loaded) {
if (wd.xkb_state) {
xkb_compose_state_unref(wd.xkb_state);
wd.xkb_state = nullptr;
}
}
+#endif
XUnmapWindow(x11_display, wd.x11_window);
XDestroyWindow(x11_display, wd.x11_window);
@@ -2942,11 +2944,13 @@ void DisplayServerX11::_handle_key_event(WindowID p_window, XKeyEvent *p_event,
XLookupString(&xkeyevent_no_mod, nullptr, 0, &keysym_keycode, nullptr);
String keysym;
+#ifdef XKB_ENABLED
if (xkb_loaded) {
KeySym keysym_unicode_nm = 0; // keysym used to find unicode
XLookupString(&xkeyevent_no_mod, nullptr, 0, &keysym_unicode_nm, nullptr);
keysym = String::chr(xkb_keysym_to_utf32(xkb_keysym_to_upper(keysym_unicode_nm)));
}
+#endif
// Meanwhile, XLookupString returns keysyms useful for unicode.
@@ -3035,6 +3039,7 @@ void DisplayServerX11::_handle_key_event(WindowID p_window, XKeyEvent *p_event,
}
} while (status == XBufferOverflow);
#endif
+#ifdef XKB_ENABLED
} else if (xkeyevent->type == KeyPress && wd.xkb_state && xkb_loaded) {
xkb_compose_feed_result res = xkb_compose_state_feed(wd.xkb_state, keysym_unicode);
if (res == XKB_COMPOSE_FEED_ACCEPTED) {
@@ -3093,6 +3098,7 @@ void DisplayServerX11::_handle_key_event(WindowID p_window, XKeyEvent *p_event,
return;
}
}
+#endif
}
/* Phase 2, obtain a Godot keycode from the keysym */
@@ -4936,6 +4942,11 @@ DisplayServerX11::WindowID DisplayServerX11::_create_window(WindowMode p_mode, V
win_rect.position = wpos;
}
+ // Position and size hints are set from these values before they are updated to the actual
+ // window size, so we need to initialize them here.
+ wd.position = win_rect.position;
+ wd.size = win_rect.size;
+
{
wd.x11_window = XCreateWindow(x11_display, RootWindow(x11_display, visualInfo.screen), win_rect.position.x, win_rect.position.y, win_rect.size.width > 0 ? win_rect.size.width : 1, win_rect.size.height > 0 ? win_rect.size.height : 1, 0, visualInfo.depth, InputOutput, visualInfo.visual, valuemask, &windowAttributes);
@@ -4943,11 +4954,11 @@ DisplayServerX11::WindowID DisplayServerX11::_create_window(WindowMode p_mode, V
window_attributes_ime.event_mask = KeyPressMask | KeyReleaseMask | StructureNotifyMask | ExposureMask;
wd.x11_xim_window = XCreateWindow(x11_display, wd.x11_window, 0, 0, 1, 1, 0, CopyFromParent, InputOnly, CopyFromParent, CWEventMask, &window_attributes_ime);
-
+#ifdef XKB_ENABLED
if (dead_tbl && xkb_loaded) {
wd.xkb_state = xkb_compose_state_new(dead_tbl, XKB_COMPOSE_STATE_NO_FLAGS);
}
-
+#endif
// Enable receiving notification when the window is initialized (MapNotify)
// so the focus can be set at the right time.
if (!wd.no_focus && !wd.is_popup) {
@@ -5212,6 +5223,7 @@ static ::XIMStyle _get_best_xim_style(const ::XIMStyle &p_style_a, const ::XIMSt
DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Vector2i *p_position, const Vector2i &p_resolution, int p_screen, Error &r_error) {
KeyMappingX11::initialize();
+#ifdef SOWRAP_ENABLED
#ifdef DEBUG_ENABLED
int dylibloader_verbose = 1;
#else
@@ -5226,9 +5238,9 @@ DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode
r_error = ERR_UNAVAILABLE;
ERR_FAIL_MSG("Can't load XCursor dynamically.");
}
-
+#ifdef XKB_ENABLED
xkb_loaded = (initialize_xkbcommon(dylibloader_verbose) == 0);
-
+#endif
if (initialize_xext(dylibloader_verbose) != 0) {
r_error = ERR_UNAVAILABLE;
ERR_FAIL_MSG("Can't load Xext dynamically.");
@@ -5253,7 +5265,13 @@ DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode
r_error = ERR_UNAVAILABLE;
ERR_FAIL_MSG("Can't load Xinput2 dynamically.");
}
+#else
+#ifdef XKB_ENABLED
+ xkb_loaded = true;
+#endif
+#endif
+#ifdef XKB_ENABLED
if (xkb_loaded) {
xkb_ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
if (xkb_ctx) {
@@ -5270,6 +5288,7 @@ DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode
dead_tbl = xkb_compose_table_new_from_locale(xkb_ctx, locale, XKB_COMPOSE_COMPILE_NO_FLAGS);
}
}
+#endif
Input::get_singleton()->set_event_dispatch_function(_dispatch_input_events);
@@ -5712,16 +5731,19 @@ DisplayServerX11::~DisplayServerX11() {
wd.xic = nullptr;
}
XDestroyWindow(x11_display, wd.x11_xim_window);
+#ifdef XKB_ENABLED
if (xkb_loaded) {
if (wd.xkb_state) {
xkb_compose_state_unref(wd.xkb_state);
wd.xkb_state = nullptr;
}
}
+#endif
XUnmapWindow(x11_display, wd.x11_window);
XDestroyWindow(x11_display, wd.x11_window);
}
+#ifdef XKB_ENABLED
if (xkb_loaded) {
if (dead_tbl) {
xkb_compose_table_unref(dead_tbl);
@@ -5730,6 +5752,7 @@ DisplayServerX11::~DisplayServerX11() {
xkb_context_unref(xkb_ctx);
}
}
+#endif
//destroy drivers
#if defined(VULKAN_ENABLED)
diff --git a/platform/linuxbsd/x11/display_server_x11.h b/platform/linuxbsd/x11/display_server_x11.h
index ea54b42262..dbe8a0ce2b 100644
--- a/platform/linuxbsd/x11/display_server_x11.h
+++ b/platform/linuxbsd/x11/display_server_x11.h
@@ -36,6 +36,8 @@
#include "servers/display_server.h"
#include "core/input/input.h"
+#include "core/os/mutex.h"
+#include "core/os/thread.h"
#include "core/templates/local_vector.h"
#include "drivers/alsa/audio_driver_alsa.h"
#include "drivers/alsamidi/midi_driver_alsamidi.h"
@@ -69,6 +71,7 @@
#include <X11/Xutil.h>
#include <X11/keysym.h>
+#ifdef SOWRAP_ENABLED
#include "dynwrappers/xlib-so_wrap.h"
#include "dynwrappers/xcursor-so_wrap.h"
@@ -79,6 +82,25 @@
#include "dynwrappers/xrender-so_wrap.h"
#include "../xkbcommon-so_wrap.h"
+#else
+#include <X11/XKBlib.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+#include <X11/Xcursor/Xcursor.h>
+#include <X11/extensions/XInput2.h>
+#include <X11/extensions/Xext.h>
+#include <X11/extensions/Xinerama.h>
+#include <X11/extensions/Xrandr.h>
+#include <X11/extensions/Xrender.h>
+#include <X11/extensions/shape.h>
+
+#ifdef XKB_ENABLED
+#include <xkbcommon/xkbcommon-compose.h>
+#include <xkbcommon/xkbcommon-keysyms.h>
+#include <xkbcommon/xkbcommon.h>
+#endif
+#endif
typedef struct _xrr_monitor_info {
Atom name;
@@ -142,7 +164,9 @@ class DisplayServerX11 : public DisplayServer {
bool ime_active = false;
bool ime_in_progress = false;
bool ime_suppress_next_keyup = false;
+#ifdef XKB_ENABLED
xkb_compose_state *xkb_state = nullptr;
+#endif
Size2i min_size;
Size2i max_size;
@@ -186,9 +210,11 @@ class DisplayServerX11 : public DisplayServer {
Point2i im_selection;
String im_text;
+#ifdef XKB_ENABLED
bool xkb_loaded = false;
xkb_context *xkb_ctx = nullptr;
xkb_compose_table *dead_tbl = nullptr;
+#endif
HashMap<WindowID, WindowData> windows;
diff --git a/platform/linuxbsd/x11/gl_manager_x11.h b/platform/linuxbsd/x11/gl_manager_x11.h
index 713b13376c..0eb8ab64f4 100644
--- a/platform/linuxbsd/x11/gl_manager_x11.h
+++ b/platform/linuxbsd/x11/gl_manager_x11.h
@@ -37,9 +37,22 @@
#include "core/os/os.h"
#include "core/templates/local_vector.h"
-#include "dynwrappers/xext-so_wrap.h"
+
+#ifdef SOWRAP_ENABLED
#include "dynwrappers/xlib-so_wrap.h"
+
+#include "dynwrappers/xext-so_wrap.h"
#include "dynwrappers/xrender-so_wrap.h"
+#else
+#include <X11/XKBlib.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+#include <X11/extensions/Xext.h>
+#include <X11/extensions/Xrender.h>
+#include <X11/extensions/shape.h>
+#endif
+
#include "servers/display_server.h"
struct GLManager_X11_Private;
diff --git a/platform/web/display_server_web.cpp b/platform/web/display_server_web.cpp
index d71fd60543..e89a79834b 100644
--- a/platform/web/display_server_web.cpp
+++ b/platform/web/display_server_web.cpp
@@ -108,11 +108,19 @@ void DisplayServerWeb::request_quit_callback() {
// Keys
-void DisplayServerWeb::dom2godot_mod(Ref<InputEventWithModifiers> ev, int p_mod) {
- ev->set_shift_pressed(p_mod & 1);
- ev->set_alt_pressed(p_mod & 2);
- ev->set_ctrl_pressed(p_mod & 4);
- ev->set_meta_pressed(p_mod & 8);
+void DisplayServerWeb::dom2godot_mod(Ref<InputEventWithModifiers> ev, int p_mod, Key p_keycode) {
+ if (p_keycode != Key::SHIFT) {
+ ev->set_shift_pressed(p_mod & 1);
+ }
+ if (p_keycode != Key::ALT) {
+ ev->set_alt_pressed(p_mod & 2);
+ }
+ if (p_keycode != Key::CTRL) {
+ ev->set_ctrl_pressed(p_mod & 4);
+ }
+ if (p_keycode != Key::META) {
+ ev->set_meta_pressed(p_mod & 8);
+ }
}
void DisplayServerWeb::key_callback(int p_pressed, int p_repeat, int p_modifiers) {
@@ -138,7 +146,7 @@ void DisplayServerWeb::key_callback(int p_pressed, int p_repeat, int p_modifiers
ev->set_key_label(fix_key_label(c, keycode));
ev->set_unicode(fix_unicode(c));
ev->set_pressed(p_pressed);
- dom2godot_mod(ev, p_modifiers);
+ dom2godot_mod(ev, p_modifiers, fix_keycode(c, keycode));
Input::get_singleton()->parse_input_event(ev);
@@ -157,7 +165,7 @@ int DisplayServerWeb::mouse_button_callback(int p_pressed, int p_button, double
ev->set_position(pos);
ev->set_global_position(pos);
ev->set_pressed(p_pressed);
- dom2godot_mod(ev, p_modifiers);
+ dom2godot_mod(ev, p_modifiers, Key::NONE);
switch (p_button) {
case DOM_BUTTON_LEFT:
@@ -235,7 +243,7 @@ void DisplayServerWeb::mouse_move_callback(double p_x, double p_y, double p_rel_
Point2 pos(p_x, p_y);
Ref<InputEventMouseMotion> ev;
ev.instantiate();
- dom2godot_mod(ev, p_modifiers);
+ dom2godot_mod(ev, p_modifiers, Key::NONE);
ev->set_button_mask(input_mask);
ev->set_position(pos);
diff --git a/platform/web/display_server_web.h b/platform/web/display_server_web.h
index 6d76af4e56..2e50a6bbc8 100644
--- a/platform/web/display_server_web.h
+++ b/platform/web/display_server_web.h
@@ -81,7 +81,7 @@ private:
bool swap_cancel_ok = false;
// utilities
- static void dom2godot_mod(Ref<InputEventWithModifiers> ev, int p_mod);
+ static void dom2godot_mod(Ref<InputEventWithModifiers> ev, int p_mod, Key p_keycode);
static const char *godot2dom_cursor(DisplayServer::CursorShape p_shape);
// events
diff --git a/platform/windows/display_server_windows.cpp b/platform/windows/display_server_windows.cpp
index fe7d91dc18..1cfc9c9f47 100644
--- a/platform/windows/display_server_windows.cpp
+++ b/platform/windows/display_server_windows.cpp
@@ -3668,10 +3668,18 @@ void DisplayServerWindows::_process_key_events() {
}
k->set_window_id(ke.window_id);
- k->set_shift_pressed(ke.shift);
- k->set_alt_pressed(ke.alt);
- k->set_ctrl_pressed(ke.control);
- k->set_meta_pressed(ke.meta);
+ if (keycode != Key::SHIFT) {
+ k->set_shift_pressed(ke.shift);
+ }
+ if (keycode != Key::ALT) {
+ k->set_alt_pressed(ke.alt);
+ }
+ if (keycode != Key::CTRL) {
+ k->set_ctrl_pressed(ke.control);
+ }
+ if (keycode != Key::META) {
+ k->set_meta_pressed(ke.meta);
+ }
k->set_pressed(true);
k->set_keycode(keycode);
k->set_physical_keycode(physical_keycode);
@@ -3693,11 +3701,6 @@ void DisplayServerWindows::_process_key_events() {
k.instantiate();
k->set_window_id(ke.window_id);
- k->set_shift_pressed(ke.shift);
- k->set_alt_pressed(ke.alt);
- k->set_ctrl_pressed(ke.control);
- k->set_meta_pressed(ke.meta);
-
k->set_pressed(ke.uMsg == WM_KEYDOWN);
Key keycode = KeyMappingWindows::get_keysym(ke.wParam);
@@ -3719,6 +3722,18 @@ void DisplayServerWindows::_process_key_events() {
}
}
+ if (keycode != Key::SHIFT) {
+ k->set_shift_pressed(ke.shift);
+ }
+ if (keycode != Key::ALT) {
+ k->set_alt_pressed(ke.alt);
+ }
+ if (keycode != Key::CTRL) {
+ k->set_ctrl_pressed(ke.control);
+ }
+ if (keycode != Key::META) {
+ k->set_meta_pressed(ke.meta);
+ }
k->set_keycode(keycode);
k->set_physical_keycode(physical_keycode);
k->set_key_label(key_label);
diff --git a/scene/2d/camera_2d.cpp b/scene/2d/camera_2d.cpp
index fe6bee0f1b..f7d2ae7d2d 100644
--- a/scene/2d/camera_2d.cpp
+++ b/scene/2d/camera_2d.cpp
@@ -266,6 +266,8 @@ void Camera2D::_notification(int p_what) {
clear_current();
}
viewport = nullptr;
+ just_exited_tree = true;
+ callable_mp(this, &Camera2D::_reset_just_exited).call_deferred();
} break;
#ifdef TOOLS_ENABLED
@@ -438,6 +440,10 @@ void Camera2D::_update_process_internal_for_smoothing() {
void Camera2D::make_current() {
ERR_FAIL_COND(!enabled || !is_inside_tree());
get_tree()->call_group(group_name, "_make_current", this);
+ if (just_exited_tree) {
+ // If camera exited the scene tree in the same frame, group call will skip it, so this needs to be called manually.
+ _make_current(this);
+ }
_update_scroll();
}
diff --git a/scene/2d/camera_2d.h b/scene/2d/camera_2d.h
index 7a77266db8..2417953691 100644
--- a/scene/2d/camera_2d.h
+++ b/scene/2d/camera_2d.h
@@ -51,6 +51,7 @@ protected:
Point2 camera_pos;
Point2 smoothed_camera_pos;
bool first = true;
+ bool just_exited_tree = false;
ObjectID custom_viewport_id; // to check validity
Viewport *custom_viewport = nullptr;
@@ -88,6 +89,7 @@ protected:
void _update_scroll();
void _make_current(Object *p_which);
+ void _reset_just_exited() { just_exited_tree = false; }
void _set_old_smoothing(real_t p_enable);
diff --git a/scene/2d/line_builder.cpp b/scene/2d/line_builder.cpp
index d91f6e36bb..0970325502 100644
--- a/scene/2d/line_builder.cpp
+++ b/scene/2d/line_builder.cpp
@@ -393,6 +393,8 @@ void LineBuilder::build() {
if (end_cap_mode == Line2D::LINE_CAP_BOX) {
pos_up1 += f0 * hw * width_factor;
pos_down1 += f0 * hw * width_factor;
+
+ current_distance1 += hw * width_factor;
}
if (texture_mode == Line2D::LINE_TEXTURE_TILE) {
diff --git a/scene/2d/navigation_agent_2d.cpp b/scene/2d/navigation_agent_2d.cpp
index 6aa7779b09..1ee6a0b779 100644
--- a/scene/2d/navigation_agent_2d.cpp
+++ b/scene/2d/navigation_agent_2d.cpp
@@ -31,6 +31,7 @@
#include "navigation_agent_2d.h"
#include "core/math/geometry_2d.h"
+#include "scene/2d/navigation_link_2d.h"
#include "scene/resources/world_2d.h"
#include "servers/navigation_server_2d.h"
@@ -119,7 +120,7 @@ void NavigationAgent2D::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_debug_path_custom_line_width", "line_width"), &NavigationAgent2D::set_debug_path_custom_line_width);
ClassDB::bind_method(D_METHOD("get_debug_path_custom_line_width"), &NavigationAgent2D::get_debug_path_custom_line_width);
- ADD_GROUP("Debug", "");
+ ADD_GROUP("Debug", "debug_");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "debug_enabled"), "set_debug_enabled", "get_debug_enabled");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "debug_use_custom"), "set_debug_use_custom", "get_debug_use_custom");
ADD_PROPERTY(PropertyInfo(Variant::COLOR, "debug_path_custom_color"), "set_debug_path_custom_color", "get_debug_path_custom_color");
@@ -623,6 +624,21 @@ void NavigationAgent2D::update_navigation() {
}
details[SNAME("owner")] = owner;
+
+ if (waypoint_type == NavigationPathQueryResult2D::PATH_SEGMENT_TYPE_LINK) {
+ const NavigationLink2D *navlink = Object::cast_to<NavigationLink2D>(owner);
+ if (navlink) {
+ Vector2 link_global_start_position = navlink->get_global_start_position();
+ Vector2 link_global_end_position = navlink->get_global_end_position();
+ if (waypoint.distance_to(link_global_start_position) < waypoint.distance_to(link_global_end_position)) {
+ details[SNAME("link_entry_position")] = link_global_start_position;
+ details[SNAME("link_exit_position")] = link_global_end_position;
+ } else {
+ details[SNAME("link_entry_position")] = link_global_end_position;
+ details[SNAME("link_exit_position")] = link_global_start_position;
+ }
+ }
+ }
}
// Emit a signal for the waypoint
diff --git a/scene/2d/navigation_link_2d.cpp b/scene/2d/navigation_link_2d.cpp
index 26dca40176..8adb7c6305 100644
--- a/scene/2d/navigation_link_2d.cpp
+++ b/scene/2d/navigation_link_2d.cpp
@@ -54,6 +54,12 @@ void NavigationLink2D::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_end_position", "position"), &NavigationLink2D::set_end_position);
ClassDB::bind_method(D_METHOD("get_end_position"), &NavigationLink2D::get_end_position);
+ ClassDB::bind_method(D_METHOD("set_global_start_position", "position"), &NavigationLink2D::set_global_start_position);
+ ClassDB::bind_method(D_METHOD("get_global_start_position"), &NavigationLink2D::get_global_start_position);
+
+ ClassDB::bind_method(D_METHOD("set_global_end_position", "position"), &NavigationLink2D::set_global_end_position);
+ ClassDB::bind_method(D_METHOD("get_global_end_position"), &NavigationLink2D::get_global_end_position);
+
ClassDB::bind_method(D_METHOD("set_enter_cost", "enter_cost"), &NavigationLink2D::set_enter_cost);
ClassDB::bind_method(D_METHOD("get_enter_cost"), &NavigationLink2D::get_enter_cost);
@@ -271,6 +277,38 @@ void NavigationLink2D::set_end_position(Vector2 p_position) {
#endif // DEBUG_ENABLED
}
+void NavigationLink2D::set_global_start_position(Vector2 p_position) {
+ if (is_inside_tree()) {
+ set_start_position(to_local(p_position));
+ } else {
+ set_start_position(p_position);
+ }
+}
+
+Vector2 NavigationLink2D::get_global_start_position() const {
+ if (is_inside_tree()) {
+ return to_global(start_position);
+ } else {
+ return start_position;
+ }
+}
+
+void NavigationLink2D::set_global_end_position(Vector2 p_position) {
+ if (is_inside_tree()) {
+ set_end_position(to_local(p_position));
+ } else {
+ set_end_position(p_position);
+ }
+}
+
+Vector2 NavigationLink2D::get_global_end_position() const {
+ if (is_inside_tree()) {
+ return to_global(end_position);
+ } else {
+ return end_position;
+ }
+}
+
void NavigationLink2D::set_enter_cost(real_t p_enter_cost) {
ERR_FAIL_COND_MSG(p_enter_cost < 0.0, "The enter_cost must be positive.");
if (Math::is_equal_approx(enter_cost, p_enter_cost)) {
diff --git a/scene/2d/navigation_link_2d.h b/scene/2d/navigation_link_2d.h
index 5bf2a72358..8a24d611c9 100644
--- a/scene/2d/navigation_link_2d.h
+++ b/scene/2d/navigation_link_2d.h
@@ -78,6 +78,12 @@ public:
void set_end_position(Vector2 p_position);
Vector2 get_end_position() const { return end_position; }
+ void set_global_start_position(Vector2 p_position);
+ Vector2 get_global_start_position() const;
+
+ void set_global_end_position(Vector2 p_position);
+ Vector2 get_global_end_position() const;
+
void set_enter_cost(real_t p_enter_cost);
real_t get_enter_cost() const { return enter_cost; }
diff --git a/scene/2d/navigation_region_2d.cpp b/scene/2d/navigation_region_2d.cpp
index 3484a9de65..5dbba313bc 100644
--- a/scene/2d/navigation_region_2d.cpp
+++ b/scene/2d/navigation_region_2d.cpp
@@ -167,58 +167,78 @@ void NavigationRegion2D::_notification(int p_what) {
case NOTIFICATION_DRAW: {
#ifdef DEBUG_ENABLED
- if (is_inside_tree() && (Engine::get_singleton()->is_editor_hint() || NavigationServer3D::get_singleton()->get_debug_enabled()) && navigation_polygon.is_valid()) {
- Vector<Vector2> verts = navigation_polygon->get_vertices();
- if (verts.size() < 3) {
+ if (is_inside_tree() && (Engine::get_singleton()->is_editor_hint() || NavigationServer2D::get_singleton()->get_debug_enabled()) && navigation_polygon.is_valid()) {
+ Vector<Vector2> navigation_polygon_vertices = navigation_polygon->get_vertices();
+ if (navigation_polygon_vertices.size() < 3) {
return;
}
- Color color;
- if (enabled) {
- color = NavigationServer3D::get_singleton()->get_debug_navigation_geometry_face_color();
- } else {
- color = NavigationServer3D::get_singleton()->get_debug_navigation_geometry_face_disabled_color();
+ const NavigationServer2D *ns2d = NavigationServer2D::get_singleton();
+
+ bool enabled_geometry_face_random_color = ns2d->get_debug_navigation_enable_geometry_face_random_color();
+ bool enabled_edge_lines = ns2d->get_debug_navigation_enable_edge_lines();
+ bool enable_edge_connections = ns2d->get_debug_navigation_enable_edge_connections();
+
+ Color debug_face_color = ns2d->get_debug_navigation_geometry_face_color();
+ Color debug_edge_color = ns2d->get_debug_navigation_geometry_edge_color();
+ Color debug_edge_connection_color = ns2d->get_debug_navigation_edge_connection_color();
+
+ if (!enabled) {
+ debug_face_color = ns2d->get_debug_navigation_geometry_face_disabled_color();
+ debug_edge_color = ns2d->get_debug_navigation_geometry_edge_disabled_color();
}
- Color doors_color = NavigationServer3D::get_singleton()->get_debug_navigation_edge_connection_color();
RandomPCG rand;
for (int i = 0; i < navigation_polygon->get_polygon_count(); i++) {
// An array of vertices for this polygon.
Vector<int> polygon = navigation_polygon->get_polygon(i);
- Vector<Vector2> vertices;
- vertices.resize(polygon.size());
+ Vector<Vector2> debug_polygon_vertices;
+ debug_polygon_vertices.resize(polygon.size());
for (int j = 0; j < polygon.size(); j++) {
- ERR_FAIL_INDEX(polygon[j], verts.size());
- vertices.write[j] = verts[polygon[j]];
+ ERR_FAIL_INDEX(polygon[j], navigation_polygon_vertices.size());
+ debug_polygon_vertices.write[j] = navigation_polygon_vertices[polygon[j]];
}
// Generate the polygon color, slightly randomly modified from the settings one.
- Color random_variation_color;
- random_variation_color.set_hsv(color.get_h() + rand.random(-1.0, 1.0) * 0.1, color.get_s(), color.get_v() + rand.random(-1.0, 1.0) * 0.2);
- random_variation_color.a = color.a;
- Vector<Color> colors;
- colors.push_back(random_variation_color);
+ Color random_variation_color = debug_face_color;
+ if (enabled_geometry_face_random_color) {
+ random_variation_color.set_hsv(
+ debug_face_color.get_h() + rand.random(-1.0, 1.0) * 0.1,
+ debug_face_color.get_s(),
+ debug_face_color.get_v() + rand.random(-1.0, 1.0) * 0.2);
+ }
+ random_variation_color.a = debug_face_color.a;
- RS::get_singleton()->canvas_item_add_polygon(get_canvas_item(), vertices, colors);
+ Vector<Color> debug_face_colors;
+ debug_face_colors.push_back(random_variation_color);
+ RS::get_singleton()->canvas_item_add_polygon(get_canvas_item(), debug_polygon_vertices, debug_face_colors);
+
+ if (enabled_edge_lines) {
+ Vector<Color> debug_edge_colors;
+ debug_edge_colors.push_back(debug_edge_color);
+ debug_polygon_vertices.push_back(debug_polygon_vertices[0]); // Add first again for closing polyline.
+ RS::get_singleton()->canvas_item_add_polyline(get_canvas_item(), debug_polygon_vertices, debug_edge_colors);
+ }
}
- // Draw the region
- Transform2D xform = get_global_transform();
- const NavigationServer2D *ns = NavigationServer2D::get_singleton();
- real_t radius = ns->map_get_edge_connection_margin(get_world_2d()->get_navigation_map()) / 2.0;
- for (int i = 0; i < ns->region_get_connections_count(region); i++) {
- // Two main points
- Vector2 a = ns->region_get_connection_pathway_start(region, i);
- a = xform.affine_inverse().xform(a);
- Vector2 b = ns->region_get_connection_pathway_end(region, i);
- b = xform.affine_inverse().xform(b);
- draw_line(a, b, doors_color);
-
- // Draw a circle to illustrate the margins.
- real_t angle = a.angle_to_point(b);
- draw_arc(a, radius, angle + Math_PI / 2.0, angle - Math_PI / 2.0 + Math_TAU, 10, doors_color);
- draw_arc(b, radius, angle - Math_PI / 2.0, angle + Math_PI / 2.0, 10, doors_color);
+ if (enable_edge_connections) {
+ // Draw the region edge connections.
+ Transform2D xform = get_global_transform();
+ real_t radius = ns2d->map_get_edge_connection_margin(get_world_2d()->get_navigation_map()) / 2.0;
+ for (int i = 0; i < ns2d->region_get_connections_count(region); i++) {
+ // Two main points
+ Vector2 a = ns2d->region_get_connection_pathway_start(region, i);
+ a = xform.affine_inverse().xform(a);
+ Vector2 b = ns2d->region_get_connection_pathway_end(region, i);
+ b = xform.affine_inverse().xform(b);
+ draw_line(a, b, debug_edge_connection_color);
+
+ // Draw a circle to illustrate the margins.
+ real_t angle = a.angle_to_point(b);
+ draw_arc(a, radius, angle + Math_PI / 2.0, angle - Math_PI / 2.0 + Math_TAU, 10, debug_edge_connection_color);
+ draw_arc(b, radius, angle - Math_PI / 2.0, angle + Math_PI / 2.0, 10, debug_edge_connection_color);
+ }
}
}
#endif // DEBUG_ENABLED
diff --git a/scene/2d/tile_map.cpp b/scene/2d/tile_map.cpp
index 95bf67d38d..11e59d9858 100644
--- a/scene/2d/tile_map.cpp
+++ b/scene/2d/tile_map.cpp
@@ -752,6 +752,21 @@ TileMap::VisibilityMode TileMap::get_navigation_visibility_mode() {
return navigation_visibility_mode;
}
+void TileMap::set_navigation_map(int p_layer, RID p_map) {
+ ERR_FAIL_INDEX(p_layer, (int)layers.size());
+ ERR_FAIL_COND_MSG(!is_inside_tree(), "A TileMap navigation map can only be changed while inside the SceneTree.");
+ layers[p_layer].navigation_map = p_map;
+ layers[p_layer].uses_world_navigation_map = p_map == get_world_2d()->get_navigation_map();
+}
+
+RID TileMap::get_navigation_map(int p_layer) const {
+ ERR_FAIL_INDEX_V(p_layer, (int)layers.size(), RID());
+ if (layers[p_layer].navigation_map.is_valid()) {
+ return layers[p_layer].navigation_map;
+ }
+ return RID();
+}
+
void TileMap::set_y_sort_enabled(bool p_enable) {
Node2D::set_y_sort_enabled(p_enable);
_clear_internals();
@@ -897,6 +912,9 @@ void TileMap::_recreate_layer_internals(int p_layer) {
// Update the layer internals.
_rendering_update_layer(p_layer);
+ // Update the layer internal navigation maps.
+ _navigation_update_layer(p_layer);
+
// Recreate the quadrants.
const HashMap<Vector2i, TileMapCell> &tile_map = layers[p_layer].tile_map;
for (const KeyValue<Vector2i, TileMapCell> &E : tile_map) {
@@ -959,6 +977,9 @@ void TileMap::_clear_layer_internals(int p_layer) {
// Clear the layers internals.
_rendering_cleanup_layer(p_layer);
+ // Clear the layers internal navigation maps.
+ _navigation_cleanup_layer(p_layer);
+
// Clear the dirty quadrants list.
while (layers[p_layer].dirty_quadrant_list.first()) {
layers[p_layer].dirty_quadrant_list.remove(layers[p_layer].dirty_quadrant_list.first());
@@ -1083,6 +1104,38 @@ void TileMap::_rendering_notification(int p_what) {
}
}
+void TileMap::_navigation_update_layer(int p_layer) {
+ ERR_FAIL_INDEX(p_layer, (int)layers.size());
+ ERR_FAIL_NULL(NavigationServer2D::get_singleton());
+
+ if (!layers[p_layer].navigation_map.is_valid()) {
+ if (p_layer == 0 && is_inside_tree()) {
+ // Use the default World2D navigation map for the first layer when empty.
+ layers[p_layer].navigation_map = get_world_2d()->get_navigation_map();
+ layers[p_layer].uses_world_navigation_map = true;
+ } else {
+ RID new_layer_map = NavigationServer2D::get_singleton()->map_create();
+ NavigationServer2D::get_singleton()->map_set_active(new_layer_map, true);
+ layers[p_layer].navigation_map = new_layer_map;
+ layers[p_layer].uses_world_navigation_map = false;
+ }
+ }
+}
+
+void TileMap::_navigation_cleanup_layer(int p_layer) {
+ ERR_FAIL_INDEX(p_layer, (int)layers.size());
+ ERR_FAIL_NULL(NavigationServer2D::get_singleton());
+
+ if (layers[p_layer].navigation_map.is_valid()) {
+ if (layers[p_layer].uses_world_navigation_map) {
+ // Do not delete the World2D default navigation map.
+ return;
+ }
+ NavigationServer2D::get_singleton()->free(layers[p_layer].navigation_map);
+ layers[p_layer].navigation_map = RID();
+ }
+}
+
void TileMap::_rendering_update_layer(int p_layer) {
ERR_FAIL_INDEX(p_layer, (int)layers.size());
@@ -1732,6 +1785,9 @@ void TileMap::_navigation_update_dirty_quadrants(SelfList<TileMapQuadrant>::List
q.navigation_regions[E_cell].resize(tile_set->get_navigation_layers_count());
for (int layer_index = 0; layer_index < tile_set->get_navigation_layers_count(); layer_index++) {
+ if (layer_index >= (int)layers.size() || !layers[layer_index].navigation_map.is_valid()) {
+ continue;
+ }
Ref<NavigationPolygon> navigation_polygon;
navigation_polygon = tile_data->get_navigation_polygon(layer_index);
@@ -1741,7 +1797,7 @@ void TileMap::_navigation_update_dirty_quadrants(SelfList<TileMapQuadrant>::List
RID region = NavigationServer2D::get_singleton()->region_create();
NavigationServer2D::get_singleton()->region_set_owner_id(region, get_instance_id());
- NavigationServer2D::get_singleton()->region_set_map(region, get_world_2d()->get_navigation_map());
+ NavigationServer2D::get_singleton()->region_set_map(region, layers[layer_index].navigation_map);
NavigationServer2D::get_singleton()->region_set_transform(region, tilemap_xform * tile_transform);
NavigationServer2D::get_singleton()->region_set_navigation_layers(region, tile_set->get_navigation_layer_layers(layer_index));
NavigationServer2D::get_singleton()->region_set_navigation_polygon(region, navigation_polygon);
@@ -1795,12 +1851,16 @@ void TileMap::_navigation_draw_quadrant_debug(TileMapQuadrant *p_quadrant) {
return;
}
+#ifdef DEBUG_ENABLED
RenderingServer *rs = RenderingServer::get_singleton();
+ const NavigationServer2D *ns2d = NavigationServer2D::get_singleton();
+
+ bool enabled_geometry_face_random_color = ns2d->get_debug_navigation_enable_geometry_face_random_color();
+ bool enabled_edge_lines = ns2d->get_debug_navigation_enable_edge_lines();
+
+ Color debug_face_color = ns2d->get_debug_navigation_geometry_face_color();
+ Color debug_edge_color = ns2d->get_debug_navigation_geometry_edge_color();
- Color color = Color(0.5, 1.0, 1.0, 1.0);
-#ifdef DEBUG_ENABLED
- color = NavigationServer3D::get_singleton()->get_debug_navigation_geometry_face_color();
-#endif // DEBUG_ENABLED
RandomPCG rand;
Vector2 quadrant_pos = map_to_local(p_quadrant->coords * get_effective_quadrant_size(p_quadrant->layer));
@@ -1830,34 +1890,50 @@ void TileMap::_navigation_draw_quadrant_debug(TileMapQuadrant *p_quadrant) {
rs->canvas_item_add_set_transform(p_quadrant->debug_canvas_item, cell_to_quadrant);
for (int layer_index = 0; layer_index < tile_set->get_navigation_layers_count(); layer_index++) {
- Ref<NavigationPolygon> navpoly = tile_data->get_navigation_polygon(layer_index);
- if (navpoly.is_valid()) {
- PackedVector2Array navigation_polygon_vertices = navpoly->get_vertices();
+ Ref<NavigationPolygon> navigation_polygon = tile_data->get_navigation_polygon(layer_index);
+ if (navigation_polygon.is_valid()) {
+ Vector<Vector2> navigation_polygon_vertices = navigation_polygon->get_vertices();
+ if (navigation_polygon_vertices.size() < 3) {
+ continue;
+ }
- for (int i = 0; i < navpoly->get_polygon_count(); i++) {
+ for (int i = 0; i < navigation_polygon->get_polygon_count(); i++) {
// An array of vertices for this polygon.
- Vector<int> polygon = navpoly->get_polygon(i);
- Vector<Vector2> vertices;
- vertices.resize(polygon.size());
+ Vector<int> polygon = navigation_polygon->get_polygon(i);
+ Vector<Vector2> debug_polygon_vertices;
+ debug_polygon_vertices.resize(polygon.size());
for (int j = 0; j < polygon.size(); j++) {
ERR_FAIL_INDEX(polygon[j], navigation_polygon_vertices.size());
- vertices.write[j] = navigation_polygon_vertices[polygon[j]];
+ debug_polygon_vertices.write[j] = navigation_polygon_vertices[polygon[j]];
}
// Generate the polygon color, slightly randomly modified from the settings one.
- Color random_variation_color;
- random_variation_color.set_hsv(color.get_h() + rand.random(-1.0, 1.0) * 0.05, color.get_s(), color.get_v() + rand.random(-1.0, 1.0) * 0.1);
- random_variation_color.a = color.a;
- Vector<Color> colors;
- colors.push_back(random_variation_color);
+ Color random_variation_color = debug_face_color;
+ if (enabled_geometry_face_random_color) {
+ random_variation_color.set_hsv(
+ debug_face_color.get_h() + rand.random(-1.0, 1.0) * 0.1,
+ debug_face_color.get_s(),
+ debug_face_color.get_v() + rand.random(-1.0, 1.0) * 0.2);
+ }
+ random_variation_color.a = debug_face_color.a;
- rs->canvas_item_add_polygon(p_quadrant->debug_canvas_item, vertices, colors);
+ Vector<Color> debug_face_colors;
+ debug_face_colors.push_back(random_variation_color);
+ rs->canvas_item_add_polygon(p_quadrant->debug_canvas_item, debug_polygon_vertices, debug_face_colors);
+
+ if (enabled_edge_lines) {
+ Vector<Color> debug_edge_colors;
+ debug_edge_colors.push_back(debug_edge_color);
+ debug_polygon_vertices.push_back(debug_polygon_vertices[0]); // Add first again for closing polyline.
+ rs->canvas_item_add_polyline(p_quadrant->debug_canvas_item, debug_polygon_vertices, debug_edge_colors);
+ }
}
}
}
}
}
}
+#endif // DEBUG_ENABLED
}
/////////////////////////////// Scenes //////////////////////////////////////
@@ -4031,6 +4107,9 @@ void TileMap::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_navigation_visibility_mode", "navigation_visibility_mode"), &TileMap::set_navigation_visibility_mode);
ClassDB::bind_method(D_METHOD("get_navigation_visibility_mode"), &TileMap::get_navigation_visibility_mode);
+ ClassDB::bind_method(D_METHOD("set_navigation_map", "layer", "map"), &TileMap::set_navigation_map);
+ ClassDB::bind_method(D_METHOD("get_navigation_map", "layer"), &TileMap::get_navigation_map);
+
ClassDB::bind_method(D_METHOD("set_cell", "layer", "coords", "source_id", "atlas_coords", "alternative_tile"), &TileMap::set_cell, DEFVAL(TileSet::INVALID_SOURCE), DEFVAL(TileSetSource::INVALID_ATLAS_COORDS), DEFVAL(0));
ClassDB::bind_method(D_METHOD("erase_cell", "layer", "coords"), &TileMap::erase_cell);
ClassDB::bind_method(D_METHOD("get_cell_source_id", "layer", "coords", "use_proxies"), &TileMap::get_cell_source_id, DEFVAL(false));
diff --git a/scene/2d/tile_map.h b/scene/2d/tile_map.h
index 7cf2a2eded..e9c1cb0c11 100644
--- a/scene/2d/tile_map.h
+++ b/scene/2d/tile_map.h
@@ -211,6 +211,8 @@ private:
HashMap<Vector2i, TileMapCell> tile_map;
HashMap<Vector2i, TileMapQuadrant> quadrant_map;
SelfList<TileMapQuadrant>::List dirty_quadrant_list;
+ RID navigation_map;
+ bool uses_world_navigation_map = false;
};
LocalVector<TileMapLayer> layers;
int selected_layer = -1;
@@ -259,6 +261,8 @@ private:
void _physics_draw_quadrant_debug(TileMapQuadrant *p_quadrant);
void _navigation_notification(int p_what);
+ void _navigation_update_layer(int p_layer);
+ void _navigation_cleanup_layer(int p_layer);
void _navigation_update_dirty_quadrants(SelfList<TileMapQuadrant>::List &r_dirty_quadrant_list);
void _navigation_cleanup_quadrant(TileMapQuadrant *p_quadrant);
void _navigation_draw_quadrant_debug(TileMapQuadrant *p_quadrant);
@@ -339,6 +343,9 @@ public:
void set_navigation_visibility_mode(VisibilityMode p_show_navigation);
VisibilityMode get_navigation_visibility_mode();
+ void set_navigation_map(int p_layer, RID p_map);
+ RID get_navigation_map(int p_layer) const;
+
// Cells accessors.
void set_cell(int p_layer, const Vector2i &p_coords, int p_source_id = TileSet::INVALID_SOURCE, const Vector2i p_atlas_coords = TileSetSource::INVALID_ATLAS_COORDS, int p_alternative_tile = 0);
void erase_cell(int p_layer, const Vector2i &p_coords);
diff --git a/scene/3d/decal.cpp b/scene/3d/decal.cpp
index e122adcc8c..6f2717fd41 100644
--- a/scene/3d/decal.cpp
+++ b/scene/3d/decal.cpp
@@ -31,7 +31,7 @@
#include "decal.h"
void Decal::set_size(const Vector3 &p_size) {
- size = p_size;
+ size = Vector3(MAX(0.001, p_size.x), MAX(0.001, p_size.y), MAX(0.001, p_size.z));
RS::get_singleton()->decal_set_size(decal, p_size);
update_gizmos();
}
diff --git a/scene/3d/label_3d.cpp b/scene/3d/label_3d.cpp
index b39ca43d2e..5fc36abb76 100644
--- a/scene/3d/label_3d.cpp
+++ b/scene/3d/label_3d.cpp
@@ -442,6 +442,18 @@ void Label3D::_generate_glyph_surfaces(const Glyph &p_glyph, Vector2 &r_offset,
}
void Label3D::_shape() {
+ // When a shaped text is invalidated by an external source, we want to reshape it.
+ if (!TS->shaped_text_is_ready(text_rid)) {
+ dirty_text = true;
+ }
+
+ for (const RID &line_rid : lines_rid) {
+ if (!TS->shaped_text_is_ready(line_rid)) {
+ dirty_lines = true;
+ break;
+ }
+ }
+
// Clear mesh.
RS::get_singleton()->mesh_clear(mesh);
aabb = AABB();
diff --git a/scene/3d/lightmap_gi.cpp b/scene/3d/lightmap_gi.cpp
index fb74cffc94..b4387b0f3c 100644
--- a/scene/3d/lightmap_gi.cpp
+++ b/scene/3d/lightmap_gi.cpp
@@ -163,7 +163,8 @@ Array LightmapGIData::_get_light_textures_data() const {
config->set_value("remap", "importer", "2d_array_texture");
config->set_value("remap", "type", "CompressedTexture2DArray");
if (!config->has_section_key("params", "compress/mode")) {
- config->set_value("params", "compress/mode", 2); //user may want another compression, so leave it be
+ // User may want another compression, so leave it be, but default to VRAM uncompressed.
+ config->set_value("params", "compress/mode", 3);
}
config->set_value("params", "compress/channel_pack", 1);
config->set_value("params", "mipmaps/generate", false);
diff --git a/scene/3d/navigation_agent_3d.cpp b/scene/3d/navigation_agent_3d.cpp
index 081e7505d0..5b5ad62d64 100644
--- a/scene/3d/navigation_agent_3d.cpp
+++ b/scene/3d/navigation_agent_3d.cpp
@@ -30,6 +30,7 @@
#include "navigation_agent_3d.h"
+#include "scene/3d/navigation_link_3d.h"
#include "servers/navigation_server_3d.h"
void NavigationAgent3D::_bind_methods() {
@@ -130,7 +131,7 @@ void NavigationAgent3D::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_debug_path_custom_point_size", "point_size"), &NavigationAgent3D::set_debug_path_custom_point_size);
ClassDB::bind_method(D_METHOD("get_debug_path_custom_point_size"), &NavigationAgent3D::get_debug_path_custom_point_size);
- ADD_GROUP("Debug", "");
+ ADD_GROUP("Debug", "debug_");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "debug_enabled"), "set_debug_enabled", "get_debug_enabled");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "debug_use_custom"), "set_debug_use_custom", "get_debug_use_custom");
ADD_PROPERTY(PropertyInfo(Variant::COLOR, "debug_path_custom_color"), "set_debug_path_custom_color", "get_debug_path_custom_color");
@@ -649,6 +650,21 @@ void NavigationAgent3D::update_navigation() {
}
details[SNAME("owner")] = owner;
+
+ if (waypoint_type == NavigationPathQueryResult3D::PATH_SEGMENT_TYPE_LINK) {
+ const NavigationLink3D *navlink = Object::cast_to<NavigationLink3D>(owner);
+ if (navlink) {
+ Vector3 link_global_start_position = navlink->get_global_start_position();
+ Vector3 link_global_end_position = navlink->get_global_end_position();
+ if (waypoint.distance_to(link_global_start_position) < waypoint.distance_to(link_global_end_position)) {
+ details[SNAME("link_entry_position")] = link_global_start_position;
+ details[SNAME("link_exit_position")] = link_global_end_position;
+ } else {
+ details[SNAME("link_entry_position")] = link_global_end_position;
+ details[SNAME("link_exit_position")] = link_global_start_position;
+ }
+ }
+ }
}
// Emit a signal for the waypoint
diff --git a/scene/3d/navigation_link_3d.cpp b/scene/3d/navigation_link_3d.cpp
index f47fcfaf51..9c4b8e7905 100644
--- a/scene/3d/navigation_link_3d.cpp
+++ b/scene/3d/navigation_link_3d.cpp
@@ -163,6 +163,12 @@ void NavigationLink3D::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_end_position", "position"), &NavigationLink3D::set_end_position);
ClassDB::bind_method(D_METHOD("get_end_position"), &NavigationLink3D::get_end_position);
+ ClassDB::bind_method(D_METHOD("set_global_start_position", "position"), &NavigationLink3D::set_global_start_position);
+ ClassDB::bind_method(D_METHOD("get_global_start_position"), &NavigationLink3D::get_global_start_position);
+
+ ClassDB::bind_method(D_METHOD("set_global_end_position", "position"), &NavigationLink3D::set_global_end_position);
+ ClassDB::bind_method(D_METHOD("get_global_end_position"), &NavigationLink3D::get_global_end_position);
+
ClassDB::bind_method(D_METHOD("set_enter_cost", "enter_cost"), &NavigationLink3D::set_enter_cost);
ClassDB::bind_method(D_METHOD("get_enter_cost"), &NavigationLink3D::get_enter_cost);
@@ -386,6 +392,38 @@ void NavigationLink3D::set_end_position(Vector3 p_position) {
update_configuration_warnings();
}
+void NavigationLink3D::set_global_start_position(Vector3 p_position) {
+ if (is_inside_tree()) {
+ set_start_position(to_local(p_position));
+ } else {
+ set_start_position(p_position);
+ }
+}
+
+Vector3 NavigationLink3D::get_global_start_position() const {
+ if (is_inside_tree()) {
+ return to_global(start_position);
+ } else {
+ return start_position;
+ }
+}
+
+void NavigationLink3D::set_global_end_position(Vector3 p_position) {
+ if (is_inside_tree()) {
+ set_end_position(to_local(p_position));
+ } else {
+ set_end_position(p_position);
+ }
+}
+
+Vector3 NavigationLink3D::get_global_end_position() const {
+ if (is_inside_tree()) {
+ return to_global(end_position);
+ } else {
+ return end_position;
+ }
+}
+
void NavigationLink3D::set_enter_cost(real_t p_enter_cost) {
ERR_FAIL_COND_MSG(p_enter_cost < 0.0, "The enter_cost must be positive.");
if (Math::is_equal_approx(enter_cost, p_enter_cost)) {
diff --git a/scene/3d/navigation_link_3d.h b/scene/3d/navigation_link_3d.h
index 5c9ec36189..991f45c85d 100644
--- a/scene/3d/navigation_link_3d.h
+++ b/scene/3d/navigation_link_3d.h
@@ -83,6 +83,12 @@ public:
void set_end_position(Vector3 p_position);
Vector3 get_end_position() const { return end_position; }
+ void set_global_start_position(Vector3 p_position);
+ Vector3 get_global_start_position() const;
+
+ void set_global_end_position(Vector3 p_position);
+ Vector3 get_global_end_position() const;
+
void set_enter_cost(real_t p_enter_cost);
real_t get_enter_cost() const { return enter_cost; }
diff --git a/scene/animation/animation_blend_tree.cpp b/scene/animation/animation_blend_tree.cpp
index 3fe46b380f..d3207c1a3d 100644
--- a/scene/animation/animation_blend_tree.cpp
+++ b/scene/animation/animation_blend_tree.cpp
@@ -350,29 +350,29 @@ double AnimationNodeOneShot::process(double p_time, bool p_seek, bool p_is_exter
set_parameter(active, true);
}
- real_t blend;
-
+ real_t blend = 1.0;
+ bool use_blend = sync;
if (cur_time < fade_in) {
if (fade_in > 0) {
+ use_blend = true;
blend = cur_time / fade_in;
} else {
- blend = 0;
+ blend = 0; // Should not happen.
}
} else if (!do_start && cur_remaining <= fade_out) {
+ use_blend = true;
if (fade_out > 0) {
blend = (cur_remaining / fade_out);
} else {
blend = 0;
}
- } else {
- blend = 1.0;
}
- double main_rem;
+ double main_rem = 0.0;
if (mix == MIX_MODE_ADD) {
main_rem = blend_input(0, p_time, p_seek, p_is_external_seeking, 1.0, FILTER_IGNORE, sync);
} else {
- main_rem = blend_input(0, p_time, p_seek, p_is_external_seeking, 1.0 - blend, FILTER_BLEND, sync); // Unlike below, processing this edge is a corner case.
+ main_rem = blend_input(0, p_time, use_blend && p_seek, p_is_external_seeking, 1.0 - blend, FILTER_BLEND, sync); // Unlike below, processing this edge is a corner case.
}
double os_rem = blend_input(1, os_seek ? cur_time : p_time, os_seek, p_is_external_seeking, Math::is_zero_approx(blend) ? CMP_EPSILON : blend, FILTER_PASS, true); // Blend values must be more than CMP_EPSILON to process discrete keys in edge.
@@ -825,6 +825,7 @@ double AnimationNodeTransition::process(double p_time, bool p_seek, bool p_is_ex
bool switched = false;
bool restart = false;
+ bool clear_remaining_fade = false;
if (pending_update) {
if (cur_current_index < 0 || cur_current_index >= get_input_count()) {
@@ -842,6 +843,10 @@ double AnimationNodeTransition::process(double p_time, bool p_seek, bool p_is_ex
pending_update = false;
}
+ if (p_time == 0 && p_seek && !p_is_external_seeking) {
+ clear_remaining_fade = true; // Reset occurs.
+ }
+
if (!cur_transition_request.is_empty()) {
int new_idx = find_input(cur_transition_request);
if (new_idx >= 0) {
@@ -849,10 +854,7 @@ double AnimationNodeTransition::process(double p_time, bool p_seek, bool p_is_ex
if (allow_transition_to_self) {
// Transition to same state.
restart = input_data[cur_current_index].reset;
- cur_prev_xfading = 0;
- set_parameter(prev_xfading, 0);
- cur_prev_index = -1;
- set_parameter(prev_index, -1);
+ clear_remaining_fade = true;
}
} else {
switched = true;
@@ -869,6 +871,13 @@ double AnimationNodeTransition::process(double p_time, bool p_seek, bool p_is_ex
set_parameter(transition_request, cur_transition_request);
}
+ if (clear_remaining_fade) {
+ cur_prev_xfading = 0;
+ set_parameter(prev_xfading, 0);
+ cur_prev_index = -1;
+ set_parameter(prev_index, -1);
+ }
+
// Special case for restart.
if (restart) {
set_parameter(time, 0);
@@ -910,24 +919,31 @@ double AnimationNodeTransition::process(double p_time, bool p_seek, bool p_is_ex
} else { // Cross-fading from prev to current.
- real_t blend = xfade_time == 0 ? 0 : (cur_prev_xfading / xfade_time);
- if (xfade_curve.is_valid()) {
- blend = xfade_curve->sample(blend);
+ real_t blend = 0.0;
+ real_t blend_inv = 1.0;
+ bool use_blend = sync;
+ if (xfade_time > 0) {
+ use_blend = true;
+ blend = cur_prev_xfading / xfade_time;
+ if (xfade_curve.is_valid()) {
+ blend = xfade_curve->sample(blend);
+ }
+ blend_inv = 1.0 - blend;
+ blend = Math::is_zero_approx(blend) ? CMP_EPSILON : blend;
+ blend_inv = Math::is_zero_approx(blend_inv) ? CMP_EPSILON : blend_inv;
}
// Blend values must be more than CMP_EPSILON to process discrete keys in edge.
- real_t blend_inv = 1.0 - blend;
if (input_data[cur_current_index].reset && !p_seek && switched) { // Just switched, seek to start of current.
- rem = blend_input(cur_current_index, 0, true, p_is_external_seeking, Math::is_zero_approx(blend_inv) ? CMP_EPSILON : blend_inv, FILTER_IGNORE, true);
+ rem = blend_input(cur_current_index, 0, true, p_is_external_seeking, blend_inv, FILTER_IGNORE, true);
} else {
- rem = blend_input(cur_current_index, p_time, p_seek, p_is_external_seeking, Math::is_zero_approx(blend_inv) ? CMP_EPSILON : blend_inv, FILTER_IGNORE, true);
+ rem = blend_input(cur_current_index, p_time, p_seek, p_is_external_seeking, blend_inv, FILTER_IGNORE, true);
}
+ blend_input(cur_prev_index, p_time, use_blend && p_seek, p_is_external_seeking, blend, FILTER_IGNORE, true);
if (p_seek) {
- blend_input(cur_prev_index, p_time, true, p_is_external_seeking, Math::is_zero_approx(blend) ? CMP_EPSILON : blend, FILTER_IGNORE, true);
cur_time = p_time;
} else {
- blend_input(cur_prev_index, p_time, false, p_is_external_seeking, Math::is_zero_approx(blend) ? CMP_EPSILON : blend, FILTER_IGNORE, true);
cur_time += p_time;
cur_prev_xfading -= p_time;
if (cur_prev_xfading < 0) {
diff --git a/scene/animation/animation_player.cpp b/scene/animation/animation_player.cpp
index ad0c19b1e6..fc3a3d306f 100644
--- a/scene/animation/animation_player.cpp
+++ b/scene/animation/animation_player.cpp
@@ -199,7 +199,7 @@ void AnimationPlayer::_validate_property(PropertyInfo &p_property) const {
void AnimationPlayer::_get_property_list(List<PropertyInfo> *p_list) const {
List<PropertyInfo> anim_names;
- anim_names.push_back(PropertyInfo(Variant::DICTIONARY, "libraries"));
+ anim_names.push_back(PropertyInfo(Variant::DICTIONARY, PNAME("libraries")));
for (const KeyValue<StringName, AnimationData> &E : animation_set) {
if (E.value.next != StringName()) {
diff --git a/scene/animation/animation_tree.cpp b/scene/animation/animation_tree.cpp
index 7c2edef1de..9f9916c1c6 100644
--- a/scene/animation/animation_tree.cpp
+++ b/scene/animation/animation_tree.cpp
@@ -567,6 +567,10 @@ bool AnimationTree::_update_caches(AnimationPlayer *player) {
List<StringName> sname;
player->get_animation_list(&sname);
+ root_motion_cache.loc = Vector3(0, 0, 0);
+ root_motion_cache.rot = Quaternion(0, 0, 0, 1);
+ root_motion_cache.scale = Vector3(1, 1, 1);
+
Ref<Animation> reset_anim;
bool has_reset_anim = player->has_animation(SceneStringNames::get_singleton()->RESET);
if (has_reset_anim) {
@@ -1035,14 +1039,13 @@ void AnimationTree::_process_graph(double p_delta) {
case Animation::TYPE_POSITION_3D: {
TrackCacheTransform *t = static_cast<TrackCacheTransform *>(track);
if (track->root_motion) {
- t->loc = Vector3(0, 0, 0);
- t->rot = Quaternion(0, 0, 0, 1);
- t->scale = Vector3(1, 1, 1);
- } else {
- t->loc = t->init_loc;
- t->rot = t->init_rot;
- t->scale = t->init_scale;
+ root_motion_cache.loc = Vector3(0, 0, 0);
+ root_motion_cache.rot = Quaternion(0, 0, 0, 1);
+ root_motion_cache.scale = Vector3(1, 1, 1);
}
+ t->loc = t->init_loc;
+ t->rot = t->init_rot;
+ t->scale = t->init_scale;
} break;
case Animation::TYPE_BLEND_SHAPE: {
TrackCacheBlendShape *t = static_cast<TrackCacheBlendShape *>(track);
@@ -1117,6 +1120,7 @@ void AnimationTree::_process_graph(double p_delta) {
continue; // Nothing to blend.
}
TrackCacheTransform *t = static_cast<TrackCacheTransform *>(track);
+
if (track->root_motion && calc_root) {
double prev_time = time - delta;
if (!backward) {
@@ -1164,7 +1168,7 @@ void AnimationTree::_process_graph(double p_delta) {
loc[0] = post_process_key_value(a, i, loc[0], t->object, t->bone_idx);
a->position_track_interpolate(i, (double)a->get_length(), &loc[1]);
loc[1] = post_process_key_value(a, i, loc[1], t->object, t->bone_idx);
- t->loc += (loc[1] - loc[0]) * blend;
+ root_motion_cache.loc += (loc[1] - loc[0]) * blend;
prev_time = 0;
}
} else {
@@ -1176,7 +1180,7 @@ void AnimationTree::_process_graph(double p_delta) {
loc[0] = post_process_key_value(a, i, loc[0], t->object, t->bone_idx);
a->position_track_interpolate(i, 0, &loc[1]);
loc[1] = post_process_key_value(a, i, loc[1], t->object, t->bone_idx);
- t->loc += (loc[1] - loc[0]) * blend;
+ root_motion_cache.loc += (loc[1] - loc[0]) * blend;
prev_time = (double)a->get_length();
}
}
@@ -1186,13 +1190,13 @@ void AnimationTree::_process_graph(double p_delta) {
continue;
}
loc[0] = post_process_key_value(a, i, loc[0], t->object, t->bone_idx);
-
a->position_track_interpolate(i, time, &loc[1]);
loc[1] = post_process_key_value(a, i, loc[1], t->object, t->bone_idx);
- t->loc += (loc[1] - loc[0]) * blend;
+ root_motion_cache.loc += (loc[1] - loc[0]) * blend;
prev_time = !backward ? 0 : (double)a->get_length();
+ }
- } else {
+ {
Vector3 loc;
Error err = a->position_track_interpolate(i, time, &loc);
@@ -1211,6 +1215,7 @@ void AnimationTree::_process_graph(double p_delta) {
continue; // Nothing to blend.
}
TrackCacheTransform *t = static_cast<TrackCacheTransform *>(track);
+
if (track->root_motion && calc_root) {
double prev_time = time - delta;
if (!backward) {
@@ -1258,7 +1263,7 @@ void AnimationTree::_process_graph(double p_delta) {
rot[0] = post_process_key_value(a, i, rot[0], t->object, t->bone_idx);
a->rotation_track_interpolate(i, (double)a->get_length(), &rot[1]);
rot[1] = post_process_key_value(a, i, rot[1], t->object, t->bone_idx);
- t->rot = (t->rot * Quaternion().slerp(rot[0].inverse() * rot[1], blend)).normalized();
+ root_motion_cache.rot = (root_motion_cache.rot * Quaternion().slerp(rot[0].inverse() * rot[1], blend)).normalized();
prev_time = 0;
}
} else {
@@ -1269,7 +1274,7 @@ void AnimationTree::_process_graph(double p_delta) {
}
rot[0] = post_process_key_value(a, i, rot[0], t->object, t->bone_idx);
a->rotation_track_interpolate(i, 0, &rot[1]);
- t->rot = (t->rot * Quaternion().slerp(rot[0].inverse() * rot[1], blend)).normalized();
+ root_motion_cache.rot = (root_motion_cache.rot * Quaternion().slerp(rot[0].inverse() * rot[1], blend)).normalized();
prev_time = (double)a->get_length();
}
}
@@ -1282,10 +1287,11 @@ void AnimationTree::_process_graph(double p_delta) {
a->rotation_track_interpolate(i, time, &rot[1]);
rot[1] = post_process_key_value(a, i, rot[1], t->object, t->bone_idx);
- t->rot = (t->rot * Quaternion().slerp(rot[0].inverse() * rot[1], blend)).normalized();
+ root_motion_cache.rot = (root_motion_cache.rot * Quaternion().slerp(rot[0].inverse() * rot[1], blend)).normalized();
prev_time = !backward ? 0 : (double)a->get_length();
+ }
- } else {
+ {
Quaternion rot;
Error err = a->rotation_track_interpolate(i, time, &rot);
@@ -1304,6 +1310,7 @@ void AnimationTree::_process_graph(double p_delta) {
continue; // Nothing to blend.
}
TrackCacheTransform *t = static_cast<TrackCacheTransform *>(track);
+
if (track->root_motion && calc_root) {
double prev_time = time - delta;
if (!backward) {
@@ -1350,7 +1357,7 @@ void AnimationTree::_process_graph(double p_delta) {
}
scale[0] = post_process_key_value(a, i, scale[0], t->object, t->bone_idx);
a->scale_track_interpolate(i, (double)a->get_length(), &scale[1]);
- t->scale += (scale[1] - scale[0]) * blend;
+ root_motion_cache.scale += (scale[1] - scale[0]) * blend;
scale[1] = post_process_key_value(a, i, scale[1], t->object, t->bone_idx);
prev_time = 0;
}
@@ -1363,7 +1370,7 @@ void AnimationTree::_process_graph(double p_delta) {
scale[0] = post_process_key_value(a, i, scale[0], t->object, t->bone_idx);
a->scale_track_interpolate(i, 0, &scale[1]);
scale[1] = post_process_key_value(a, i, scale[1], t->object, t->bone_idx);
- t->scale += (scale[1] - scale[0]) * blend;
+ root_motion_cache.scale += (scale[1] - scale[0]) * blend;
prev_time = (double)a->get_length();
}
}
@@ -1376,10 +1383,11 @@ void AnimationTree::_process_graph(double p_delta) {
a->scale_track_interpolate(i, time, &scale[1]);
scale[1] = post_process_key_value(a, i, scale[1], t->object, t->bone_idx);
- t->scale += (scale[1] - scale[0]) * blend;
+ root_motion_cache.scale += (scale[1] - scale[0]) * blend;
prev_time = !backward ? 0 : (double)a->get_length();
+ }
- } else {
+ {
Vector3 scale;
Error err = a->scale_track_interpolate(i, time, &scale);
@@ -1692,10 +1700,12 @@ void AnimationTree::_process_graph(double p_delta) {
TrackCacheTransform *t = static_cast<TrackCacheTransform *>(track);
if (t->root_motion) {
- root_motion_position = t->loc;
- root_motion_rotation = t->rot;
- root_motion_scale = t->scale - Vector3(1, 1, 1);
-
+ root_motion_position = root_motion_cache.loc;
+ root_motion_rotation = root_motion_cache.rot;
+ root_motion_scale = root_motion_cache.scale - Vector3(1, 1, 1);
+ root_motion_position_accumulator = t->loc;
+ root_motion_rotation_accumulator = t->rot;
+ root_motion_scale_accumulator = t->scale;
} else if (t->skeleton && t->bone_idx >= 0) {
if (t->loc_used) {
t->skeleton->set_bone_pose_position(t->bone_idx, t->loc);
@@ -1997,6 +2007,18 @@ Vector3 AnimationTree::get_root_motion_scale() const {
return root_motion_scale;
}
+Vector3 AnimationTree::get_root_motion_position_accumulator() const {
+ return root_motion_position_accumulator;
+}
+
+Quaternion AnimationTree::get_root_motion_rotation_accumulator() const {
+ return root_motion_rotation_accumulator;
+}
+
+Vector3 AnimationTree::get_root_motion_scale_accumulator() const {
+ return root_motion_scale_accumulator;
+}
+
void AnimationTree::_tree_changed() {
if (properties_dirty) {
return;
@@ -2186,6 +2208,9 @@ void AnimationTree::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_root_motion_position"), &AnimationTree::get_root_motion_position);
ClassDB::bind_method(D_METHOD("get_root_motion_rotation"), &AnimationTree::get_root_motion_rotation);
ClassDB::bind_method(D_METHOD("get_root_motion_scale"), &AnimationTree::get_root_motion_scale);
+ ClassDB::bind_method(D_METHOD("get_root_motion_position_accumulator"), &AnimationTree::get_root_motion_position_accumulator);
+ ClassDB::bind_method(D_METHOD("get_root_motion_rotation_accumulator"), &AnimationTree::get_root_motion_rotation_accumulator);
+ ClassDB::bind_method(D_METHOD("get_root_motion_scale_accumulator"), &AnimationTree::get_root_motion_scale_accumulator);
ClassDB::bind_method(D_METHOD("_update_properties"), &AnimationTree::_update_properties);
diff --git a/scene/animation/animation_tree.h b/scene/animation/animation_tree.h
index 0540add85b..c68cae56ea 100644
--- a/scene/animation/animation_tree.h
+++ b/scene/animation/animation_tree.h
@@ -228,6 +228,12 @@ private:
}
};
+ struct RootMotionCache {
+ Vector3 loc = Vector3(0, 0, 0);
+ Quaternion rot = Quaternion(0, 0, 0, 1);
+ Vector3 scale = Vector3(1, 1, 1);
+ };
+
struct TrackCacheBlendShape : public TrackCache {
MeshInstance3D *mesh_3d = nullptr;
float init_value = 0;
@@ -294,6 +300,7 @@ private:
}
};
+ RootMotionCache root_motion_cache;
HashMap<NodePath, TrackCache *> track_cache;
HashSet<TrackCache *> playing_caches;
Vector<Node *> playing_audio_stream_players;
@@ -327,6 +334,9 @@ private:
Vector3 root_motion_position = Vector3(0, 0, 0);
Quaternion root_motion_rotation = Quaternion(0, 0, 0, 1);
Vector3 root_motion_scale = Vector3(0, 0, 0);
+ Vector3 root_motion_position_accumulator = Vector3(0, 0, 0);
+ Quaternion root_motion_rotation_accumulator = Quaternion(0, 0, 0, 1);
+ Vector3 root_motion_scale_accumulator = Vector3(1, 1, 1);
friend class AnimationNode;
bool properties_dirty = true;
@@ -394,6 +404,10 @@ public:
Quaternion get_root_motion_rotation() const;
Vector3 get_root_motion_scale() const;
+ Vector3 get_root_motion_position_accumulator() const;
+ Quaternion get_root_motion_rotation_accumulator() const;
+ Vector3 get_root_motion_scale_accumulator() const;
+
real_t get_connection_activity(const StringName &p_path, int p_connection) const;
void advance(double p_time);
diff --git a/scene/animation/root_motion_view.cpp b/scene/animation/root_motion_view.cpp
index 3d8d451c70..fc758b9456 100644
--- a/scene/animation/root_motion_view.cpp
+++ b/scene/animation/root_motion_view.cpp
@@ -88,6 +88,7 @@ void RootMotionView::_notification(int p_what) {
case NOTIFICATION_INTERNAL_PROCESS:
case NOTIFICATION_INTERNAL_PHYSICS_PROCESS: {
Transform3D transform;
+ Basis diff;
if (has_node(path)) {
Node *node = get_node(path);
@@ -103,9 +104,9 @@ void RootMotionView::_notification(int p_what) {
set_process_internal(true);
set_physics_process_internal(false);
}
-
transform.origin = tree->get_root_motion_position();
transform.basis = tree->get_root_motion_rotation(); // Scale is meaningless.
+ diff = tree->get_root_motion_rotation_accumulator();
}
}
@@ -115,8 +116,10 @@ void RootMotionView::_notification(int p_what) {
first = false;
- accumulated.origin += transform.origin;
accumulated.basis *= transform.basis;
+ transform.origin = (diff.inverse() * accumulated.basis).xform(transform.origin);
+ accumulated.origin += transform.origin;
+
accumulated.origin.x = Math::fposmod(accumulated.origin.x, cell_size);
if (zero_y) {
accumulated.origin.y = 0;
diff --git a/scene/animation/tween.cpp b/scene/animation/tween.cpp
index abc7814877..9d1118e0ef 100644
--- a/scene/animation/tween.cpp
+++ b/scene/animation/tween.cpp
@@ -60,6 +60,20 @@ void Tweener::_bind_methods() {
ADD_SIGNAL(MethodInfo("finished"));
}
+bool Tween::_validate_type_match(const Variant &p_from, Variant &r_to) {
+ if (p_from.get_type() != r_to.get_type()) {
+ // Cast r_to between double and int to avoid minor annoyances.
+ if (p_from.get_type() == Variant::FLOAT && r_to.get_type() == Variant::INT) {
+ r_to = double(r_to);
+ } else if (p_from.get_type() == Variant::INT && r_to.get_type() == Variant::FLOAT) {
+ r_to = int(r_to);
+ } else {
+ ERR_FAIL_V_MSG(false, "Type mismatch between initial and final value: " + Variant::get_type_name(p_from.get_type()) + " and " + Variant::get_type_name(r_to.get_type()));
+ }
+ }
+ return true;
+}
+
void Tween::_start_tweeners() {
if (tweeners.is_empty()) {
dead = true;
@@ -85,16 +99,8 @@ Ref<PropertyTweener> Tween::tween_property(Object *p_target, NodePath p_property
ERR_FAIL_COND_V_MSG(!valid, nullptr, "Tween invalid. Either finished or created outside scene tree.");
ERR_FAIL_COND_V_MSG(started, nullptr, "Can't append to a Tween that has started. Use stop() first.");
- Variant::Type property_type = p_target->get_indexed(p_property.get_as_property_path().get_subnames()).get_type();
- if (property_type != p_to.get_type()) {
- // Cast p_to between double and int to avoid minor annoyances.
- if (property_type == Variant::FLOAT && p_to.get_type() == Variant::INT) {
- p_to = double(p_to);
- } else if (property_type == Variant::INT && p_to.get_type() == Variant::FLOAT) {
- p_to = int(p_to);
- } else {
- ERR_FAIL_V_MSG(Ref<PropertyTweener>(), "Type mismatch between property and final value: " + Variant::get_type_name(property_type) + " and " + Variant::get_type_name(p_to.get_type()));
- }
+ if (!_validate_type_match(p_target->get_indexed(p_property.get_as_property_path().get_subnames()), p_to)) {
+ return nullptr;
}
Ref<PropertyTweener> tweener = memnew(PropertyTweener(p_target, p_property, p_to, p_duration));
@@ -124,6 +130,10 @@ Ref<MethodTweener> Tween::tween_method(Callable p_callback, Variant p_from, Vari
ERR_FAIL_COND_V_MSG(!valid, nullptr, "Tween invalid. Either finished or created outside scene tree.");
ERR_FAIL_COND_V_MSG(started, nullptr, "Can't append to a Tween that has started. Use stop() first.");
+ if (!_validate_type_match(p_from, p_to)) {
+ return nullptr;
+ }
+
Ref<MethodTweener> tweener = memnew(MethodTweener(p_callback, p_from, p_to, p_duration));
append(tweener);
return tweener;
diff --git a/scene/animation/tween.h b/scene/animation/tween.h
index 58217db535..c5abcb28a6 100644
--- a/scene/animation/tween.h
+++ b/scene/animation/tween.h
@@ -47,6 +47,7 @@ public:
protected:
static void _bind_methods();
+
Ref<Tween> tween;
double elapsed_time = 0;
bool finished = false;
@@ -125,6 +126,7 @@ private:
void _start_tweeners();
void _stop_internal(bool p_reset);
+ bool _validate_type_match(const Variant &p_from, Variant &r_to);
protected:
static void _bind_methods();
diff --git a/scene/gui/aspect_ratio_container.cpp b/scene/gui/aspect_ratio_container.cpp
index 802189c374..94240ccead 100644
--- a/scene/gui/aspect_ratio_container.cpp
+++ b/scene/gui/aspect_ratio_container.cpp
@@ -30,6 +30,8 @@
#include "aspect_ratio_container.h"
+#include "scene/gui/texture_rect.h"
+
Size2 AspectRatioContainer::get_minimum_size() const {
Size2 ms;
for (int i = 0; i < get_child_count(); i++) {
@@ -113,6 +115,16 @@ void AspectRatioContainer::_notification(int p_what) {
if (c->is_set_as_top_level()) {
continue;
}
+
+ // Temporary fix for editor crash.
+ TextureRect *trect = Object::cast_to<TextureRect>(c);
+ if (trect) {
+ if (trect->get_expand_mode() == TextureRect::EXPAND_FIT_WIDTH_PROPORTIONAL || trect->get_expand_mode() == TextureRect::EXPAND_FIT_HEIGHT_PROPORTIONAL) {
+ WARN_PRINT_ONCE("Proportional TextureRect is currently not supported inside AspectRatioContainer");
+ continue;
+ }
+ }
+
Size2 child_minsize = c->get_combined_minimum_size();
Size2 child_size = Size2(ratio, 1.0);
float scale_factor = 1.0;
diff --git a/scene/gui/code_edit.cpp b/scene/gui/code_edit.cpp
index b084cb5bea..e2f7ec860c 100644
--- a/scene/gui/code_edit.cpp
+++ b/scene/gui/code_edit.cpp
@@ -2856,7 +2856,7 @@ void CodeEdit::_filter_code_completion_candidates_impl() {
const int caret_line = get_caret_line();
const int caret_column = get_caret_column();
const String line = get_line(caret_line);
- ERR_FAIL_INDEX_MSG(caret_column - 1, line.length(), "Caret column exceeds line length.");
+ ERR_FAIL_INDEX_MSG(caret_column, line.length() + 1, "Caret column exceeds line length.");
if (caret_column > 0 && line[caret_column - 1] == '(' && !code_completion_forced) {
cancel_code_completion();
diff --git a/scene/gui/color_picker.cpp b/scene/gui/color_picker.cpp
index da29bc823f..0b0698188c 100644
--- a/scene/gui/color_picker.cpp
+++ b/scene/gui/color_picker.cpp
@@ -1197,11 +1197,11 @@ void ColorPicker::_uv_input(const Ref<InputEvent> &p_event, Control *c) {
}
if (!spinning) {
- real_t x = CLAMP(bev->get_position().x, corner_x, c->get_size().x - corner_x);
- real_t y = CLAMP(bev->get_position().y, corner_x, c->get_size().y - corner_y);
+ real_t x = CLAMP(bev->get_position().x - corner_x, 0, real_size.x);
+ real_t y = CLAMP(bev->get_position().y - corner_y, 0, real_size.y);
- s = (x - c->get_position().x - corner_x) / real_size.x;
- v = 1.0 - (y - c->get_position().y - corner_y) / real_size.y;
+ s = x / real_size.x;
+ v = 1.0 - y / real_size.y;
}
}
@@ -1250,11 +1250,11 @@ void ColorPicker::_uv_input(const Ref<InputEvent> &p_event, Control *c) {
real_t corner_y = (c == wheel_uv) ? center.y - Math_SQRT12 * c->get_size().height * 0.42 : 0;
Size2 real_size(c->get_size().x - corner_x * 2, c->get_size().y - corner_y * 2);
- real_t x = CLAMP(mev->get_position().x, corner_x, c->get_size().x - corner_x);
- real_t y = CLAMP(mev->get_position().y, corner_x, c->get_size().y - corner_y);
+ real_t x = CLAMP(mev->get_position().x - corner_x, 0, real_size.x);
+ real_t y = CLAMP(mev->get_position().y - corner_y, 0, real_size.y);
- s = (x - corner_x) / real_size.x;
- v = 1.0 - (y - corner_y) / real_size.y;
+ s = x / real_size.x;
+ v = 1.0 - y / real_size.y;
}
}
diff --git a/scene/gui/graph_edit.cpp b/scene/gui/graph_edit.cpp
index a6a2fb8d7c..58b820c31f 100644
--- a/scene/gui/graph_edit.cpp
+++ b/scene/gui/graph_edit.cpp
@@ -860,7 +860,7 @@ bool GraphEdit::is_in_port_hotzone(const Vector2 &pos, const Vector2 &p_mouse_po
}
for (int i = 0; i < get_child_count(); i++) {
- Control *child = Object::cast_to<Control>(get_child(i));
+ GraphNode *child = Object::cast_to<GraphNode>(get_child(i));
if (!child) {
continue;
}
diff --git a/scene/gui/label.cpp b/scene/gui/label.cpp
index f59702835c..b861d7af01 100644
--- a/scene/gui/label.cpp
+++ b/scene/gui/label.cpp
@@ -86,7 +86,7 @@ int Label::get_line_height(int p_line) const {
}
}
-void Label::_shape() {
+bool Label::_shape() {
Ref<StyleBox> style = theme_cache.normal_style;
int width = (get_size().width - style->get_minimum_size().width);
@@ -101,7 +101,7 @@ void Label::_shape() {
}
const Ref<Font> &font = (settings.is_valid() && settings->get_font().is_valid()) ? settings->get_font() : theme_cache.font;
int font_size = settings.is_valid() ? settings->get_font_size() : theme_cache.font_size;
- ERR_FAIL_COND(font.is_null());
+ ERR_FAIL_COND_V(font.is_null(), true);
String txt = (uppercase) ? TS->string_to_upper(xl_text, language) : xl_text;
if (visible_chars >= 0 && visible_chars_behavior == TextServer::VC_CHARS_BEFORE_SHAPING) {
txt = txt.substr(0, visible_chars);
@@ -121,6 +121,7 @@ void Label::_shape() {
dirty = false;
font_dirty = false;
lines_dirty = true;
+ // Note for future maintainers: forgetting stable width here (e.g., setting it to -1) may fix still undiscovered bugs.
}
if (lines_dirty) {
@@ -128,127 +129,143 @@ void Label::_shape() {
TS->free_rid(lines_rid[i]);
}
lines_rid.clear();
-
- BitField<TextServer::LineBreakFlag> autowrap_flags = TextServer::BREAK_MANDATORY;
- switch (autowrap_mode) {
- case TextServer::AUTOWRAP_WORD_SMART:
- autowrap_flags = TextServer::BREAK_WORD_BOUND | TextServer::BREAK_ADAPTIVE | TextServer::BREAK_MANDATORY;
- break;
- case TextServer::AUTOWRAP_WORD:
- autowrap_flags = TextServer::BREAK_WORD_BOUND | TextServer::BREAK_MANDATORY;
- break;
- case TextServer::AUTOWRAP_ARBITRARY:
- autowrap_flags = TextServer::BREAK_GRAPHEME_BOUND | TextServer::BREAK_MANDATORY;
- break;
- case TextServer::AUTOWRAP_OFF:
- break;
- }
- autowrap_flags = autowrap_flags | TextServer::BREAK_TRIM_EDGE_SPACES;
-
- PackedInt32Array line_breaks = TS->shaped_text_get_line_breaks(text_rid, width, 0, autowrap_flags);
- for (int i = 0; i < line_breaks.size(); i = i + 2) {
- RID line = TS->shaped_text_substr(text_rid, line_breaks[i], line_breaks[i + 1] - line_breaks[i]);
- lines_rid.push_back(line);
- }
}
+ Size2i prev_minsize = minsize;
+ minsize = Size2();
+
+ bool can_process_lines = false;
if (xl_text.length() == 0) {
- minsize = Size2(1, get_line_height());
- return;
- }
+ can_process_lines = true;
+ lines_dirty = false;
+ } else {
+ // With autowrap on or off with trimming enabled, we won't compute the minimum size until width is stable
+ // (two shape requests in a row with the same width.) This avoids situations in which the initial width is
+ // very narrow and the label would break text into many very short lines, causing a very tall label that can
+ // leave a deformed container. In the remaining case (namely, autowrap off and no trimming), the label is
+ // free to dictate its own width, something that will be taken advtantage of.
+ bool can_dictate_width = autowrap_mode == TextServer::AUTOWRAP_OFF && overrun_behavior == TextServer::OVERRUN_NO_TRIMMING;
+ bool is_width_stable = get_size().width == stable_width;
+ can_process_lines = can_dictate_width || is_width_stable;
+ stable_width = get_size().width;
+
+ if (can_process_lines) {
+ if (lines_dirty) {
+ BitField<TextServer::LineBreakFlag> autowrap_flags = TextServer::BREAK_MANDATORY;
+ switch (autowrap_mode) {
+ case TextServer::AUTOWRAP_WORD_SMART:
+ autowrap_flags = TextServer::BREAK_WORD_BOUND | TextServer::BREAK_ADAPTIVE | TextServer::BREAK_MANDATORY;
+ break;
+ case TextServer::AUTOWRAP_WORD:
+ autowrap_flags = TextServer::BREAK_WORD_BOUND | TextServer::BREAK_MANDATORY;
+ break;
+ case TextServer::AUTOWRAP_ARBITRARY:
+ autowrap_flags = TextServer::BREAK_GRAPHEME_BOUND | TextServer::BREAK_MANDATORY;
+ break;
+ case TextServer::AUTOWRAP_OFF:
+ break;
+ }
+ autowrap_flags = autowrap_flags | TextServer::BREAK_TRIM_EDGE_SPACES;
- if (autowrap_mode == TextServer::AUTOWRAP_OFF) {
- minsize.width = 0.0f;
- for (int i = 0; i < lines_rid.size(); i++) {
- if (minsize.width < TS->shaped_text_get_size(lines_rid[i]).x) {
- minsize.width = TS->shaped_text_get_size(lines_rid[i]).x;
+ PackedInt32Array line_breaks = TS->shaped_text_get_line_breaks(text_rid, width, 0, autowrap_flags);
+ for (int i = 0; i < line_breaks.size(); i = i + 2) {
+ RID line = TS->shaped_text_substr(text_rid, line_breaks[i], line_breaks[i + 1] - line_breaks[i]);
+ lines_rid.push_back(line);
+ }
}
- }
- }
- if (lines_dirty) {
- BitField<TextServer::TextOverrunFlag> overrun_flags = TextServer::OVERRUN_NO_TRIM;
- switch (overrun_behavior) {
- case TextServer::OVERRUN_TRIM_WORD_ELLIPSIS:
- overrun_flags.set_flag(TextServer::OVERRUN_TRIM);
- overrun_flags.set_flag(TextServer::OVERRUN_TRIM_WORD_ONLY);
- overrun_flags.set_flag(TextServer::OVERRUN_ADD_ELLIPSIS);
- break;
- case TextServer::OVERRUN_TRIM_ELLIPSIS:
- overrun_flags.set_flag(TextServer::OVERRUN_TRIM);
- overrun_flags.set_flag(TextServer::OVERRUN_ADD_ELLIPSIS);
- break;
- case TextServer::OVERRUN_TRIM_WORD:
- overrun_flags.set_flag(TextServer::OVERRUN_TRIM);
- overrun_flags.set_flag(TextServer::OVERRUN_TRIM_WORD_ONLY);
- break;
- case TextServer::OVERRUN_TRIM_CHAR:
- overrun_flags.set_flag(TextServer::OVERRUN_TRIM);
- break;
- case TextServer::OVERRUN_NO_TRIMMING:
- break;
- }
-
- // Fill after min_size calculation.
-
- if (autowrap_mode != TextServer::AUTOWRAP_OFF) {
- int visible_lines = get_visible_line_count();
- bool lines_hidden = visible_lines > 0 && visible_lines < lines_rid.size();
- if (lines_hidden) {
- overrun_flags.set_flag(TextServer::OVERRUN_ENFORCE_ELLIPSIS);
- }
- if (horizontal_alignment == HORIZONTAL_ALIGNMENT_FILL) {
+ if (can_dictate_width) {
for (int i = 0; i < lines_rid.size(); i++) {
- if (i < visible_lines - 1 || lines_rid.size() == 1) {
- TS->shaped_text_fit_to_width(lines_rid[i], width);
- } else if (i == (visible_lines - 1)) {
- TS->shaped_text_overrun_trim_to_width(lines_rid[visible_lines - 1], width, overrun_flags);
+ if (minsize.width < TS->shaped_text_get_size(lines_rid[i]).x) {
+ minsize.width = TS->shaped_text_get_size(lines_rid[i]).x;
}
}
- } else if (lines_hidden) {
- TS->shaped_text_overrun_trim_to_width(lines_rid[visible_lines - 1], width, overrun_flags);
+
+ width = (minsize.width - style->get_minimum_size().width);
}
- } else {
- // Autowrap disabled.
- for (int i = 0; i < lines_rid.size(); i++) {
- if (horizontal_alignment == HORIZONTAL_ALIGNMENT_FILL) {
- TS->shaped_text_fit_to_width(lines_rid[i], width);
- overrun_flags.set_flag(TextServer::OVERRUN_JUSTIFICATION_AWARE);
- TS->shaped_text_overrun_trim_to_width(lines_rid[i], width, overrun_flags);
- TS->shaped_text_fit_to_width(lines_rid[i], width, TextServer::JUSTIFICATION_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_CONSTRAIN_ELLIPSIS);
+
+ if (lines_dirty) {
+ BitField<TextServer::TextOverrunFlag> overrun_flags = TextServer::OVERRUN_NO_TRIM;
+ switch (overrun_behavior) {
+ case TextServer::OVERRUN_TRIM_WORD_ELLIPSIS:
+ overrun_flags.set_flag(TextServer::OVERRUN_TRIM);
+ overrun_flags.set_flag(TextServer::OVERRUN_TRIM_WORD_ONLY);
+ overrun_flags.set_flag(TextServer::OVERRUN_ADD_ELLIPSIS);
+ break;
+ case TextServer::OVERRUN_TRIM_ELLIPSIS:
+ overrun_flags.set_flag(TextServer::OVERRUN_TRIM);
+ overrun_flags.set_flag(TextServer::OVERRUN_ADD_ELLIPSIS);
+ break;
+ case TextServer::OVERRUN_TRIM_WORD:
+ overrun_flags.set_flag(TextServer::OVERRUN_TRIM);
+ overrun_flags.set_flag(TextServer::OVERRUN_TRIM_WORD_ONLY);
+ break;
+ case TextServer::OVERRUN_TRIM_CHAR:
+ overrun_flags.set_flag(TextServer::OVERRUN_TRIM);
+ break;
+ case TextServer::OVERRUN_NO_TRIMMING:
+ break;
+ }
+
+ // Fill after min_size calculation.
+
+ int visible_lines = lines_rid.size();
+ if (max_lines_visible >= 0 && visible_lines > max_lines_visible) {
+ visible_lines = max_lines_visible;
+ }
+ if (autowrap_mode != TextServer::AUTOWRAP_OFF) {
+ bool lines_hidden = visible_lines > 0 && visible_lines < lines_rid.size();
+ if (lines_hidden) {
+ overrun_flags.set_flag(TextServer::OVERRUN_ENFORCE_ELLIPSIS);
+ }
+ if (horizontal_alignment == HORIZONTAL_ALIGNMENT_FILL) {
+ for (int i = 0; i < lines_rid.size(); i++) {
+ if (i < visible_lines - 1 || lines_rid.size() == 1) {
+ TS->shaped_text_fit_to_width(lines_rid[i], width);
+ } else if (i == (visible_lines - 1)) {
+ TS->shaped_text_overrun_trim_to_width(lines_rid[visible_lines - 1], width, overrun_flags);
+ }
+ }
+ } else if (lines_hidden) {
+ TS->shaped_text_overrun_trim_to_width(lines_rid[visible_lines - 1], width, overrun_flags);
+ }
} else {
- TS->shaped_text_overrun_trim_to_width(lines_rid[i], width, overrun_flags);
+ // Autowrap disabled.
+ for (int i = 0; i < lines_rid.size(); i++) {
+ if (horizontal_alignment == HORIZONTAL_ALIGNMENT_FILL) {
+ TS->shaped_text_fit_to_width(lines_rid[i], width);
+ overrun_flags.set_flag(TextServer::OVERRUN_JUSTIFICATION_AWARE);
+ TS->shaped_text_overrun_trim_to_width(lines_rid[i], width, overrun_flags);
+ TS->shaped_text_fit_to_width(lines_rid[i], width, TextServer::JUSTIFICATION_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_CONSTRAIN_ELLIPSIS);
+ } else {
+ TS->shaped_text_overrun_trim_to_width(lines_rid[i], width, overrun_flags);
+ }
+ }
}
+
+ int last_line = MIN(lines_rid.size(), visible_lines + lines_skipped);
+ int line_spacing = settings.is_valid() ? settings->get_line_spacing() : theme_cache.line_spacing;
+ for (int64_t i = lines_skipped; i < last_line; i++) {
+ minsize.height += TS->shaped_text_get_size(lines_rid[i]).y + line_spacing;
+ }
+
+ lines_dirty = false;
}
+ } else {
+ callable_mp(this, &Label::_shape).call_deferred();
}
- lines_dirty = false;
- lines_shaped_last_width = get_size().width;
}
- _update_visible();
-
- if (autowrap_mode == TextServer::AUTOWRAP_OFF || !clip || overrun_behavior == TextServer::OVERRUN_NO_TRIMMING) {
- update_minimum_size();
+ if (draw_pending) {
+ queue_redraw();
+ draw_pending = false;
}
-}
-void Label::_update_visible() {
- int line_spacing = settings.is_valid() ? settings->get_line_spacing() : theme_cache.line_spacing;
- Ref<StyleBox> style = theme_cache.normal_style;
- int lines_visible = lines_rid.size();
-
- if (max_lines_visible >= 0 && lines_visible > max_lines_visible) {
- lines_visible = max_lines_visible;
+ if (minsize != prev_minsize) {
+ update_minimum_size();
}
- minsize.height = 0;
- int last_line = MIN(lines_rid.size(), lines_visible + lines_skipped);
- for (int64_t i = lines_skipped; i < last_line; i++) {
- minsize.height += TS->shaped_text_get_size(lines_rid[i]).y + line_spacing;
- if (minsize.height > (get_size().height - style->get_minimum_size().height + line_spacing)) {
- break;
- }
- }
+ return can_process_lines;
}
inline void draw_glyph(const Glyph &p_gl, const RID &p_canvas, const Color &p_font_color, const Vector2 &p_ofs) {
@@ -345,8 +362,24 @@ void Label::_notification(int p_what) {
RenderingServer::get_singleton()->canvas_item_set_clip(get_canvas_item(), true);
}
+ // When a shaped text is invalidated by an external source, we want to reshape it.
+ if (!TS->shaped_text_is_ready(text_rid)) {
+ dirty = true;
+ }
+
+ for (const RID &line_rid : lines_rid) {
+ if (!TS->shaped_text_is_ready(line_rid)) {
+ lines_dirty = true;
+ break;
+ }
+ }
+
if (dirty || font_dirty || lines_dirty) {
- _shape();
+ if (!_shape()) {
+ // There will be another pass.
+ draw_pending = true;
+ break;
+ }
}
RID ci = get_canvas_item();
@@ -589,6 +622,8 @@ void Label::_notification(int p_what) {
}
ofs.y += TS->shaped_text_get_descent(lines_rid[i]) + vsep + line_spacing;
}
+
+ draw_pending = false;
} break;
case NOTIFICATION_THEME_CHANGED: {
@@ -597,13 +632,7 @@ void Label::_notification(int p_what) {
} break;
case NOTIFICATION_RESIZED: {
- // It may happen that the reshaping due to this size change triggers a cascade of re-layout
- // across the hierarchy where this label belongs to in a way that its size changes multiple
- // times, but ending up with the original size it was already shaped for.
- // This check prevents the catastrophic, freezing infinite cascade of re-layout.
- if (lines_shaped_last_width != get_size().width) {
- lines_dirty = true;
- }
+ lines_dirty = true;
} break;
}
}
@@ -886,7 +915,7 @@ void Label::set_lines_skipped(int p_lines) {
}
lines_skipped = p_lines;
- _update_visible();
+ lines_dirty = true;
queue_redraw();
}
@@ -900,7 +929,7 @@ void Label::set_max_lines_visible(int p_lines) {
}
max_lines_visible = p_lines;
- _update_visible();
+ lines_dirty = true;
queue_redraw();
}
diff --git a/scene/gui/label.h b/scene/gui/label.h
index b80646810b..36b85f7af8 100644
--- a/scene/gui/label.h
+++ b/scene/gui/label.h
@@ -46,11 +46,10 @@ private:
bool clip = false;
TextServer::OverrunBehavior overrun_behavior = TextServer::OVERRUN_NO_TRIMMING;
Size2 minsize;
+ real_t stable_width = -1;
bool uppercase = false;
bool lines_dirty = true;
- int lines_shaped_last_width = -1;
-
bool dirty = true;
bool font_dirty = true;
RID text_rid;
@@ -66,6 +65,7 @@ private:
float visible_ratio = 1.0;
int lines_skipped = 0;
int max_lines_visible = -1;
+ bool draw_pending = false;
Ref<LabelSettings> settings;
@@ -83,8 +83,7 @@ private:
int font_shadow_outline_size;
} theme_cache;
- void _update_visible();
- void _shape();
+ bool _shape();
void _invalidate();
protected:
diff --git a/scene/gui/line_edit.cpp b/scene/gui/line_edit.cpp
index 16a718722c..a57dccd5c8 100644
--- a/scene/gui/line_edit.cpp
+++ b/scene/gui/line_edit.cpp
@@ -274,6 +274,7 @@ void LineEdit::gui_input(const Ref<InputEvent> &p_event) {
}
}
grab_focus();
+ accept_event();
return;
}
@@ -383,6 +384,7 @@ void LineEdit::gui_input(const Ref<InputEvent> &p_event) {
}
queue_redraw();
+ return;
}
Ref<InputEventMouseMotion> m = p_event;
@@ -407,6 +409,8 @@ void LineEdit::gui_input(const Ref<InputEvent> &p_event) {
drag_caret_force_displayed = true;
set_caret_at_pixel_pos(m->get_position().x);
}
+
+ return;
}
Ref<InputEventKey> k = p_event;
@@ -460,6 +464,9 @@ void LineEdit::gui_input(const Ref<InputEvent> &p_event) {
menu->reset_size();
menu->popup();
menu->grab_focus();
+
+ accept_event();
+ return;
}
}
@@ -469,6 +476,8 @@ void LineEdit::gui_input(const Ref<InputEvent> &p_event) {
if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_VIRTUAL_KEYBOARD) && virtual_keyboard_enabled) {
DisplayServer::get_singleton()->virtual_keyboard_hide();
}
+ accept_event();
+ return;
}
if (is_shortcut_keys_enabled()) {
@@ -608,6 +617,7 @@ void LineEdit::gui_input(const Ref<InputEvent> &p_event) {
_text_changed();
}
accept_event();
+ return;
}
}
}
diff --git a/scene/gui/popup.cpp b/scene/gui/popup.cpp
index 2ea1b93810..432004dedc 100644
--- a/scene/gui/popup.cpp
+++ b/scene/gui/popup.cpp
@@ -36,7 +36,7 @@
void Popup::_input_from_window(const Ref<InputEvent> &p_event) {
Ref<InputEventKey> key = p_event;
- if (key.is_valid() && key->is_pressed() && key->get_keycode() == Key::ESCAPE) {
+ if (get_flag(FLAG_POPUP) && key.is_valid() && key->is_pressed() && key->get_keycode() == Key::ESCAPE) {
_close_pressed();
}
}
@@ -102,12 +102,17 @@ void Popup::_notification(int p_what) {
}
} break;
- case NOTIFICATION_WM_CLOSE_REQUEST:
- case NOTIFICATION_APPLICATION_FOCUS_OUT: {
+ case NOTIFICATION_WM_CLOSE_REQUEST: {
if (!is_in_edited_scene_root()) {
_close_pressed();
}
} break;
+
+ case NOTIFICATION_APPLICATION_FOCUS_OUT: {
+ if (!is_in_edited_scene_root() && get_flag(FLAG_POPUP)) {
+ _close_pressed();
+ }
+ } break;
}
}
diff --git a/scene/gui/popup_menu.cpp b/scene/gui/popup_menu.cpp
index 0eeac2f285..1a6adca121 100644
--- a/scene/gui/popup_menu.cpp
+++ b/scene/gui/popup_menu.cpp
@@ -59,6 +59,7 @@ Size2 PopupMenu::_get_contents_minimum_size() const {
for (int i = 0; i < items.size(); i++) {
Size2 item_size;
+ const_cast<PopupMenu *>(this)->_shape_item(i);
Size2 icon_size = items[i].get_icon_size();
item_size.height = _get_item_height(i);
diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp
index f9c9906efa..2c1c44322a 100644
--- a/scene/gui/rich_text_label.cpp
+++ b/scene/gui/rich_text_label.cpp
@@ -5520,34 +5520,6 @@ void RichTextLabel::_bind_methods() {
BIND_ENUM_CONSTANT(LIST_ROMAN);
BIND_ENUM_CONSTANT(LIST_DOTS);
- BIND_ENUM_CONSTANT(ITEM_FRAME);
- BIND_ENUM_CONSTANT(ITEM_TEXT);
- BIND_ENUM_CONSTANT(ITEM_IMAGE);
- BIND_ENUM_CONSTANT(ITEM_NEWLINE);
- BIND_ENUM_CONSTANT(ITEM_FONT);
- BIND_ENUM_CONSTANT(ITEM_FONT_SIZE);
- BIND_ENUM_CONSTANT(ITEM_FONT_FEATURES);
- BIND_ENUM_CONSTANT(ITEM_COLOR);
- BIND_ENUM_CONSTANT(ITEM_OUTLINE_SIZE);
- BIND_ENUM_CONSTANT(ITEM_OUTLINE_COLOR);
- BIND_ENUM_CONSTANT(ITEM_UNDERLINE);
- BIND_ENUM_CONSTANT(ITEM_STRIKETHROUGH);
- BIND_ENUM_CONSTANT(ITEM_PARAGRAPH);
- BIND_ENUM_CONSTANT(ITEM_INDENT);
- BIND_ENUM_CONSTANT(ITEM_LIST);
- BIND_ENUM_CONSTANT(ITEM_TABLE);
- BIND_ENUM_CONSTANT(ITEM_FADE);
- BIND_ENUM_CONSTANT(ITEM_SHAKE);
- BIND_ENUM_CONSTANT(ITEM_WAVE);
- BIND_ENUM_CONSTANT(ITEM_TORNADO);
- BIND_ENUM_CONSTANT(ITEM_RAINBOW);
- BIND_ENUM_CONSTANT(ITEM_BGCOLOR);
- BIND_ENUM_CONSTANT(ITEM_FGCOLOR);
- BIND_ENUM_CONSTANT(ITEM_META);
- BIND_ENUM_CONSTANT(ITEM_HINT);
- BIND_ENUM_CONSTANT(ITEM_DROPCAP);
- BIND_ENUM_CONSTANT(ITEM_CUSTOMFX);
-
BIND_ENUM_CONSTANT(MENU_COPY);
BIND_ENUM_CONSTANT(MENU_SELECT_ALL);
BIND_ENUM_CONSTANT(MENU_MAX);
diff --git a/scene/gui/rich_text_label.h b/scene/gui/rich_text_label.h
index b01fccf14c..1dae8b75ca 100644
--- a/scene/gui/rich_text_label.h
+++ b/scene/gui/rich_text_label.h
@@ -740,7 +740,6 @@ public:
};
VARIANT_ENUM_CAST(RichTextLabel::ListType);
-VARIANT_ENUM_CAST(RichTextLabel::ItemType);
VARIANT_ENUM_CAST(RichTextLabel::MenuItems);
#endif // RICH_TEXT_LABEL_H
diff --git a/scene/gui/tab_bar.cpp b/scene/gui/tab_bar.cpp
index eca6cb3eef..5e378a0321 100644
--- a/scene/gui/tab_bar.cpp
+++ b/scene/gui/tab_bar.cpp
@@ -342,6 +342,8 @@ void TabBar::_notification(int p_what) {
_shape(i);
}
+ queue_redraw();
+
[[fallthrough]];
}
case NOTIFICATION_RESIZED: {
diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp
index 0f39715851..f8c2e9f4ad 100644
--- a/scene/gui/tree.cpp
+++ b/scene/gui/tree.cpp
@@ -1775,10 +1775,10 @@ void Tree::draw_item_rect(TreeItem::Cell &p_cell, const Rect2i &p_rect, const Co
RID ci = get_canvas_item();
- if (rtl) {
+ if (rtl && rect.size.width > 0) {
Point2 draw_pos = rect.position;
draw_pos.y += Math::floor((rect.size.y - p_cell.text_buf->get_size().y) / 2.0);
- p_cell.text_buf->set_width(MAX(0, rect.size.width));
+ p_cell.text_buf->set_width(rect.size.width);
if (p_ol_size > 0 && p_ol_color.a > 0) {
p_cell.text_buf->draw_outline(ci, draw_pos, p_ol_size, p_ol_color);
}
@@ -1800,10 +1800,10 @@ void Tree::draw_item_rect(TreeItem::Cell &p_cell, const Rect2i &p_rect, const Co
rect.size.x -= bmsize.x + theme_cache.h_separation;
}
- if (!rtl) {
+ if (!rtl && rect.size.width > 0) {
Point2 draw_pos = rect.position;
draw_pos.y += Math::floor((rect.size.y - p_cell.text_buf->get_size().y) / 2.0);
- p_cell.text_buf->set_width(MAX(0, rect.size.width));
+ p_cell.text_buf->set_width(rect.size.width);
if (p_ol_size > 0 && p_ol_color.a > 0) {
p_cell.text_buf->draw_outline(ci, draw_pos, p_ol_size, p_ol_color);
}
diff --git a/scene/gui/view_panner.cpp b/scene/gui/view_panner.cpp
index 145497fa61..51af886709 100644
--- a/scene/gui/view_panner.cpp
+++ b/scene/gui/view_panner.cpp
@@ -125,7 +125,7 @@ bool ViewPanner::gui_input(const Ref<InputEvent> &p_event, Rect2 p_canvas_rect)
Ref<InputEventPanGesture> pan_gesture = p_event;
if (pan_gesture.is_valid()) {
- callback_helper(pan_callback, varray(-pan_gesture->get_delta(), p_event));
+ callback_helper(pan_callback, varray(-pan_gesture->get_delta() * scroll_speed, p_event));
}
Ref<InputEventScreenDrag> screen_drag = p_event;
diff --git a/scene/main/canvas_item.cpp b/scene/main/canvas_item.cpp
index e5dcdd2afd..1c7d42ad36 100644
--- a/scene/main/canvas_item.cpp
+++ b/scene/main/canvas_item.cpp
@@ -515,12 +515,13 @@ void CanvasItem::draw_dashed_line(const Point2 &p_from, const Point2 &p_to, cons
ERR_FAIL_COND_MSG(!drawing, "Drawing is only allowed inside NOTIFICATION_DRAW, _draw() function or 'draw' signal.");
float length = (p_to - p_from).length();
- if (length < p_dash) {
+ Vector2 step = p_dash * (p_to - p_from).normalized();
+
+ if (length < p_dash || step == Vector2() || p_dash <= 0.0) {
RenderingServer::get_singleton()->canvas_item_add_line(canvas_item, p_from, p_to, p_color, p_width);
return;
}
- Vector2 step = p_dash * (p_to - p_from).normalized();
int steps = (p_aligned) ? Math::ceil(length / p_dash) : Math::floor(length / p_dash);
if (steps % 2 == 0) {
steps--;
diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp
index a1e7555a5d..126b1d54fc 100644
--- a/scene/main/viewport.cpp
+++ b/scene/main/viewport.cpp
@@ -166,6 +166,24 @@ ViewportTexture::~ViewportTexture() {
}
void Viewport::_sub_window_update_order() {
+ if (gui.sub_windows.size() < 2) {
+ return;
+ }
+
+ if (!gui.sub_windows[gui.sub_windows.size() - 1].window->get_flag(Window::FLAG_ALWAYS_ON_TOP)) {
+ int index = gui.sub_windows.size() - 1;
+
+ while (index > 0 && gui.sub_windows[index - 1].window->get_flag(Window::FLAG_ALWAYS_ON_TOP)) {
+ --index;
+ }
+
+ if (index != (gui.sub_windows.size() - 1)) {
+ SubWindow sw = gui.sub_windows[gui.sub_windows.size() - 1];
+ gui.sub_windows.remove_at(gui.sub_windows.size() - 1);
+ gui.sub_windows.insert(index, sw);
+ }
+ }
+
for (int i = 0; i < gui.sub_windows.size(); i++) {
RS::get_singleton()->canvas_item_set_draw_index(gui.sub_windows[i].canvas_item, i);
}
@@ -823,11 +841,12 @@ void Viewport::_set_size(const Size2i &p_size, const Size2i &p_size_2d_override,
stretch_transform_new.scale(scale);
}
- if (size == p_size && size_allocated == p_allocated && stretch_transform == stretch_transform_new && p_size_2d_override == size_2d_override) {
+ Size2i new_size = p_size.max(Size2i(2, 2));
+ if (size == new_size && size_allocated == p_allocated && stretch_transform == stretch_transform_new && p_size_2d_override == size_2d_override) {
return;
}
- size = p_size;
+ size = new_size;
size_allocated = p_allocated;
size_2d_override = p_size_2d_override;
stretch_transform = stretch_transform_new;
diff --git a/scene/main/window.cpp b/scene/main/window.cpp
index 44df648552..b79a9ba444 100644
--- a/scene/main/window.cpp
+++ b/scene/main/window.cpp
@@ -569,6 +569,12 @@ void Window::_update_from_window() {
void Window::_clear_window() {
ERR_FAIL_COND(window_id == DisplayServer::INVALID_WINDOW_ID);
+ DisplayServer::get_singleton()->window_set_rect_changed_callback(Callable(), window_id);
+ DisplayServer::get_singleton()->window_set_window_event_callback(Callable(), window_id);
+ DisplayServer::get_singleton()->window_set_input_event_callback(Callable(), window_id);
+ DisplayServer::get_singleton()->window_set_input_text_callback(Callable(), window_id);
+ DisplayServer::get_singleton()->window_set_drop_files_callback(Callable(), window_id);
+
if (transient_parent && transient_parent->window_id != DisplayServer::INVALID_WINDOW_ID) {
DisplayServer::get_singleton()->window_set_transient(window_id, DisplayServer::INVALID_WINDOW_ID);
}
@@ -978,17 +984,13 @@ void Window::_update_viewport_size() {
Size2 margin;
Size2 offset;
- //black bars and margin
+
if (content_scale_aspect != CONTENT_SCALE_ASPECT_EXPAND && screen_size.x < video_mode.x) {
margin.x = Math::round((video_mode.x - screen_size.x) / 2.0);
- //RenderingServer::get_singleton()->black_bars_set_margins(margin.x, 0, margin.x, 0);
offset.x = Math::round(margin.x * viewport_size.y / screen_size.y);
} else if (content_scale_aspect != CONTENT_SCALE_ASPECT_EXPAND && screen_size.y < video_mode.y) {
margin.y = Math::round((video_mode.y - screen_size.y) / 2.0);
- //RenderingServer::get_singleton()->black_bars_set_margins(0, margin.y, 0, margin.y);
offset.y = Math::round(margin.y * viewport_size.x / screen_size.x);
- } else {
- //RenderingServer::get_singleton()->black_bars_set_margins(0, 0, 0, 0);
}
switch (content_scale_mode) {
@@ -1115,6 +1117,7 @@ void Window::_notification(int p_what) {
position = DisplayServer::get_singleton()->window_get_position(window_id);
size = DisplayServer::get_singleton()->window_get_size(window_id);
}
+ _update_window_size(); // Inform DisplayServer of minimum and maximum size.
_update_viewport_size(); // Then feed back to the viewport.
_update_window_callbacks();
RS::get_singleton()->viewport_set_update_mode(get_viewport_rid(), RS::VIEWPORT_UPDATE_WHEN_VISIBLE);
@@ -1422,6 +1425,9 @@ void Window::popup_centered_clamped(const Size2i &p_size, float p_fallback_ratio
ERR_FAIL_COND(!is_inside_tree());
ERR_FAIL_COND_MSG(window_id == DisplayServer::MAIN_WINDOW_ID, "Can't popup the main window.");
+ // Consider the current size when calling with the default value.
+ Size2i expected_size = p_size == Size2i() ? size : p_size;
+
Rect2 parent_rect;
if (is_embedded()) {
@@ -1436,7 +1442,7 @@ void Window::popup_centered_clamped(const Size2i &p_size, float p_fallback_ratio
Vector2i size_ratio = parent_rect.size * p_fallback_ratio;
Rect2i popup_rect;
- popup_rect.size = Vector2i(MIN(size_ratio.x, p_size.x), MIN(size_ratio.y, p_size.y));
+ popup_rect.size = Vector2i(MIN(size_ratio.x, expected_size.x), MIN(size_ratio.y, expected_size.y));
popup_rect.size = _clamp_window_size(popup_rect.size);
if (parent_rect != Rect2()) {
@@ -1450,6 +1456,9 @@ void Window::popup_centered(const Size2i &p_minsize) {
ERR_FAIL_COND(!is_inside_tree());
ERR_FAIL_COND_MSG(window_id == DisplayServer::MAIN_WINDOW_ID, "Can't popup the main window.");
+ // Consider the current size when calling with the default value.
+ Size2i expected_size = p_minsize == Size2i() ? size : p_minsize;
+
Rect2 parent_rect;
if (is_embedded()) {
@@ -1462,7 +1471,7 @@ void Window::popup_centered(const Size2i &p_minsize) {
}
Rect2i popup_rect;
- popup_rect.size = _clamp_window_size(p_minsize);
+ popup_rect.size = _clamp_window_size(expected_size);
if (parent_rect != Rect2()) {
popup_rect.position = parent_rect.position + (parent_rect.size - popup_rect.size) / 2;
diff --git a/scene/resources/mesh.cpp b/scene/resources/mesh.cpp
index cf9baa2907..a7b53244e2 100644
--- a/scene/resources/mesh.cpp
+++ b/scene/resources/mesh.cpp
@@ -526,6 +526,9 @@ Ref<Mesh> Mesh::create_outline(float p_margin) const {
vc = indices.size();
ir = indices.ptrw();
has_indices = true;
+ } else {
+ // Ensure there are enough vertices to construct at least one triangle.
+ ERR_FAIL_COND_V(vertices.size() % 3 != 0, Ref<ArrayMesh>());
}
HashMap<Vector3, Vector3> normal_accum;
diff --git a/scene/resources/primitive_meshes.cpp b/scene/resources/primitive_meshes.cpp
index ef1f6459e9..8ed68626a8 100644
--- a/scene/resources/primitive_meshes.cpp
+++ b/scene/resources/primitive_meshes.cpp
@@ -2890,6 +2890,18 @@ void TextMesh::_create_mesh_array(Array &p_arr) const {
dirty_cache = false;
}
+ // When a shaped text is invalidated by an external source, we want to reshape it.
+ if (!TS->shaped_text_is_ready(text_rid)) {
+ dirty_text = true;
+ }
+
+ for (const RID &line_rid : lines_rid) {
+ if (!TS->shaped_text_is_ready(line_rid)) {
+ dirty_lines = true;
+ break;
+ }
+ }
+
// Update text buffer.
if (dirty_text) {
TS->shaped_text_clear(text_rid);
@@ -3328,7 +3340,7 @@ void TextMesh::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "pixel_size", PROPERTY_HINT_RANGE, "0.0001,128,0.0001,suffix:m"), "set_pixel_size", "get_pixel_size");
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "curve_step", PROPERTY_HINT_RANGE, "0.1,10,0.1,suffix:px"), "set_curve_step", "get_curve_step");
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "depth", PROPERTY_HINT_RANGE, "0.0,100.0,0.001,or_greater,suffix:m"), "set_depth", "get_depth");
- ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "width", PROPERTY_HINT_NONE, "suffix:m"), "set_width", "get_width");
+ ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "width", PROPERTY_HINT_NONE, "suffix:px"), "set_width", "get_width");
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "offset", PROPERTY_HINT_NONE, "suffix:px"), "set_offset", "get_offset");
ADD_GROUP("BiDi", "");
diff --git a/scene/resources/surface_tool.cpp b/scene/resources/surface_tool.cpp
index 16cc1c3370..ccb3ddee45 100644
--- a/scene/resources/surface_tool.cpp
+++ b/scene/resources/surface_tool.cpp
@@ -648,7 +648,7 @@ Array SurfaceTool::commit_to_arrays() {
for (uint32_t idx = 0; idx < vertex_array.size(); idx++) {
const Vertex &v = vertex_array[idx];
- if (v.bones.size() > count) {
+ if (v.bones.size() != count) {
ERR_PRINT_ONCE(vformat("Invalid bones size %d vs count %d", v.bones.size(), count));
continue;
}
@@ -672,7 +672,7 @@ Array SurfaceTool::commit_to_arrays() {
for (uint32_t idx = 0; idx < vertex_array.size(); idx++) {
const Vertex &v = vertex_array[idx];
- if (v.weights.size() > count) {
+ if (v.weights.size() != count) {
ERR_PRINT_ONCE(vformat("Invalid weight size %d vs count %d", v.weights.size(), count));
continue;
}
diff --git a/scene/resources/text_file.cpp b/scene/resources/text_file.cpp
index 9b61a95edb..77ff0f55b1 100644
--- a/scene/resources/text_file.cpp
+++ b/scene/resources/text_file.cpp
@@ -67,5 +67,10 @@ Error TextFile::load_text(const String &p_path) {
ERR_FAIL_COND_V_MSG(s.parse_utf8((const char *)w) != OK, ERR_INVALID_DATA, "Script '" + p_path + "' contains invalid unicode (UTF-8), so it was not loaded. Please ensure that scripts are saved in valid UTF-8 unicode.");
text = s;
path = p_path;
+#ifdef TOOLS_ENABLED
+ if (ResourceLoader::get_timestamp_on_load()) {
+ set_last_modified_time(FileAccess::get_modified_time(path));
+ }
+#endif // TOOLS_ENABLED
return OK;
}
diff --git a/scene/resources/text_line.cpp b/scene/resources/text_line.cpp
index 93611ea2c4..38a865b170 100644
--- a/scene/resources/text_line.cpp
+++ b/scene/resources/text_line.cpp
@@ -101,6 +101,11 @@ void TextLine::_bind_methods() {
}
void TextLine::_shape() {
+ // When a shaped text is invalidated by an external source, we want to reshape it.
+ if (!TS->shaped_text_is_ready(rid)) {
+ dirty = true;
+ }
+
if (dirty) {
if (!tab_stops.is_empty()) {
TS->shaped_text_tab_align(rid, tab_stops);
diff --git a/scene/resources/text_paragraph.cpp b/scene/resources/text_paragraph.cpp
index dfafc7d2bc..729063245c 100644
--- a/scene/resources/text_paragraph.cpp
+++ b/scene/resources/text_paragraph.cpp
@@ -134,6 +134,18 @@ void TextParagraph::_bind_methods() {
}
void TextParagraph::_shape_lines() {
+ // When a shaped text is invalidated by an external source, we want to reshape it.
+ if (!TS->shaped_text_is_ready(rid) || !TS->shaped_text_is_ready(dropcap_rid)) {
+ lines_dirty = true;
+ }
+
+ for (const RID &line_rid : lines_rid) {
+ if (!TS->shaped_text_is_ready(line_rid)) {
+ lines_dirty = true;
+ break;
+ }
+ }
+
if (lines_dirty) {
for (const RID &line_rid : lines_rid) {
TS->free_rid(line_rid);
diff --git a/scene/resources/tile_set.cpp b/scene/resources/tile_set.cpp
index 58a638804d..d4b2be355e 100644
--- a/scene/resources/tile_set.cpp
+++ b/scene/resources/tile_set.cpp
@@ -3308,7 +3308,7 @@ bool TileSet::_get(const StringName &p_name, Variant &r_ret) const {
void TileSet::_get_property_list(List<PropertyInfo> *p_list) const {
PropertyInfo property_info;
// Rendering.
- p_list->push_back(PropertyInfo(Variant::NIL, "Rendering", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP));
+ p_list->push_back(PropertyInfo(Variant::NIL, GNAME("Rendering", ""), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP));
for (int i = 0; i < occlusion_layers.size(); i++) {
p_list->push_back(PropertyInfo(Variant::INT, vformat("occlusion_layer_%d/light_mask", i), PROPERTY_HINT_LAYERS_2D_RENDER));
@@ -3321,7 +3321,7 @@ void TileSet::_get_property_list(List<PropertyInfo> *p_list) const {
}
// Physics.
- p_list->push_back(PropertyInfo(Variant::NIL, "Physics", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP));
+ p_list->push_back(PropertyInfo(Variant::NIL, GNAME("Physics", ""), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP));
for (int i = 0; i < physics_layers.size(); i++) {
p_list->push_back(PropertyInfo(Variant::INT, vformat("physics_layer_%d/collision_layer", i), PROPERTY_HINT_LAYERS_2D_PHYSICS));
@@ -3341,7 +3341,7 @@ void TileSet::_get_property_list(List<PropertyInfo> *p_list) const {
}
// Terrains.
- p_list->push_back(PropertyInfo(Variant::NIL, "Terrains", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP));
+ p_list->push_back(PropertyInfo(Variant::NIL, GNAME("Terrains", ""), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP));
for (int terrain_set_index = 0; terrain_set_index < terrain_sets.size(); terrain_set_index++) {
p_list->push_back(PropertyInfo(Variant::INT, vformat("terrain_set_%d/mode", terrain_set_index), PROPERTY_HINT_ENUM, "Match Corners and Sides,Match Corners,Match Sides"));
p_list->push_back(PropertyInfo(Variant::NIL, vformat("terrain_set_%d/terrains", terrain_set_index), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_ARRAY, vformat("terrain_set_%d/terrain_", terrain_set_index)));
@@ -3352,7 +3352,7 @@ void TileSet::_get_property_list(List<PropertyInfo> *p_list) const {
}
// Navigation.
- p_list->push_back(PropertyInfo(Variant::NIL, "Navigation", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP));
+ p_list->push_back(PropertyInfo(Variant::NIL, GNAME("Navigation", ""), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP));
for (int i = 0; i < navigation_layers.size(); i++) {
p_list->push_back(PropertyInfo(Variant::INT, vformat("navigation_layer_%d/layers", i), PROPERTY_HINT_LAYERS_2D_NAVIGATION));
}
@@ -3362,7 +3362,7 @@ void TileSet::_get_property_list(List<PropertyInfo> *p_list) const {
for (int i = 1; i < Variant::VARIANT_MAX; i++) {
argt += "," + Variant::get_type_name(Variant::Type(i));
}
- p_list->push_back(PropertyInfo(Variant::NIL, "Custom data", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP));
+ p_list->push_back(PropertyInfo(Variant::NIL, GNAME("Custom Data", ""), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP));
for (int i = 0; i < custom_data_layers.size(); i++) {
p_list->push_back(PropertyInfo(Variant::STRING, vformat("custom_data_layer_%d/name", i)));
p_list->push_back(PropertyInfo(Variant::INT, vformat("custom_data_layer_%d/type", i), PROPERTY_HINT_ENUM, argt));
@@ -3376,10 +3376,10 @@ void TileSet::_get_property_list(List<PropertyInfo> *p_list) const {
// Tile Proxies.
// Note: proxies need to be set after sources are set.
- p_list->push_back(PropertyInfo(Variant::NIL, "Tile Proxies", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP));
- p_list->push_back(PropertyInfo(Variant::ARRAY, "tile_proxies/source_level", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR));
- p_list->push_back(PropertyInfo(Variant::ARRAY, "tile_proxies/coords_level", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR));
- p_list->push_back(PropertyInfo(Variant::ARRAY, "tile_proxies/alternative_level", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR));
+ p_list->push_back(PropertyInfo(Variant::NIL, GNAME("Tile Proxies", ""), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP));
+ p_list->push_back(PropertyInfo(Variant::ARRAY, PNAME("tile_proxies/source_level"), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR));
+ p_list->push_back(PropertyInfo(Variant::ARRAY, PNAME("tile_proxies/coords_level"), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR));
+ p_list->push_back(PropertyInfo(Variant::ARRAY, PNAME("tile_proxies/alternative_level"), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR));
// Patterns.
for (unsigned int pattern_index = 0; pattern_index < patterns.size(); pattern_index++) {
@@ -4805,8 +4805,8 @@ void TileSetScenesCollectionSource::set_scene_tile_scene(int p_id, Ref<PackedSce
scene_state = scene_state->get_base_scene_state();
}
ERR_FAIL_COND_MSG(type.is_empty(), vformat("Invalid PackedScene for TileSetScenesCollectionSource: %s. Could not get the type of the root node.", p_packed_scene->get_path()));
- bool extends_correct_class = ClassDB::is_parent_class(type, "Control") || ClassDB::is_parent_class(type, "Node2D");
- ERR_FAIL_COND_MSG(!extends_correct_class, vformat("Invalid PackedScene for TileSetScenesCollectionSource: %s. Root node should extend Control or Node2D. Found %s instead.", p_packed_scene->get_path(), type));
+ bool extends_correct_class = ClassDB::is_parent_class(type, "CanvasItem");
+ ERR_FAIL_COND_MSG(!extends_correct_class, vformat("Invalid PackedScene for TileSetScenesCollectionSource: %s. Root node should extend CanvasItem. Found %s instead.", p_packed_scene->get_path(), type));
scenes[p_id].scene = p_packed_scene;
} else {
@@ -4887,9 +4887,9 @@ bool TileSetScenesCollectionSource::_get(const StringName &p_name, Variant &r_re
void TileSetScenesCollectionSource::_get_property_list(List<PropertyInfo> *p_list) const {
for (int i = 0; i < scenes_ids.size(); i++) {
- p_list->push_back(PropertyInfo(Variant::OBJECT, vformat("scenes/%d/scene", scenes_ids[i]), PROPERTY_HINT_RESOURCE_TYPE, "TileSetScenesCollectionSource"));
+ p_list->push_back(PropertyInfo(Variant::OBJECT, vformat("%s/%d/%s", PNAME("scenes"), scenes_ids[i], PNAME("scene")), PROPERTY_HINT_RESOURCE_TYPE, "TileSetScenesCollectionSource"));
- PropertyInfo property_info = PropertyInfo(Variant::BOOL, vformat("scenes/%d/display_placeholder", scenes_ids[i]));
+ PropertyInfo property_info = PropertyInfo(Variant::BOOL, vformat("%s/%d/%s", PNAME("scenes"), scenes_ids[i], PNAME("display_placeholder")));
if (scenes[scenes_ids[i]].display_placeholder == false) {
property_info.usage ^= PROPERTY_USAGE_STORAGE;
}
@@ -5692,10 +5692,10 @@ void TileData::_get_property_list(List<PropertyInfo> *p_list) const {
// Add the groups manually.
if (tile_set) {
// Occlusion layers.
- p_list->push_back(PropertyInfo(Variant::NIL, "Rendering", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP));
+ p_list->push_back(PropertyInfo(Variant::NIL, GNAME("Rendering", ""), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP));
for (int i = 0; i < occluders.size(); i++) {
// occlusion_layer_%d/polygon
- property_info = PropertyInfo(Variant::OBJECT, vformat("occlusion_layer_%d/polygon", i), PROPERTY_HINT_RESOURCE_TYPE, "OccluderPolygon2D", PROPERTY_USAGE_DEFAULT);
+ property_info = PropertyInfo(Variant::OBJECT, vformat("occlusion_layer_%d/%s", i, PNAME("polygon")), PROPERTY_HINT_RESOURCE_TYPE, "OccluderPolygon2D", PROPERTY_USAGE_DEFAULT);
if (!occluders[i].is_valid()) {
property_info.usage ^= PROPERTY_USAGE_STORAGE;
}
@@ -5703,29 +5703,29 @@ void TileData::_get_property_list(List<PropertyInfo> *p_list) const {
}
// Physics layers.
- p_list->push_back(PropertyInfo(Variant::NIL, "Physics", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP));
+ p_list->push_back(PropertyInfo(Variant::NIL, GNAME("Physics", ""), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP));
for (int i = 0; i < physics.size(); i++) {
- p_list->push_back(PropertyInfo(Variant::VECTOR2, vformat("physics_layer_%d/linear_velocity", i), PROPERTY_HINT_NONE));
- p_list->push_back(PropertyInfo(Variant::FLOAT, vformat("physics_layer_%d/angular_velocity", i), PROPERTY_HINT_NONE));
- p_list->push_back(PropertyInfo(Variant::INT, vformat("physics_layer_%d/polygons_count", i), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR));
+ p_list->push_back(PropertyInfo(Variant::VECTOR2, vformat("physics_layer_%d/%s", i, PNAME("linear_velocity")), PROPERTY_HINT_NONE));
+ p_list->push_back(PropertyInfo(Variant::FLOAT, vformat("physics_layer_%d/%s", i, PNAME("angular_velocity")), PROPERTY_HINT_NONE));
+ p_list->push_back(PropertyInfo(Variant::INT, vformat("physics_layer_%d/%s", i, PNAME("polygons_count")), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR));
for (int j = 0; j < physics[i].polygons.size(); j++) {
// physics_layer_%d/points
- property_info = PropertyInfo(Variant::ARRAY, vformat("physics_layer_%d/polygon_%d/points", i, j), PROPERTY_HINT_ARRAY_TYPE, "Vector2", PROPERTY_USAGE_DEFAULT);
+ property_info = PropertyInfo(Variant::ARRAY, vformat("physics_layer_%d/polygon_%d/%s", i, j, PNAME("points")), PROPERTY_HINT_ARRAY_TYPE, "Vector2", PROPERTY_USAGE_DEFAULT);
if (physics[i].polygons[j].polygon.is_empty()) {
property_info.usage ^= PROPERTY_USAGE_STORAGE;
}
p_list->push_back(property_info);
// physics_layer_%d/polygon_%d/one_way
- property_info = PropertyInfo(Variant::BOOL, vformat("physics_layer_%d/polygon_%d/one_way", i, j));
+ property_info = PropertyInfo(Variant::BOOL, vformat("physics_layer_%d/polygon_%d/%s", i, j, PNAME("one_way")));
if (physics[i].polygons[j].one_way == false) {
property_info.usage ^= PROPERTY_USAGE_STORAGE;
}
p_list->push_back(property_info);
// physics_layer_%d/polygon_%d/one_way_margin
- property_info = PropertyInfo(Variant::FLOAT, vformat("physics_layer_%d/polygon_%d/one_way_margin", i, j));
+ property_info = PropertyInfo(Variant::FLOAT, vformat("physics_layer_%d/polygon_%d/%s", i, j, PNAME("one_way_margin")));
if (physics[i].polygons[j].one_way_margin == 1.0) {
property_info.usage ^= PROPERTY_USAGE_STORAGE;
}
@@ -5735,7 +5735,7 @@ void TileData::_get_property_list(List<PropertyInfo> *p_list) const {
// Terrain data
if (terrain_set >= 0) {
- p_list->push_back(PropertyInfo(Variant::NIL, "Terrains", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP));
+ p_list->push_back(PropertyInfo(Variant::NIL, GNAME("Terrains", ""), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP));
for (int i = 0; i < TileSet::CELL_NEIGHBOR_MAX; i++) {
TileSet::CellNeighbor bit = TileSet::CellNeighbor(i);
if (is_valid_terrain_peering_bit(bit)) {
@@ -5749,9 +5749,9 @@ void TileData::_get_property_list(List<PropertyInfo> *p_list) const {
}
// Navigation layers.
- p_list->push_back(PropertyInfo(Variant::NIL, "Navigation", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP));
+ p_list->push_back(PropertyInfo(Variant::NIL, GNAME("Navigation", ""), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP));
for (int i = 0; i < navigation.size(); i++) {
- property_info = PropertyInfo(Variant::OBJECT, vformat("navigation_layer_%d/polygon", i), PROPERTY_HINT_RESOURCE_TYPE, "NavigationPolygon", PROPERTY_USAGE_DEFAULT);
+ property_info = PropertyInfo(Variant::OBJECT, vformat("navigation_layer_%d/%s", i, PNAME("polygon")), PROPERTY_HINT_RESOURCE_TYPE, "NavigationPolygon", PROPERTY_USAGE_DEFAULT);
if (!navigation[i].is_valid()) {
property_info.usage ^= PROPERTY_USAGE_STORAGE;
}
@@ -5759,7 +5759,7 @@ void TileData::_get_property_list(List<PropertyInfo> *p_list) const {
}
// Custom data layers.
- p_list->push_back(PropertyInfo(Variant::NIL, "Custom data", PROPERTY_HINT_NONE, "custom_data_", PROPERTY_USAGE_GROUP));
+ p_list->push_back(PropertyInfo(Variant::NIL, GNAME("Custom Data", "custom_data_"), PROPERTY_HINT_NONE, "custom_data_", PROPERTY_USAGE_GROUP));
for (int i = 0; i < custom_data.size(); i++) {
Variant default_val;
Callable::CallError error;
diff --git a/servers/navigation/navigation_utilities.h b/servers/navigation/navigation_utilities.h
index 7897efd423..04d0ab0d98 100644
--- a/servers/navigation/navigation_utilities.h
+++ b/servers/navigation/navigation_utilities.h
@@ -69,10 +69,10 @@ struct PathQueryParameters {
};
struct PathQueryResult {
- Vector<Vector3> path;
- Vector<int32_t> path_types;
+ PackedVector3Array path;
+ PackedInt32Array path_types;
TypedArray<RID> path_rids;
- Vector<int64_t> path_owner_ids;
+ PackedInt64Array path_owner_ids;
};
} //namespace NavigationUtilities
diff --git a/servers/navigation_server_2d.cpp b/servers/navigation_server_2d.cpp
index 85ba8ed431..273bb9ceda 100644
--- a/servers/navigation_server_2d.cpp
+++ b/servers/navigation_server_2d.cpp
@@ -152,14 +152,15 @@ void NavigationServer2D::_emit_map_changed(RID p_map) {
emit_signal(SNAME("map_changed"), p_map);
}
-#ifdef DEBUG_ENABLED
void NavigationServer2D::set_debug_enabled(bool p_enabled) {
NavigationServer3D::get_singleton()->set_debug_enabled(p_enabled);
}
+
bool NavigationServer2D::get_debug_enabled() const {
return NavigationServer3D::get_singleton()->get_debug_enabled();
}
+#ifdef DEBUG_ENABLED
void NavigationServer2D::set_debug_navigation_edge_connection_color(const Color &p_color) {
NavigationServer3D::get_singleton()->set_debug_navigation_edge_connection_color(p_color);
}
@@ -200,6 +201,22 @@ Color NavigationServer2D::get_debug_navigation_link_connection_disabled_color()
return NavigationServer3D::get_singleton()->get_debug_navigation_link_connection_disabled_color();
}
+void NavigationServer2D::set_debug_navigation_geometry_edge_color(const Color &p_color) {
+ NavigationServer3D::get_singleton()->set_debug_navigation_geometry_edge_color(p_color);
+}
+
+Color NavigationServer2D::get_debug_navigation_geometry_edge_color() const {
+ return NavigationServer3D::get_singleton()->get_debug_navigation_geometry_edge_color();
+}
+
+void NavigationServer2D::set_debug_navigation_geometry_edge_disabled_color(const Color &p_color) {
+ NavigationServer3D::get_singleton()->set_debug_navigation_geometry_edge_disabled_color(p_color);
+}
+
+Color NavigationServer2D::get_debug_navigation_geometry_edge_disabled_color() const {
+ return NavigationServer3D::get_singleton()->get_debug_navigation_geometry_edge_disabled_color();
+}
+
void NavigationServer2D::set_debug_navigation_enable_edge_connections(const bool p_value) {
NavigationServer3D::get_singleton()->set_debug_navigation_enable_edge_connections(p_value);
}
@@ -208,6 +225,22 @@ bool NavigationServer2D::get_debug_navigation_enable_edge_connections() const {
return NavigationServer3D::get_singleton()->get_debug_navigation_enable_edge_connections();
}
+void NavigationServer2D::set_debug_navigation_enable_geometry_face_random_color(const bool p_value) {
+ NavigationServer3D::get_singleton()->set_debug_navigation_enable_geometry_face_random_color(p_value);
+}
+
+bool NavigationServer2D::get_debug_navigation_enable_geometry_face_random_color() const {
+ return NavigationServer3D::get_singleton()->get_debug_navigation_enable_geometry_face_random_color();
+}
+
+void NavigationServer2D::set_debug_navigation_enable_edge_lines(const bool p_value) {
+ NavigationServer3D::get_singleton()->set_debug_navigation_enable_edge_lines(p_value);
+}
+
+bool NavigationServer2D::get_debug_navigation_enable_edge_lines() const {
+ return NavigationServer3D::get_singleton()->get_debug_navigation_enable_edge_lines();
+}
+
void NavigationServer2D::set_debug_navigation_agent_path_color(const Color &p_color) {
NavigationServer3D::get_singleton()->set_debug_navigation_agent_path_color(p_color);
}
@@ -309,6 +342,9 @@ void NavigationServer2D::_bind_methods() {
ClassDB::bind_method(D_METHOD("free_rid", "rid"), &NavigationServer2D::free);
+ ClassDB::bind_method(D_METHOD("set_debug_enabled", "enabled"), &NavigationServer2D::set_debug_enabled);
+ ClassDB::bind_method(D_METHOD("get_debug_enabled"), &NavigationServer2D::get_debug_enabled);
+
ADD_SIGNAL(MethodInfo("map_changed", PropertyInfo(Variant::RID, "map")));
ADD_SIGNAL(MethodInfo("navigation_debug_changed"));
diff --git a/servers/navigation_server_2d.h b/servers/navigation_server_2d.h
index 746389404b..ed2e39e53c 100644
--- a/servers/navigation_server_2d.h
+++ b/servers/navigation_server_2d.h
@@ -225,6 +225,7 @@ public:
/// Callback called at the end of the RVO process
virtual void agent_set_callback(RID p_agent, Callable p_callback);
+ /// Returns a customized navigation path using a query parameters object
virtual void query_path(const Ref<NavigationPathQueryParameters2D> &p_query_parameters, Ref<NavigationPathQueryResult2D> p_query_result) const;
/// Destroy the `RID`
@@ -233,10 +234,10 @@ public:
NavigationServer2D();
virtual ~NavigationServer2D();
-#ifdef DEBUG_ENABLED
void set_debug_enabled(bool p_enabled);
bool get_debug_enabled() const;
+#ifdef DEBUG_ENABLED
void set_debug_navigation_edge_connection_color(const Color &p_color);
Color get_debug_navigation_edge_connection_color() const;
@@ -246,6 +247,12 @@ public:
void set_debug_navigation_geometry_face_disabled_color(const Color &p_color);
Color get_debug_navigation_geometry_face_disabled_color() const;
+ void set_debug_navigation_geometry_edge_color(const Color &p_color);
+ Color get_debug_navigation_geometry_edge_color() const;
+
+ void set_debug_navigation_geometry_edge_disabled_color(const Color &p_color);
+ Color get_debug_navigation_geometry_edge_disabled_color() const;
+
void set_debug_navigation_link_connection_color(const Color &p_color);
Color get_debug_navigation_link_connection_color() const;
@@ -255,6 +262,12 @@ public:
void set_debug_navigation_enable_edge_connections(const bool p_value);
bool get_debug_navigation_enable_edge_connections() const;
+ void set_debug_navigation_enable_geometry_face_random_color(const bool p_value);
+ bool get_debug_navigation_enable_geometry_face_random_color() const;
+
+ void set_debug_navigation_enable_edge_lines(const bool p_value);
+ bool get_debug_navigation_enable_edge_lines() const;
+
void set_debug_navigation_agent_path_color(const Color &p_color);
Color get_debug_navigation_agent_path_color() const;
diff --git a/servers/navigation_server_3d.cpp b/servers/navigation_server_3d.cpp
index 70897ae75c..e5cc426708 100644
--- a/servers/navigation_server_3d.cpp
+++ b/servers/navigation_server_3d.cpp
@@ -29,7 +29,6 @@
/**************************************************************************/
#include "navigation_server_3d.h"
-
#include "core/config/project_settings.h"
NavigationServer3D *NavigationServer3D::singleton = nullptr;
@@ -116,7 +115,9 @@ void NavigationServer3D::_bind_methods() {
ClassDB::bind_method(D_METHOD("free_rid", "rid"), &NavigationServer3D::free);
ClassDB::bind_method(D_METHOD("set_active", "active"), &NavigationServer3D::set_active);
- ClassDB::bind_method(D_METHOD("process", "delta_time"), &NavigationServer3D::process);
+
+ ClassDB::bind_method(D_METHOD("set_debug_enabled", "enabled"), &NavigationServer3D::set_debug_enabled);
+ ClassDB::bind_method(D_METHOD("get_debug_enabled"), &NavigationServer3D::get_debug_enabled);
ADD_SIGNAL(MethodInfo("map_changed", PropertyInfo(Variant::RID, "map")));
@@ -186,15 +187,22 @@ NavigationServer3D::~NavigationServer3D() {
singleton = nullptr;
}
-NavigationServer3DCallback NavigationServer3DManager::create_callback = nullptr;
+void NavigationServer3D::set_debug_enabled(bool p_enabled) {
+#ifdef DEBUG_ENABLED
+ if (debug_enabled != p_enabled) {
+ debug_dirty = true;
+ }
-void NavigationServer3DManager::set_default_server(NavigationServer3DCallback p_callback) {
- create_callback = p_callback;
+ debug_enabled = p_enabled;
+
+ if (debug_dirty) {
+ call_deferred("_emit_navigation_debug_changed_signal");
+ }
+#endif // DEBUG_ENABLED
}
-NavigationServer3D *NavigationServer3DManager::new_default_server() {
- ERR_FAIL_COND_V(create_callback == nullptr, nullptr);
- return create_callback();
+bool NavigationServer3D::get_debug_enabled() const {
+ return debug_enabled;
}
#ifdef DEBUG_ENABLED
@@ -546,22 +554,6 @@ bool NavigationServer3D::get_debug_navigation_enable_link_connections_xray() con
return debug_navigation_enable_link_connections_xray;
}
-void NavigationServer3D::set_debug_enabled(bool p_enabled) {
- if (debug_enabled != p_enabled) {
- debug_dirty = true;
- }
-
- debug_enabled = p_enabled;
-
- if (debug_dirty) {
- call_deferred("_emit_navigation_debug_changed_signal");
- }
-}
-
-bool NavigationServer3D::get_debug_enabled() const {
- return debug_enabled;
-}
-
void NavigationServer3D::set_debug_navigation_enable_agent_paths(const bool p_value) {
if (debug_navigation_enable_agent_paths != p_value) {
debug_dirty = true;
@@ -594,8 +586,6 @@ bool NavigationServer3D::get_debug_navigation_enable_agent_paths_xray() const {
#endif // DEBUG_ENABLED
-///////////////////////////////////////////////////////
-
void NavigationServer3D::query_path(const Ref<NavigationPathQueryParameters3D> &p_query_parameters, Ref<NavigationPathQueryResult3D> p_query_result) const {
ERR_FAIL_COND(!p_query_parameters.is_valid());
ERR_FAIL_COND(!p_query_result.is_valid());
@@ -607,3 +597,19 @@ void NavigationServer3D::query_path(const Ref<NavigationPathQueryParameters3D> &
p_query_result->set_path_rids(_query_result.path_rids);
p_query_result->set_path_owner_ids(_query_result.path_owner_ids);
}
+
+///////////////////////////////////////////////////////
+
+NavigationServer3DCallback NavigationServer3DManager::create_callback = nullptr;
+
+void NavigationServer3DManager::set_default_server(NavigationServer3DCallback p_callback) {
+ create_callback = p_callback;
+}
+
+NavigationServer3D *NavigationServer3DManager::new_default_server() {
+ if (create_callback == nullptr) {
+ return nullptr;
+ }
+
+ return create_callback();
+}
diff --git a/servers/navigation_server_3d.h b/servers/navigation_server_3d.h
index bc4bdf2a30..05df5ca0fe 100644
--- a/servers/navigation_server_3d.h
+++ b/servers/navigation_server_3d.h
@@ -253,12 +253,12 @@ public:
virtual void process(real_t delta_time) = 0;
/// Returns a customized navigation path using a query parameters object
- void query_path(const Ref<NavigationPathQueryParameters3D> &p_query_parameters, Ref<NavigationPathQueryResult3D> p_query_result) const;
+ virtual void query_path(const Ref<NavigationPathQueryParameters3D> &p_query_parameters, Ref<NavigationPathQueryResult3D> p_query_result) const;
virtual NavigationUtilities::PathQueryResult _query_path(const NavigationUtilities::PathQueryParameters &p_parameters) const = 0;
NavigationServer3D();
- virtual ~NavigationServer3D();
+ ~NavigationServer3D() override;
enum ProcessInfo {
INFO_ACTIVE_MAPS,
@@ -274,9 +274,13 @@ public:
virtual int get_process_info(ProcessInfo p_info) const = 0;
-#ifdef DEBUG_ENABLED
+ void set_debug_enabled(bool p_enabled);
+ bool get_debug_enabled() const;
+
private:
bool debug_enabled = false;
+
+#ifdef DEBUG_ENABLED
bool debug_dirty = true;
void _emit_navigation_debug_changed_signal();
@@ -313,9 +317,6 @@ private:
Ref<StandardMaterial3D> debug_navigation_agent_path_point_material;
public:
- void set_debug_enabled(bool p_enabled);
- bool get_debug_enabled() const;
-
void set_debug_navigation_edge_connection_color(const Color &p_color);
Color get_debug_navigation_edge_connection_color() const;
diff --git a/servers/navigation_server_3d_dummy.h b/servers/navigation_server_3d_dummy.h
new file mode 100644
index 0000000000..fd9226e59e
--- /dev/null
+++ b/servers/navigation_server_3d_dummy.h
@@ -0,0 +1,119 @@
+/**************************************************************************/
+/* navigation_server_3d_dummy.h */
+/**************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/**************************************************************************/
+/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
+/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/**************************************************************************/
+
+#ifndef NAVIGATION_SERVER_3D_DUMMY_H
+#define NAVIGATION_SERVER_3D_DUMMY_H
+
+#include "servers/navigation_server_3d.h"
+
+class NavigationServer3DDummy : public NavigationServer3D {
+ GDCLASS(NavigationServer3DDummy, NavigationServer3D);
+
+public:
+ TypedArray<RID> get_maps() const override { return TypedArray<RID>(); }
+ RID map_create() override { return RID(); }
+ void map_set_active(RID p_map, bool p_active) override {}
+ bool map_is_active(RID p_map) const override { return false; }
+ void map_set_up(RID p_map, Vector3 p_up) override {}
+ Vector3 map_get_up(RID p_map) const override { return Vector3(); }
+ void map_set_cell_size(RID p_map, real_t p_cell_size) override {}
+ real_t map_get_cell_size(RID p_map) const override { return 0; }
+ void map_set_edge_connection_margin(RID p_map, real_t p_connection_margin) override {}
+ real_t map_get_edge_connection_margin(RID p_map) const override { return 0; }
+ void map_set_link_connection_radius(RID p_map, real_t p_connection_radius) override {}
+ real_t map_get_link_connection_radius(RID p_map) const override { return 0; }
+ Vector<Vector3> map_get_path(RID p_map, Vector3 p_origin, Vector3 p_destination, bool p_optimize, uint32_t p_navigation_layers) const override { return Vector<Vector3>(); }
+ Vector3 map_get_closest_point_to_segment(RID p_map, const Vector3 &p_from, const Vector3 &p_to, const bool p_use_collision) const override { return Vector3(); }
+ Vector3 map_get_closest_point(RID p_map, const Vector3 &p_point) const override { return Vector3(); }
+ Vector3 map_get_closest_point_normal(RID p_map, const Vector3 &p_point) const override { return Vector3(); }
+ RID map_get_closest_point_owner(RID p_map, const Vector3 &p_point) const override { return RID(); }
+ TypedArray<RID> map_get_links(RID p_map) const override { return TypedArray<RID>(); }
+ TypedArray<RID> map_get_regions(RID p_map) const override { return TypedArray<RID>(); }
+ TypedArray<RID> map_get_agents(RID p_map) const override { return TypedArray<RID>(); }
+ void map_force_update(RID p_map) override {}
+ RID region_create() override { return RID(); }
+ void region_set_enter_cost(RID p_region, real_t p_enter_cost) override {}
+ real_t region_get_enter_cost(RID p_region) const override { return 0; }
+ void region_set_travel_cost(RID p_region, real_t p_travel_cost) override {}
+ real_t region_get_travel_cost(RID p_region) const override { return 0; }
+ void region_set_owner_id(RID p_region, ObjectID p_owner_id) override {}
+ ObjectID region_get_owner_id(RID p_region) const override { return ObjectID(); }
+ bool region_owns_point(RID p_region, const Vector3 &p_point) const override { return false; }
+ void region_set_map(RID p_region, RID p_map) override {}
+ RID region_get_map(RID p_region) const override { return RID(); }
+ void region_set_navigation_layers(RID p_region, uint32_t p_navigation_layers) override {}
+ uint32_t region_get_navigation_layers(RID p_region) const override { return 0; }
+ void region_set_transform(RID p_region, Transform3D p_transform) override {}
+ void region_set_navigation_mesh(RID p_region, Ref<NavigationMesh> p_navigation_mesh) override {}
+ void region_bake_navigation_mesh(Ref<NavigationMesh> p_navigation_mesh, Node *p_root_node) override {}
+ int region_get_connections_count(RID p_region) const override { return 0; }
+ Vector3 region_get_connection_pathway_start(RID p_region, int p_connection_id) const override { return Vector3(); }
+ Vector3 region_get_connection_pathway_end(RID p_region, int p_connection_id) const override { return Vector3(); }
+ RID link_create() override { return RID(); }
+ void link_set_map(RID p_link, RID p_map) override {}
+ RID link_get_map(RID p_link) const override { return RID(); }
+ void link_set_bidirectional(RID p_link, bool p_bidirectional) override {}
+ bool link_is_bidirectional(RID p_link) const override { return false; }
+ void link_set_navigation_layers(RID p_link, uint32_t p_navigation_layers) override {}
+ uint32_t link_get_navigation_layers(RID p_link) const override { return 0; }
+ void link_set_start_position(RID p_link, Vector3 p_position) override {}
+ Vector3 link_get_start_position(RID p_link) const override { return Vector3(); }
+ void link_set_end_position(RID p_link, Vector3 p_position) override {}
+ Vector3 link_get_end_position(RID p_link) const override { return Vector3(); }
+ void link_set_enter_cost(RID p_link, real_t p_enter_cost) override {}
+ real_t link_get_enter_cost(RID p_link) const override { return 0; }
+ void link_set_travel_cost(RID p_link, real_t p_travel_cost) override {}
+ real_t link_get_travel_cost(RID p_link) const override { return 0; }
+ void link_set_owner_id(RID p_link, ObjectID p_owner_id) override {}
+ ObjectID link_get_owner_id(RID p_link) const override { return ObjectID(); }
+ RID agent_create() override { return RID(); }
+ void agent_set_map(RID p_agent, RID p_map) override {}
+ RID agent_get_map(RID p_agent) const override { return RID(); }
+ void agent_set_neighbor_distance(RID p_agent, real_t p_distance) override {}
+ void agent_set_max_neighbors(RID p_agent, int p_count) override {}
+ void agent_set_time_horizon(RID p_agent, real_t p_time) override {}
+ void agent_set_radius(RID p_agent, real_t p_radius) override {}
+ void agent_set_max_speed(RID p_agent, real_t p_max_speed) override {}
+ void agent_set_velocity(RID p_agent, Vector3 p_velocity) override {}
+ void agent_set_target_velocity(RID p_agent, Vector3 p_velocity) override {}
+ void agent_set_position(RID p_agent, Vector3 p_position) override {}
+ void agent_set_ignore_y(RID p_agent, bool p_ignore) override {}
+ bool agent_is_map_changed(RID p_agent) const override { return false; }
+ void agent_set_callback(RID p_agent, Callable p_callback) override {}
+ void free(RID p_object) override {}
+ void set_active(bool p_active) override {}
+ void process(real_t delta_time) override {}
+ NavigationUtilities::PathQueryResult _query_path(const NavigationUtilities::PathQueryParameters &p_parameters) const override { return NavigationUtilities::PathQueryResult(); }
+ int get_process_info(ProcessInfo p_info) const override { return 0; }
+ void set_debug_enabled(bool p_enabled) {}
+ bool get_debug_enabled() const { return false; }
+};
+
+#endif // NAVIGATION_SERVER_3D_DUMMY_H
diff --git a/servers/physics_2d/godot_step_2d.cpp b/servers/physics_2d/godot_step_2d.cpp
index 3b5fbbced8..bbaec8be2b 100644
--- a/servers/physics_2d/godot_step_2d.cpp
+++ b/servers/physics_2d/godot_step_2d.cpp
@@ -30,6 +30,7 @@
#include "godot_step_2d.h"
+#include "core/object/worker_thread_pool.h"
#include "core/os/os.h"
#define BODY_ISLAND_COUNT_RESERVE 128
diff --git a/servers/physics_2d/godot_step_2d.h b/servers/physics_2d/godot_step_2d.h
index 75eeba4a3d..c08c6379de 100644
--- a/servers/physics_2d/godot_step_2d.h
+++ b/servers/physics_2d/godot_step_2d.h
@@ -33,7 +33,6 @@
#include "godot_space_2d.h"
-#include "core/object/worker_thread_pool.h"
#include "core/templates/local_vector.h"
class GodotStep2D {
diff --git a/servers/physics_3d/godot_step_3d.cpp b/servers/physics_3d/godot_step_3d.cpp
index 4119c58897..d09a3b4e6d 100644
--- a/servers/physics_3d/godot_step_3d.cpp
+++ b/servers/physics_3d/godot_step_3d.cpp
@@ -32,6 +32,7 @@
#include "godot_joint_3d.h"
+#include "core/object/worker_thread_pool.h"
#include "core/os/os.h"
#define BODY_ISLAND_COUNT_RESERVE 128
diff --git a/servers/physics_3d/godot_step_3d.h b/servers/physics_3d/godot_step_3d.h
index be7266b264..1c9b0af422 100644
--- a/servers/physics_3d/godot_step_3d.h
+++ b/servers/physics_3d/godot_step_3d.h
@@ -33,7 +33,6 @@
#include "godot_space_3d.h"
-#include "core/object/worker_thread_pool.h"
#include "core/templates/local_vector.h"
class GodotStep3D {
diff --git a/servers/physics_server_3d.cpp b/servers/physics_server_3d.cpp
index 6a163c86d2..c9cf8f99af 100644
--- a/servers/physics_server_3d.cpp
+++ b/servers/physics_server_3d.cpp
@@ -429,7 +429,7 @@ Vector<real_t> PhysicsDirectSpaceState3D::_cast_motion(const Ref<PhysicsShapeQue
return ret;
}
-TypedArray<PackedVector2Array> PhysicsDirectSpaceState3D::_collide_shape(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query, int p_max_results) {
+TypedArray<PackedVector3Array> PhysicsDirectSpaceState3D::_collide_shape(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query, int p_max_results) {
ERR_FAIL_COND_V(!p_shape_query.is_valid(), Array());
Vector<Vector3> ret;
@@ -437,9 +437,9 @@ TypedArray<PackedVector2Array> PhysicsDirectSpaceState3D::_collide_shape(const R
int rc = 0;
bool res = collide_shape(p_shape_query->get_parameters(), ret.ptrw(), p_max_results, rc);
if (!res) {
- return TypedArray<PackedVector2Array>();
+ return TypedArray<PackedVector3Array>();
}
- TypedArray<PackedVector2Array> r;
+ TypedArray<PackedVector3Array> r;
r.resize(rc * 2);
for (int i = 0; i < rc * 2; i++) {
r[i] = ret[i];
diff --git a/servers/physics_server_3d.h b/servers/physics_server_3d.h
index abf22e68a4..2c7ebeea66 100644
--- a/servers/physics_server_3d.h
+++ b/servers/physics_server_3d.h
@@ -125,7 +125,7 @@ private:
TypedArray<Dictionary> _intersect_point(const Ref<PhysicsPointQueryParameters3D> &p_point_query, int p_max_results = 32);
TypedArray<Dictionary> _intersect_shape(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query, int p_max_results = 32);
Vector<real_t> _cast_motion(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query);
- TypedArray<PackedVector2Array> _collide_shape(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query, int p_max_results = 32);
+ TypedArray<PackedVector3Array> _collide_shape(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query, int p_max_results = 32);
Dictionary _get_rest_info(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query);
protected:
diff --git a/servers/rendering/renderer_rd/effects/ss_effects.cpp b/servers/rendering/renderer_rd/effects/ss_effects.cpp
index 2b5d36d686..e031e33041 100644
--- a/servers/rendering/renderer_rd/effects/ss_effects.cpp
+++ b/servers/rendering/renderer_rd/effects/ss_effects.cpp
@@ -411,12 +411,21 @@ SSEffects::~SSEffects() {
/* SS Downsampler */
-void SSEffects::downsample_depth(RID p_depth_buffer, const Vector<RID> &p_depth_mipmaps, bool p_invalidate_uniform_set, Size2i p_full_screen_size, const Projection &p_projection) {
+void SSEffects::downsample_depth(Ref<RenderSceneBuffersRD> p_render_buffers, uint32_t p_view, const Projection &p_projection) {
UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton();
ERR_FAIL_NULL(uniform_set_cache);
MaterialStorage *material_storage = MaterialStorage::get_singleton();
ERR_FAIL_NULL(material_storage);
+ uint32_t view_count = p_render_buffers->get_view_count();
+ Size2i full_screen_size = p_render_buffers->get_internal_size();
+ Size2i size((full_screen_size.x + 1) / 2, (full_screen_size.y + 1) / 2);
+
+ // Make sure our buffers exist, buffers are automatically cleared if view count or size changes.
+ if (!p_render_buffers->has_texture(RB_SCOPE_SSDS, RB_LINEAR_DEPTH)) {
+ p_render_buffers->create_texture(RB_SCOPE_SSDS, RB_LINEAR_DEPTH, RD::DATA_FORMAT_R16_SFLOAT, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT, RD::TEXTURE_SAMPLES_1, size, view_count * 4, 5);
+ }
+
// Downsample and deinterleave the depth buffer for SSAO and SSIL
RD::ComputeListID compute_list = RD::get_singleton()->compute_list_begin();
@@ -447,45 +456,32 @@ void SSEffects::downsample_depth(RID p_depth_buffer, const Vector<RID> &p_depth_
}
}
+ RID shader = ss_effects.downsample_shader.version_get_shader(ss_effects.downsample_shader_version, downsample_mode);
int depth_index = use_half_size ? 1 : 0;
RD::get_singleton()->draw_command_begin_label("Downsample Depth");
- if (p_invalidate_uniform_set || use_full_mips != ss_effects.used_full_mips_last_frame || use_half_size != ss_effects.used_half_size_last_frame || use_mips != ss_effects.used_mips_last_frame) {
- if (ss_effects.downsample_uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(ss_effects.downsample_uniform_set)) {
- RD::get_singleton()->free(ss_effects.downsample_uniform_set);
- ss_effects.downsample_uniform_set = RID();
- }
- Vector<RD::Uniform> uniforms;
- {
- RD::Uniform u;
- u.uniform_type = RD::UNIFORM_TYPE_IMAGE;
- u.binding = 0;
- u.append_id(p_depth_mipmaps[depth_index + 1]);
- uniforms.push_back(u);
- }
- {
- RD::Uniform u;
- u.uniform_type = RD::UNIFORM_TYPE_IMAGE;
- u.binding = 1;
- u.append_id(p_depth_mipmaps[depth_index + 2]);
- uniforms.push_back(u);
- }
- {
- RD::Uniform u;
- u.uniform_type = RD::UNIFORM_TYPE_IMAGE;
- u.binding = 2;
- u.append_id(p_depth_mipmaps[depth_index + 3]);
- uniforms.push_back(u);
- }
- if (use_full_mips) {
- RD::Uniform u;
- u.uniform_type = RD::UNIFORM_TYPE_IMAGE;
- u.binding = 3;
- u.append_id(p_depth_mipmaps[4]);
- uniforms.push_back(u);
+ RID downsample_uniform_set;
+ if (use_mips) {
+ // Grab our downsample uniform set from cache, these are automatically cleaned up if the depth textures are cleared.
+ // This also ensures we can switch between left eye and right eye uniform sets without recreating the uniform twice a frame.
+ Vector<RD::Uniform> u_depths;
+
+ // Note, use_full_mips is true if either SSAO or SSIL uses half size, but the other full size and we're using mips.
+ // That means we're filling all 5 levels.
+ // In this scenario `depth_index` will be 0.
+ for (int i = 0; i < (use_full_mips ? 4 : 3); i++) {
+ RID depth_mipmap = p_render_buffers->get_texture_slice(RB_SCOPE_SSDS, RB_LINEAR_DEPTH, p_view * 4, depth_index + i + 1, 4, 1);
+
+ RD::Uniform u_depth;
+ u_depth.uniform_type = RD::UNIFORM_TYPE_IMAGE;
+ u_depth.binding = i;
+ u_depth.append_id(depth_mipmap);
+ u_depths.push_back(u_depth);
}
- ss_effects.downsample_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, ss_effects.downsample_shader.version_get_shader(ss_effects.downsample_shader_version, use_full_mips ? 6 : 2), 2);
+
+ // This before only used SS_EFFECTS_DOWNSAMPLE_MIPMAP or SS_EFFECTS_DOWNSAMPLE_FULL_MIPS
+ downsample_uniform_set = uniform_set_cache->get_cache_vec(shader, 2, u_depths);
}
float depth_linearize_mul = -p_projection.columns[3][2];
@@ -501,25 +497,30 @@ void SSEffects::downsample_depth(RID p_depth_buffer, const Vector<RID> &p_depth_
ss_effects.downsample_push_constant.z_near = p_projection.get_z_near();
ss_effects.downsample_push_constant.z_far = p_projection.get_z_far();
}
- ss_effects.downsample_push_constant.pixel_size[0] = 1.0 / p_full_screen_size.x;
- ss_effects.downsample_push_constant.pixel_size[1] = 1.0 / p_full_screen_size.y;
+ ss_effects.downsample_push_constant.pixel_size[0] = 1.0 / full_screen_size.x;
+ ss_effects.downsample_push_constant.pixel_size[1] = 1.0 / full_screen_size.y;
ss_effects.downsample_push_constant.radius_sq = 1.0;
- RID shader = ss_effects.downsample_shader.version_get_shader(ss_effects.downsample_shader_version, downsample_mode);
RID default_sampler = material_storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
- RD::Uniform u_depth_buffer(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_depth_buffer }));
- RD::Uniform u_depth_mipmaps(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_depth_mipmaps[depth_index + 0] }));
+ RID depth_texture = p_render_buffers->get_depth_texture(p_view);
+ RID depth_mipmap = p_render_buffers->get_texture_slice(RB_SCOPE_SSDS, RB_LINEAR_DEPTH, p_view * 4, depth_index, 4, 1);
+
+ RD::Uniform u_depth_buffer(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, depth_texture }));
+ RD::Uniform u_depth_mipmap(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ depth_mipmap }));
RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ss_effects.pipelines[downsample_mode]);
RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_depth_buffer), 0);
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_depth_mipmaps), 1);
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_depth_mipmap), 1);
if (use_mips) {
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, ss_effects.downsample_uniform_set, 2);
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, downsample_uniform_set, 2);
}
RD::get_singleton()->compute_list_set_push_constant(compute_list, &ss_effects.downsample_push_constant, sizeof(SSEffectsDownsamplePushConstant));
- Size2i size(MAX(1, p_full_screen_size.x >> (use_half_size ? 2 : 1)), MAX(1, p_full_screen_size.y >> (use_half_size ? 2 : 1)));
+ if (use_half_size) {
+ size.x = MAX(1, size.x >> 1);
+ size.y = MAX(1, size.y >> 1);
+ }
RD::get_singleton()->compute_list_dispatch_threads(compute_list, size.x, size.y, 1);
RD::get_singleton()->compute_list_add_barrier(compute_list);
@@ -543,7 +544,7 @@ void SSEffects::ssil_set_quality(RS::EnvironmentSSILQuality p_quality, bool p_ha
ssil_fadeout_to = p_fadeout_to;
}
-void SSEffects::gather_ssil(RD::ComputeListID p_compute_list, const Vector<RID> p_ssil_slices, const Vector<RID> p_edges_slices, const SSILSettings &p_settings, bool p_adaptive_base_pass, RID p_gather_uniform_set, RID p_importance_map_uniform_set, RID p_projection_uniform_set) {
+void SSEffects::gather_ssil(RD::ComputeListID p_compute_list, const RID *p_ssil_slices, const RID *p_edges_slices, const SSILSettings &p_settings, bool p_adaptive_base_pass, RID p_gather_uniform_set, RID p_importance_map_uniform_set, RID p_projection_uniform_set) {
UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton();
ERR_FAIL_NULL(uniform_set_cache);
@@ -578,12 +579,13 @@ void SSEffects::gather_ssil(RD::ComputeListID p_compute_list, const Vector<RID>
RD::get_singleton()->compute_list_add_barrier(p_compute_list);
}
-void SSEffects::ssil_allocate_buffers(SSILRenderBuffers &p_ssil_buffers, const SSILSettings &p_settings, RID p_linear_depth) {
+void SSEffects::ssil_allocate_buffers(Ref<RenderSceneBuffersRD> p_render_buffers, SSILRenderBuffers &p_ssil_buffers, const SSILSettings &p_settings) {
if (p_ssil_buffers.half_size != ssil_half_size) {
- ssil_free(p_ssil_buffers);
+ p_render_buffers->clear_context(RB_SCOPE_SSIL);
}
- if (ssil_half_size) {
+ p_ssil_buffers.half_size = ssil_half_size;
+ if (p_ssil_buffers.half_size) {
p_ssil_buffers.buffer_width = (p_settings.full_screen_size.x + 3) / 4;
p_ssil_buffers.buffer_height = (p_settings.full_screen_size.y + 3) / 4;
p_ssil_buffers.half_buffer_width = (p_settings.full_screen_size.x + 7) / 8;
@@ -595,104 +597,59 @@ void SSEffects::ssil_allocate_buffers(SSILRenderBuffers &p_ssil_buffers, const S
p_ssil_buffers.half_buffer_height = (p_settings.full_screen_size.y + 3) / 4;
}
- if (p_ssil_buffers.ssil_final.is_null()) {
- {
- p_ssil_buffers.depth_texture_view = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), p_linear_depth, 0, ssil_half_size ? 1 : 0, 4, RD::TEXTURE_SLICE_2D_ARRAY);
- }
- {
- RD::TextureFormat tf;
- tf.format = RD::DATA_FORMAT_R16G16B16A16_SFLOAT;
- tf.width = p_settings.full_screen_size.x;
- tf.height = p_settings.full_screen_size.y;
- tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_CAN_COPY_TO_BIT;
- p_ssil_buffers.ssil_final = RD::get_singleton()->texture_create(tf, RD::TextureView());
- RD::get_singleton()->set_resource_name(p_ssil_buffers.ssil_final, "SSIL texture");
- RD::get_singleton()->texture_clear(p_ssil_buffers.ssil_final, Color(0, 0, 0, 0), 0, 1, 0, 1);
- if (p_ssil_buffers.last_frame.is_null()) {
- tf.mipmaps = 6;
- p_ssil_buffers.last_frame = RD::get_singleton()->texture_create(tf, RD::TextureView());
- RD::get_singleton()->set_resource_name(p_ssil_buffers.last_frame, "Last Frame Radiance");
- RD::get_singleton()->texture_clear(p_ssil_buffers.last_frame, Color(0, 0, 0, 0), 0, tf.mipmaps, 0, 1);
- for (uint32_t i = 0; i < 6; i++) {
- RID slice = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), p_ssil_buffers.last_frame, 0, i);
- p_ssil_buffers.last_frame_slices.push_back(slice);
- RD::get_singleton()->set_resource_name(slice, "Last Frame Radiance Mip " + itos(i) + " ");
- }
- }
- }
- {
- RD::TextureFormat tf;
- tf.format = RD::DATA_FORMAT_R16G16B16A16_SFLOAT;
- tf.texture_type = RD::TEXTURE_TYPE_2D_ARRAY;
- tf.width = p_ssil_buffers.buffer_width;
- tf.height = p_ssil_buffers.buffer_height;
- tf.array_layers = 4;
- tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT;
- p_ssil_buffers.deinterleaved = RD::get_singleton()->texture_create(tf, RD::TextureView());
- RD::get_singleton()->set_resource_name(p_ssil_buffers.deinterleaved, "SSIL deinterleaved buffer");
- for (uint32_t i = 0; i < 4; i++) {
- RID slice = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), p_ssil_buffers.deinterleaved, i, 0);
- p_ssil_buffers.deinterleaved_slices.push_back(slice);
- RD::get_singleton()->set_resource_name(slice, "SSIL deinterleaved buffer array " + itos(i) + " ");
- }
- }
+ uint32_t view_count = p_render_buffers->get_view_count();
+ Size2i full_size = Size2i(p_ssil_buffers.buffer_width, p_ssil_buffers.buffer_height);
+ Size2i half_size = Size2i(p_ssil_buffers.half_buffer_width, p_ssil_buffers.half_buffer_height);
- {
- RD::TextureFormat tf;
- tf.format = RD::DATA_FORMAT_R16G16B16A16_SFLOAT;
- tf.texture_type = RD::TEXTURE_TYPE_2D_ARRAY;
- tf.width = p_ssil_buffers.buffer_width;
- tf.height = p_ssil_buffers.buffer_height;
- tf.array_layers = 4;
- tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT;
- p_ssil_buffers.pong = RD::get_singleton()->texture_create(tf, RD::TextureView());
- RD::get_singleton()->set_resource_name(p_ssil_buffers.pong, "SSIL deinterleaved pong buffer");
- for (uint32_t i = 0; i < 4; i++) {
- RID slice = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), p_ssil_buffers.pong, i, 0);
- p_ssil_buffers.pong_slices.push_back(slice);
- RD::get_singleton()->set_resource_name(slice, "SSIL deinterleaved buffer pong array " + itos(i) + " ");
- }
- }
+ // We create our intermediate and final results as render buffers.
+ // These are automatically cached and cleaned up when our viewport resizes
+ // or when our viewport gets destroyed.
- {
- RD::TextureFormat tf;
- tf.format = RD::DATA_FORMAT_R8_UNORM;
- tf.texture_type = RD::TEXTURE_TYPE_2D_ARRAY;
- tf.width = p_ssil_buffers.buffer_width;
- tf.height = p_ssil_buffers.buffer_height;
- tf.array_layers = 4;
- tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT;
- p_ssil_buffers.edges = RD::get_singleton()->texture_create(tf, RD::TextureView());
- RD::get_singleton()->set_resource_name(p_ssil_buffers.edges, "SSIL edges buffer");
- for (uint32_t i = 0; i < 4; i++) {
- RID slice = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), p_ssil_buffers.edges, i, 0);
- p_ssil_buffers.edges_slices.push_back(slice);
- RD::get_singleton()->set_resource_name(slice, "SSIL edges buffer slice " + itos(i) + " ");
- }
- }
+ if (!p_render_buffers->has_texture(RB_SCOPE_SSIL, RB_FINAL)) { // We don't strictly have to check if it exists but we only want to clear it when we create it...
+ RID final = p_render_buffers->create_texture(RB_SCOPE_SSIL, RB_FINAL, RD::DATA_FORMAT_R16G16B16A16_SFLOAT, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_CAN_COPY_TO_BIT);
+ RD::get_singleton()->texture_clear(final, Color(0, 0, 0, 0), 0, 1, 0, view_count);
+ }
- {
- RD::TextureFormat tf;
- tf.format = RD::DATA_FORMAT_R8_UNORM;
- tf.width = p_ssil_buffers.half_buffer_width;
- tf.height = p_ssil_buffers.half_buffer_height;
- tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT;
- p_ssil_buffers.importance_map[0] = RD::get_singleton()->texture_create(tf, RD::TextureView());
- RD::get_singleton()->set_resource_name(p_ssil_buffers.importance_map[0], "SSIL Importance Map");
- p_ssil_buffers.importance_map[1] = RD::get_singleton()->texture_create(tf, RD::TextureView());
- RD::get_singleton()->set_resource_name(p_ssil_buffers.importance_map[1], "SSIL Importance Map Pong");
- }
- p_ssil_buffers.half_size = ssil_half_size;
+ if (!p_render_buffers->has_texture(RB_SCOPE_SSIL, RB_LAST_FRAME)) {
+ RID last_frame = p_render_buffers->create_texture(RB_SCOPE_SSIL, RB_LAST_FRAME, RD::DATA_FORMAT_R16G16B16A16_SFLOAT, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_CAN_COPY_TO_BIT, RD::TEXTURE_SAMPLES_1, p_settings.full_screen_size, 0, 6);
+ RD::get_singleton()->texture_clear(last_frame, Color(0, 0, 0, 0), 0, 6, 0, view_count);
}
+
+ // As we're not clearing these, and render buffers will return the cached texture if it already exists,
+ // we don't first check has_texture here
+
+ p_render_buffers->create_texture(RB_SCOPE_SSIL, RB_DEINTERLEAVED, RD::DATA_FORMAT_R16G16B16A16_SFLOAT, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT, RD::TEXTURE_SAMPLES_1, full_size, 4 * view_count);
+ p_render_buffers->create_texture(RB_SCOPE_SSIL, RB_DEINTERLEAVED_PONG, RD::DATA_FORMAT_R16G16B16A16_SFLOAT, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT, RD::TEXTURE_SAMPLES_1, full_size, 4 * view_count);
+ p_render_buffers->create_texture(RB_SCOPE_SSIL, RB_EDGES, RD::DATA_FORMAT_R8_UNORM, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT, RD::TEXTURE_SAMPLES_1, full_size, 4 * view_count);
+ p_render_buffers->create_texture(RB_SCOPE_SSIL, RB_IMPORTANCE_MAP, RD::DATA_FORMAT_R8_UNORM, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT, RD::TEXTURE_SAMPLES_1, half_size);
+ p_render_buffers->create_texture(RB_SCOPE_SSIL, RB_IMPORTANCE_PONG, RD::DATA_FORMAT_R8_UNORM, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT, RD::TEXTURE_SAMPLES_1, half_size);
}
-void SSEffects::screen_space_indirect_lighting(SSILRenderBuffers &p_ssil_buffers, RID p_normal_buffer, const Projection &p_projection, const Projection &p_last_projection, const SSILSettings &p_settings) {
+void SSEffects::screen_space_indirect_lighting(Ref<RenderSceneBuffersRD> p_render_buffers, SSILRenderBuffers &p_ssil_buffers, uint32_t p_view, RID p_normal_buffer, const Projection &p_projection, const Projection &p_last_projection, const SSILSettings &p_settings) {
UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton();
ERR_FAIL_NULL(uniform_set_cache);
MaterialStorage *material_storage = MaterialStorage::get_singleton();
ERR_FAIL_NULL(material_storage);
RD::get_singleton()->draw_command_begin_label("Process Screen Space Indirect Lighting");
+
+ // Obtain our (cached) buffer slices for the view we are rendering.
+ RID last_frame = p_render_buffers->get_texture_slice(RB_SCOPE_SSIL, RB_LAST_FRAME, p_view, 0, 1, 6);
+ RID deinterleaved = p_render_buffers->get_texture_slice(RB_SCOPE_SSIL, RB_DEINTERLEAVED, p_view * 4, 0, 4, 1);
+ RID deinterleaved_pong = p_render_buffers->get_texture_slice(RB_SCOPE_SSIL, RB_DEINTERLEAVED_PONG, 4 * p_view, 0, 4, 1);
+ RID edges = p_render_buffers->get_texture_slice(RB_SCOPE_SSIL, RB_EDGES, 4 * p_view, 0, 4, 1);
+ RID importance_map = p_render_buffers->get_texture_slice(RB_SCOPE_SSIL, RB_IMPORTANCE_MAP, p_view, 0);
+ RID importance_pong = p_render_buffers->get_texture_slice(RB_SCOPE_SSIL, RB_IMPORTANCE_PONG, p_view, 0);
+
+ RID deinterleaved_slices[4];
+ RID deinterleaved_pong_slices[4];
+ RID edges_slices[4];
+ for (uint32_t i = 0; i < 4; i++) {
+ deinterleaved_slices[i] = p_render_buffers->get_texture_slice(RB_SCOPE_SSIL, RB_DEINTERLEAVED, p_view * 4 + i, 0);
+ deinterleaved_pong_slices[i] = p_render_buffers->get_texture_slice(RB_SCOPE_SSIL, RB_DEINTERLEAVED_PONG, p_view * 4 + i, 0);
+ edges_slices[i] = p_render_buffers->get_texture_slice(RB_SCOPE_SSIL, RB_EDGES, p_view * 4 + i, 0);
+ }
+
//Store projection info before starting the compute list
SSILProjectionUniforms projection_uniforms;
store_camera(p_last_projection, projection_uniforms.inv_last_frame_projection_matrix);
@@ -701,7 +658,7 @@ void SSEffects::screen_space_indirect_lighting(SSILRenderBuffers &p_ssil_buffers
memset(&ssil.gather_push_constant, 0, sizeof(SSILGatherPushConstant));
- RID shader = ssil.gather_shader.version_get_shader(ssil.gather_shader_version, 0);
+ RID shader = ssil.gather_shader.version_get_shader(ssil.gather_shader_version, SSIL_GATHER);
RID default_sampler = material_storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
RID default_mipmap_sampler = material_storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
@@ -749,78 +706,69 @@ void SSEffects::screen_space_indirect_lighting(SSILRenderBuffers &p_ssil_buffers
ssil.gather_push_constant.quality = MAX(0, ssil_quality - 1);
ssil.gather_push_constant.size_multiplier = ssil_half_size ? 2 : 1;
- if (p_ssil_buffers.projection_uniform_set.is_null()) {
- Vector<RD::Uniform> uniforms;
- {
- RD::Uniform u;
- u.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;
- u.binding = 0;
- u.append_id(default_mipmap_sampler);
- u.append_id(p_ssil_buffers.last_frame);
- uniforms.push_back(u);
- }
- {
- RD::Uniform u;
- u.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER;
- u.binding = 1;
- u.append_id(ssil.projection_uniform_buffer);
- uniforms.push_back(u);
- }
- p_ssil_buffers.projection_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, ssil.gather_shader.version_get_shader(ssil.gather_shader_version, 0), 3);
+ // We are using our uniform cache so our uniform sets are automatically freed when our textures are freed.
+ // It also ensures that we're reusing the right cached entry in a multiview situation without us having to
+ // remember each instance of the uniform set.
+
+ RID projection_uniform_set;
+ {
+ RD::Uniform u_last_frame;
+ u_last_frame.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;
+ u_last_frame.binding = 0;
+ u_last_frame.append_id(default_mipmap_sampler);
+ u_last_frame.append_id(last_frame);
+
+ RD::Uniform u_projection;
+ u_projection.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER;
+ u_projection.binding = 1;
+ u_projection.append_id(ssil.projection_uniform_buffer);
+
+ projection_uniform_set = uniform_set_cache->get_cache(shader, 3, u_last_frame, u_projection);
}
- if (p_ssil_buffers.gather_uniform_set.is_null()) {
- Vector<RD::Uniform> uniforms;
- {
- RD::Uniform u;
- u.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;
- u.binding = 0;
- u.append_id(default_sampler);
- u.append_id(p_ssil_buffers.depth_texture_view);
- uniforms.push_back(u);
- }
- {
- RD::Uniform u;
- u.uniform_type = RD::UNIFORM_TYPE_IMAGE;
- u.binding = 1;
- u.append_id(p_normal_buffer);
- uniforms.push_back(u);
- }
- {
- RD::Uniform u;
- u.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER;
- u.binding = 2;
- u.append_id(ss_effects.gather_constants_buffer);
- uniforms.push_back(u);
- }
- p_ssil_buffers.gather_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, ssil.gather_shader.version_get_shader(ssil.gather_shader_version, 0), 0);
+ RID gather_uniform_set;
+ {
+ RID depth_texture_view = p_render_buffers->get_texture_slice(RB_SCOPE_SSDS, RB_LINEAR_DEPTH, p_view * 4, ssil_half_size ? 1 : 0, 4, 4);
+
+ RD::Uniform u_depth_texture_view;
+ u_depth_texture_view.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;
+ u_depth_texture_view.binding = 0;
+ u_depth_texture_view.append_id(default_sampler);
+ u_depth_texture_view.append_id(depth_texture_view);
+
+ RD::Uniform u_normal_buffer;
+ u_normal_buffer.uniform_type = RD::UNIFORM_TYPE_IMAGE;
+ u_normal_buffer.binding = 1;
+ u_normal_buffer.append_id(p_normal_buffer);
+
+ RD::Uniform u_gather_constants_buffer;
+ u_gather_constants_buffer.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER;
+ u_gather_constants_buffer.binding = 2;
+ u_gather_constants_buffer.append_id(ss_effects.gather_constants_buffer);
+
+ gather_uniform_set = uniform_set_cache->get_cache(shader, 0, u_depth_texture_view, u_normal_buffer, u_gather_constants_buffer);
}
- if (p_ssil_buffers.importance_map_uniform_set.is_null()) {
- Vector<RD::Uniform> uniforms;
- {
- RD::Uniform u;
- u.uniform_type = RD::UNIFORM_TYPE_IMAGE;
- u.binding = 0;
- u.append_id(p_ssil_buffers.pong);
- uniforms.push_back(u);
- }
- {
- RD::Uniform u;
- u.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;
- u.binding = 1;
- u.append_id(default_sampler);
- u.append_id(p_ssil_buffers.importance_map[0]);
- uniforms.push_back(u);
- }
- {
- RD::Uniform u;
- u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER;
- u.binding = 2;
- u.append_id(ssil.importance_map_load_counter);
- uniforms.push_back(u);
- }
- p_ssil_buffers.importance_map_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, ssil.gather_shader.version_get_shader(ssil.gather_shader_version, 2), 1);
+ RID importance_map_uniform_set;
+ {
+ RD::Uniform u_pong;
+ u_pong.uniform_type = RD::UNIFORM_TYPE_IMAGE;
+ u_pong.binding = 0;
+ u_pong.append_id(deinterleaved_pong);
+
+ RD::Uniform u_importance_map;
+ u_importance_map.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;
+ u_importance_map.binding = 1;
+ u_importance_map.append_id(default_sampler);
+ u_importance_map.append_id(importance_map);
+
+ RD::Uniform u_load_counter;
+ u_load_counter.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER;
+ u_load_counter.binding = 2;
+ u_load_counter.append_id(ssil.importance_map_load_counter);
+
+ RID shader_adaptive = ssil.gather_shader.version_get_shader(ssil.gather_shader_version, SSIL_GATHER_ADAPTIVE);
+ importance_map_uniform_set = uniform_set_cache->get_cache(shader_adaptive, 1, u_pong, u_importance_map, u_load_counter);
}
if (ssil_quality == RS::ENV_SSIL_QUALITY_ULTRA) {
@@ -828,38 +776,42 @@ void SSEffects::screen_space_indirect_lighting(SSILRenderBuffers &p_ssil_buffers
ssil.importance_map_push_constant.half_screen_pixel_size[0] = 1.0 / p_ssil_buffers.buffer_width;
ssil.importance_map_push_constant.half_screen_pixel_size[1] = 1.0 / p_ssil_buffers.buffer_height;
ssil.importance_map_push_constant.intensity = p_settings.intensity * Math_PI;
+
//base pass
RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssil.pipelines[SSIL_GATHER_BASE]);
- gather_ssil(compute_list, p_ssil_buffers.pong_slices, p_ssil_buffers.edges_slices, p_settings, true, p_ssil_buffers.gather_uniform_set, p_ssil_buffers.importance_map_uniform_set, p_ssil_buffers.projection_uniform_set);
+ gather_ssil(compute_list, deinterleaved_pong_slices, edges_slices, p_settings, true, gather_uniform_set, importance_map_uniform_set, projection_uniform_set);
//generate importance map
- RD::Uniform u_ssil_pong_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssil_buffers.pong }));
- RD::Uniform u_importance_map(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssil_buffers.importance_map[0] }));
+ RID gen_imp_shader = ssil.importance_map_shader.version_get_shader(ssil.importance_map_shader_version, 0);
+ RD::Uniform u_ssil_pong_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, deinterleaved_pong }));
+ RD::Uniform u_importance_map(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ importance_map }));
RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssil.pipelines[SSIL_GENERATE_IMPORTANCE_MAP]);
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_ssil_pong_with_sampler), 0);
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_importance_map), 1);
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(gen_imp_shader, 0, u_ssil_pong_with_sampler), 0);
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(gen_imp_shader, 1, u_importance_map), 1);
RD::get_singleton()->compute_list_set_push_constant(compute_list, &ssil.importance_map_push_constant, sizeof(SSILImportanceMapPushConstant));
RD::get_singleton()->compute_list_dispatch_threads(compute_list, p_ssil_buffers.half_buffer_width, p_ssil_buffers.half_buffer_height, 1);
RD::get_singleton()->compute_list_add_barrier(compute_list);
// process Importance Map A
- RD::Uniform u_importance_map_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssil_buffers.importance_map[0] }));
- RD::Uniform u_importance_map_pong(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssil_buffers.importance_map[1] }));
+ RID proc_imp_shader_a = ssil.importance_map_shader.version_get_shader(ssil.importance_map_shader_version, 1);
+ RD::Uniform u_importance_map_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, importance_map }));
+ RD::Uniform u_importance_map_pong(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ importance_pong }));
RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssil.pipelines[SSIL_PROCESS_IMPORTANCE_MAPA]);
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_importance_map_with_sampler), 0);
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_importance_map_pong), 1);
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(proc_imp_shader_a, 0, u_importance_map_with_sampler), 0);
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(proc_imp_shader_a, 1, u_importance_map_pong), 1);
RD::get_singleton()->compute_list_set_push_constant(compute_list, &ssil.importance_map_push_constant, sizeof(SSILImportanceMapPushConstant));
RD::get_singleton()->compute_list_dispatch_threads(compute_list, p_ssil_buffers.half_buffer_width, p_ssil_buffers.half_buffer_height, 1);
RD::get_singleton()->compute_list_add_barrier(compute_list);
// process Importance Map B
- RD::Uniform u_importance_map_pong_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssil_buffers.importance_map[1] }));
+ RID proc_imp_shader_b = ssil.importance_map_shader.version_get_shader(ssil.importance_map_shader_version, 2);
+ RD::Uniform u_importance_map_pong_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, importance_pong }));
RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssil.pipelines[SSIL_PROCESS_IMPORTANCE_MAPB]);
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_importance_map_pong_with_sampler), 0);
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_importance_map), 1);
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(proc_imp_shader_b, 0, u_importance_map_pong_with_sampler), 0);
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(proc_imp_shader_b, 1, u_importance_map), 1);
RD::get_singleton()->compute_list_bind_uniform_set(compute_list, ssil.counter_uniform_set, 2);
RD::get_singleton()->compute_list_set_push_constant(compute_list, &ssil.importance_map_push_constant, sizeof(SSILImportanceMapPushConstant));
RD::get_singleton()->compute_list_dispatch_threads(compute_list, p_ssil_buffers.half_buffer_width, p_ssil_buffers.half_buffer_height, 1);
@@ -872,7 +824,7 @@ void SSEffects::screen_space_indirect_lighting(SSILRenderBuffers &p_ssil_buffers
RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssil.pipelines[SSIL_GATHER]);
}
- gather_ssil(compute_list, p_ssil_buffers.deinterleaved_slices, p_ssil_buffers.edges_slices, p_settings, false, p_ssil_buffers.gather_uniform_set, p_ssil_buffers.importance_map_uniform_set, p_ssil_buffers.projection_uniform_set);
+ gather_ssil(compute_list, deinterleaved_slices, edges_slices, p_settings, false, gather_uniform_set, importance_map_uniform_set, projection_uniform_set);
RD::get_singleton()->draw_command_end_label(); //Gather
}
@@ -895,6 +847,8 @@ void SSEffects::screen_space_indirect_lighting(SSILRenderBuffers &p_ssil_buffers
}
}
+ RID blur_shader = ssil.blur_shader.version_get_shader(ssil.blur_shader_version, blur_pipeline - SSIL_BLUR_PASS);
+
for (int i = 0; i < 4; i++) {
if ((ssil_quality == RS::ENV_SSIL_QUALITY_VERY_LOW) && ((i == 1) || (i == 2))) {
continue;
@@ -903,30 +857,30 @@ void SSEffects::screen_space_indirect_lighting(SSILRenderBuffers &p_ssil_buffers
RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssil.pipelines[blur_pipeline]);
if (pass % 2 == 0) {
if (ssil_quality == RS::ENV_SSIL_QUALITY_VERY_LOW) {
- RD::Uniform u_ssil_slice(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssil_buffers.deinterleaved_slices[i] }));
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_ssil_slice), 0);
+ RD::Uniform u_ssil_slice(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, deinterleaved_slices[i] }));
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(blur_shader, 0, u_ssil_slice), 0);
} else {
- RD::Uniform u_ssil_slice(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ ss_effects.mirror_sampler, p_ssil_buffers.deinterleaved_slices[i] }));
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_ssil_slice), 0);
+ RD::Uniform u_ssil_slice(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ ss_effects.mirror_sampler, deinterleaved_slices[i] }));
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(blur_shader, 0, u_ssil_slice), 0);
}
- RD::Uniform u_ssil_pong_slice(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssil_buffers.pong_slices[i] }));
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_ssil_pong_slice), 1);
+ RD::Uniform u_ssil_pong_slice(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ deinterleaved_pong_slices[i] }));
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(blur_shader, 1, u_ssil_pong_slice), 1);
} else {
if (ssil_quality == RS::ENV_SSIL_QUALITY_VERY_LOW) {
- RD::Uniform u_ssil_pong_slice(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssil_buffers.pong_slices[i] }));
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_ssil_pong_slice), 0);
+ RD::Uniform u_ssil_pong_slice(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, deinterleaved_pong_slices[i] }));
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(blur_shader, 0, u_ssil_pong_slice), 0);
} else {
- RD::Uniform u_ssil_pong_slice(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ ss_effects.mirror_sampler, p_ssil_buffers.pong_slices[i] }));
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_ssil_pong_slice), 0);
+ RD::Uniform u_ssil_pong_slice(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ ss_effects.mirror_sampler, deinterleaved_pong_slices[i] }));
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(blur_shader, 0, u_ssil_pong_slice), 0);
}
- RD::Uniform u_ssil_slice(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssil_buffers.deinterleaved_slices[i] }));
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_ssil_slice), 1);
+ RD::Uniform u_ssil_slice(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ deinterleaved_slices[i] }));
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(blur_shader, 1, u_ssil_slice), 1);
}
- RD::Uniform u_edges_slice(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssil_buffers.edges_slices[i] }));
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 2, u_edges_slice), 2);
+ RD::Uniform u_edges_slice(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ edges_slices[i] }));
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(blur_shader, 2, u_edges_slice), 2);
RD::get_singleton()->compute_list_set_push_constant(compute_list, &ssil.blur_push_constant, sizeof(SSILBlurPushConstant));
@@ -961,18 +915,19 @@ void SSEffects::screen_space_indirect_lighting(SSILRenderBuffers &p_ssil_buffers
RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssil.pipelines[interleave_pipeline]);
- RD::Uniform u_destination(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssil_buffers.ssil_final }));
+ RID final = p_render_buffers->get_texture_slice(RB_SCOPE_SSIL, RB_FINAL, p_view, 0);
+ RD::Uniform u_destination(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ final }));
RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_destination), 0);
if (ssil_quality > RS::ENV_SSIL_QUALITY_VERY_LOW && ssil_blur_passes % 2 == 0) {
- RD::Uniform u_ssil(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssil_buffers.deinterleaved }));
+ RD::Uniform u_ssil(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, deinterleaved }));
RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_ssil), 1);
} else {
- RD::Uniform u_ssil_pong(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssil_buffers.pong }));
+ RD::Uniform u_ssil_pong(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, deinterleaved_pong }));
RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_ssil_pong), 1);
}
- RD::Uniform u_edges(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssil_buffers.edges }));
+ RD::Uniform u_edges(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ edges }));
RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 2, u_edges), 2);
RD::get_singleton()->compute_list_set_push_constant(compute_list, &ssil.interleave_push_constant, sizeof(SSILInterleavePushConstant));
@@ -990,34 +945,6 @@ void SSEffects::screen_space_indirect_lighting(SSILRenderBuffers &p_ssil_buffers
RD::get_singleton()->buffer_update(ssil.importance_map_load_counter, 0, sizeof(uint32_t), &zero, 0); //no barrier
}
-void SSEffects::ssil_free(SSILRenderBuffers &p_ssil_buffers) {
- if (p_ssil_buffers.ssil_final.is_valid()) {
- RD::get_singleton()->free(p_ssil_buffers.ssil_final);
- RD::get_singleton()->free(p_ssil_buffers.deinterleaved);
- RD::get_singleton()->free(p_ssil_buffers.pong);
- RD::get_singleton()->free(p_ssil_buffers.edges);
- RD::get_singleton()->free(p_ssil_buffers.importance_map[0]);
- RD::get_singleton()->free(p_ssil_buffers.importance_map[1]);
- RD::get_singleton()->free(p_ssil_buffers.last_frame);
-
- p_ssil_buffers.ssil_final = RID();
- p_ssil_buffers.deinterleaved = RID();
- p_ssil_buffers.pong = RID();
- p_ssil_buffers.edges = RID();
- p_ssil_buffers.deinterleaved_slices.clear();
- p_ssil_buffers.pong_slices.clear();
- p_ssil_buffers.edges_slices.clear();
- p_ssil_buffers.importance_map[0] = RID();
- p_ssil_buffers.importance_map[1] = RID();
- p_ssil_buffers.last_frame = RID();
- p_ssil_buffers.last_frame_slices.clear();
-
- p_ssil_buffers.gather_uniform_set = RID();
- p_ssil_buffers.importance_map_uniform_set = RID();
- p_ssil_buffers.projection_uniform_set = RID();
- }
-}
-
/* SSAO */
void SSEffects::ssao_set_quality(RS::EnvironmentSSAOQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) {
@@ -1029,13 +956,13 @@ void SSEffects::ssao_set_quality(RS::EnvironmentSSAOQuality p_quality, bool p_ha
ssao_fadeout_to = p_fadeout_to;
}
-void SSEffects::gather_ssao(RD::ComputeListID p_compute_list, const Vector<RID> p_ao_slices, const SSAOSettings &p_settings, bool p_adaptive_base_pass, RID p_gather_uniform_set, RID p_importance_map_uniform_set) {
+void SSEffects::gather_ssao(RD::ComputeListID p_compute_list, const RID *p_ao_slices, const SSAOSettings &p_settings, bool p_adaptive_base_pass, RID p_gather_uniform_set, RID p_importance_map_uniform_set) {
UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton();
ERR_FAIL_NULL(uniform_set_cache);
RD::get_singleton()->compute_list_bind_uniform_set(p_compute_list, p_gather_uniform_set, 0);
if ((ssao_quality == RS::ENV_SSAO_QUALITY_ULTRA) && !p_adaptive_base_pass) {
- RD::get_singleton()->compute_list_bind_uniform_set(p_compute_list, p_importance_map_uniform_set, 0);
+ RD::get_singleton()->compute_list_bind_uniform_set(p_compute_list, p_importance_map_uniform_set, 1);
}
RID shader = ssao.gather_shader.version_get_shader(ssao.gather_shader_version, 1); //
@@ -1062,11 +989,12 @@ void SSEffects::gather_ssao(RD::ComputeListID p_compute_list, const Vector<RID>
RD::get_singleton()->compute_list_add_barrier(p_compute_list);
}
-void SSEffects::ssao_allocate_buffers(SSAORenderBuffers &p_ssao_buffers, const SSAOSettings &p_settings, RID p_linear_depth) {
+void SSEffects::ssao_allocate_buffers(Ref<RenderSceneBuffersRD> p_render_buffers, SSAORenderBuffers &p_ssao_buffers, const SSAOSettings &p_settings) {
if (p_ssao_buffers.half_size != ssao_half_size) {
- ssao_free(p_ssao_buffers);
+ p_render_buffers->clear_context(RB_SCOPE_SSAO);
}
+ p_ssao_buffers.half_size = ssao_half_size;
if (ssao_half_size) {
p_ssao_buffers.buffer_width = (p_settings.full_screen_size.x + 3) / 4;
p_ssao_buffers.buffer_height = (p_settings.full_screen_size.y + 3) / 4;
@@ -1079,79 +1007,45 @@ void SSEffects::ssao_allocate_buffers(SSAORenderBuffers &p_ssao_buffers, const S
p_ssao_buffers.half_buffer_height = (p_settings.full_screen_size.y + 3) / 4;
}
- if (p_ssao_buffers.ao_deinterleaved.is_null()) {
- {
- p_ssao_buffers.depth_texture_view = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), p_linear_depth, 0, ssao_half_size ? 1 : 0, 4, RD::TEXTURE_SLICE_2D_ARRAY);
- }
- {
- RD::TextureFormat tf;
- tf.format = RD::DATA_FORMAT_R8G8_UNORM;
- tf.texture_type = RD::TEXTURE_TYPE_2D_ARRAY;
- tf.width = p_ssao_buffers.buffer_width;
- tf.height = p_ssao_buffers.buffer_height;
- tf.array_layers = 4;
- tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT;
- p_ssao_buffers.ao_deinterleaved = RD::get_singleton()->texture_create(tf, RD::TextureView());
- RD::get_singleton()->set_resource_name(p_ssao_buffers.ao_deinterleaved, "SSAO De-interleaved Array");
- for (uint32_t i = 0; i < 4; i++) {
- RID slice = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), p_ssao_buffers.ao_deinterleaved, i, 0);
- p_ssao_buffers.ao_deinterleaved_slices.push_back(slice);
- RD::get_singleton()->set_resource_name(slice, "SSAO De-interleaved Array Layer " + itos(i) + " ");
- }
- }
+ uint32_t view_count = p_render_buffers->get_view_count();
+ Size2i full_size = Size2i(p_ssao_buffers.buffer_width, p_ssao_buffers.buffer_height);
+ Size2i half_size = Size2i(p_ssao_buffers.half_buffer_width, p_ssao_buffers.half_buffer_height);
- {
- RD::TextureFormat tf;
- tf.format = RD::DATA_FORMAT_R8G8_UNORM;
- tf.texture_type = RD::TEXTURE_TYPE_2D_ARRAY;
- tf.width = p_ssao_buffers.buffer_width;
- tf.height = p_ssao_buffers.buffer_height;
- tf.array_layers = 4;
- tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT;
- p_ssao_buffers.ao_pong = RD::get_singleton()->texture_create(tf, RD::TextureView());
- RD::get_singleton()->set_resource_name(p_ssao_buffers.ao_pong, "SSAO De-interleaved Array Pong");
- for (uint32_t i = 0; i < 4; i++) {
- RID slice = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), p_ssao_buffers.ao_pong, i, 0);
- p_ssao_buffers.ao_pong_slices.push_back(slice);
- RD::get_singleton()->set_resource_name(slice, "SSAO De-interleaved Array Layer " + itos(i) + " Pong");
- }
- }
+ // As we're not clearing these, and render buffers will return the cached texture if it already exists,
+ // we don't first check has_texture here
- {
- RD::TextureFormat tf;
- tf.format = RD::DATA_FORMAT_R8_UNORM;
- tf.width = p_ssao_buffers.buffer_width;
- tf.height = p_ssao_buffers.buffer_height;
- tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT;
- p_ssao_buffers.importance_map[0] = RD::get_singleton()->texture_create(tf, RD::TextureView());
- RD::get_singleton()->set_resource_name(p_ssao_buffers.importance_map[0], "SSAO Importance Map");
- p_ssao_buffers.importance_map[1] = RD::get_singleton()->texture_create(tf, RD::TextureView());
- RD::get_singleton()->set_resource_name(p_ssao_buffers.importance_map[1], "SSAO Importance Map Pong");
- }
- {
- RD::TextureFormat tf;
- tf.format = RD::DATA_FORMAT_R8_UNORM;
- tf.width = p_settings.full_screen_size.x;
- tf.height = p_settings.full_screen_size.y;
- tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT;
- p_ssao_buffers.ao_final = RD::get_singleton()->texture_create(tf, RD::TextureView());
- RD::get_singleton()->set_resource_name(p_ssao_buffers.ao_final, "SSAO Final");
- }
- p_ssao_buffers.half_size = ssao_half_size;
- }
+ p_render_buffers->create_texture(RB_SCOPE_SSAO, RB_DEINTERLEAVED, RD::DATA_FORMAT_R8G8_UNORM, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT, RD::TEXTURE_SAMPLES_1, full_size, 4 * view_count);
+ p_render_buffers->create_texture(RB_SCOPE_SSAO, RB_DEINTERLEAVED_PONG, RD::DATA_FORMAT_R8G8_UNORM, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT, RD::TEXTURE_SAMPLES_1, full_size, 4 * view_count);
+ p_render_buffers->create_texture(RB_SCOPE_SSAO, RB_IMPORTANCE_MAP, RD::DATA_FORMAT_R8_UNORM, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT, RD::TEXTURE_SAMPLES_1, half_size);
+ p_render_buffers->create_texture(RB_SCOPE_SSAO, RB_IMPORTANCE_PONG, RD::DATA_FORMAT_R8_UNORM, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT, RD::TEXTURE_SAMPLES_1, half_size);
+ p_render_buffers->create_texture(RB_SCOPE_SSAO, RB_FINAL, RD::DATA_FORMAT_R8_UNORM, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT, RD::TEXTURE_SAMPLES_1);
}
-void SSEffects::generate_ssao(SSAORenderBuffers &p_ssao_buffers, RID p_normal_buffer, const Projection &p_projection, const SSAOSettings &p_settings) {
+void SSEffects::generate_ssao(Ref<RenderSceneBuffersRD> p_render_buffers, SSAORenderBuffers &p_ssao_buffers, uint32_t p_view, RID p_normal_buffer, const Projection &p_projection, const SSAOSettings &p_settings) {
UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton();
ERR_FAIL_NULL(uniform_set_cache);
MaterialStorage *material_storage = MaterialStorage::get_singleton();
ERR_FAIL_NULL(material_storage);
+ // Obtain our (cached) buffer slices for the view we are rendering.
+ RID ao_deinterleaved = p_render_buffers->get_texture_slice(RB_SCOPE_SSAO, RB_DEINTERLEAVED, p_view * 4, 0, 4, 1);
+ RID ao_pong = p_render_buffers->get_texture_slice(RB_SCOPE_SSAO, RB_DEINTERLEAVED_PONG, p_view * 4, 0, 4, 1);
+ RID importance_map = p_render_buffers->get_texture_slice(RB_SCOPE_SSAO, RB_IMPORTANCE_MAP, p_view, 0);
+ RID importance_pong = p_render_buffers->get_texture_slice(RB_SCOPE_SSAO, RB_IMPORTANCE_PONG, p_view, 0);
+ RID ao_final = p_render_buffers->get_texture_slice(RB_SCOPE_SSAO, RB_FINAL, p_view, 0);
+
+ RID ao_deinterleaved_slices[4];
+ RID ao_pong_slices[4];
+ for (uint32_t i = 0; i < 4; i++) {
+ ao_deinterleaved_slices[i] = p_render_buffers->get_texture_slice(RB_SCOPE_SSAO, RB_DEINTERLEAVED, p_view * 4 + i, 0);
+ ao_pong_slices[i] = p_render_buffers->get_texture_slice(RB_SCOPE_SSAO, RB_DEINTERLEAVED_PONG, p_view * 4 + i, 0);
+ }
+
RD::ComputeListID compute_list = RD::get_singleton()->compute_list_begin();
memset(&ssao.gather_push_constant, 0, sizeof(SSAOGatherPushConstant));
/* FIRST PASS */
- RID shader = ssao.gather_shader.version_get_shader(ssao.gather_shader_version, 0);
+ RID shader = ssao.gather_shader.version_get_shader(ssao.gather_shader_version, SSAO_GATHER);
RID default_sampler = material_storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
RD::get_singleton()->draw_command_begin_label("Process Screen Space Ambient Occlusion");
@@ -1201,60 +1095,52 @@ void SSEffects::generate_ssao(SSAORenderBuffers &p_ssao_buffers, RID p_normal_bu
ssao.gather_push_constant.quality = MAX(0, ssao_quality - 1);
ssao.gather_push_constant.size_multiplier = ssao_half_size ? 2 : 1;
- if (p_ssao_buffers.gather_uniform_set.is_null()) {
- Vector<RD::Uniform> uniforms;
- {
- RD::Uniform u;
- u.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;
- u.binding = 0;
- u.append_id(default_sampler);
- u.append_id(p_ssao_buffers.depth_texture_view);
- uniforms.push_back(u);
- }
- {
- RD::Uniform u;
- u.uniform_type = RD::UNIFORM_TYPE_IMAGE;
- u.binding = 1;
- u.append_id(p_normal_buffer);
- uniforms.push_back(u);
- }
- {
- RD::Uniform u;
- u.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER;
- u.binding = 2;
- u.append_id(ss_effects.gather_constants_buffer);
- uniforms.push_back(u);
- }
- p_ssao_buffers.gather_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, shader, 0);
- RD::get_singleton()->set_resource_name(p_ssao_buffers.gather_uniform_set, "SSAO Gather Uniform Set");
+ // We are using our uniform cache so our uniform sets are automatically freed when our textures are freed.
+ // It also ensures that we're reusing the right cached entry in a multiview situation without us having to
+ // remember each instance of the uniform set.
+ RID gather_uniform_set;
+ {
+ RID depth_texture_view = p_render_buffers->get_texture_slice(RB_SCOPE_SSDS, RB_LINEAR_DEPTH, p_view * 4, ssao_half_size ? 1 : 0, 4, 4);
+
+ RD::Uniform u_depth_texture_view;
+ u_depth_texture_view.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;
+ u_depth_texture_view.binding = 0;
+ u_depth_texture_view.append_id(default_sampler);
+ u_depth_texture_view.append_id(depth_texture_view);
+
+ RD::Uniform u_normal_buffer;
+ u_normal_buffer.uniform_type = RD::UNIFORM_TYPE_IMAGE;
+ u_normal_buffer.binding = 1;
+ u_normal_buffer.append_id(p_normal_buffer);
+
+ RD::Uniform u_gather_constants_buffer;
+ u_gather_constants_buffer.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER;
+ u_gather_constants_buffer.binding = 2;
+ u_gather_constants_buffer.append_id(ss_effects.gather_constants_buffer);
+
+ gather_uniform_set = uniform_set_cache->get_cache(shader, 0, u_depth_texture_view, u_normal_buffer, u_gather_constants_buffer);
}
- if (p_ssao_buffers.importance_map_uniform_set.is_null()) {
- Vector<RD::Uniform> uniforms;
- {
- RD::Uniform u;
- u.uniform_type = RD::UNIFORM_TYPE_IMAGE;
- u.binding = 0;
- u.append_id(p_ssao_buffers.ao_pong);
- uniforms.push_back(u);
- }
- {
- RD::Uniform u;
- u.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;
- u.binding = 1;
- u.append_id(default_sampler);
- u.append_id(p_ssao_buffers.importance_map[0]);
- uniforms.push_back(u);
- }
- {
- RD::Uniform u;
- u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER;
- u.binding = 2;
- u.append_id(ssao.importance_map_load_counter);
- uniforms.push_back(u);
- }
- p_ssao_buffers.importance_map_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, ssao.gather_shader.version_get_shader(ssao.gather_shader_version, 2), 1);
- RD::get_singleton()->set_resource_name(p_ssao_buffers.importance_map_uniform_set, "SSAO Importance Map Uniform Set");
+ RID importance_map_uniform_set;
+ {
+ RD::Uniform u_pong;
+ u_pong.uniform_type = RD::UNIFORM_TYPE_IMAGE;
+ u_pong.binding = 0;
+ u_pong.append_id(ao_pong);
+
+ RD::Uniform u_importance_map;
+ u_importance_map.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;
+ u_importance_map.binding = 1;
+ u_importance_map.append_id(default_sampler);
+ u_importance_map.append_id(importance_map);
+
+ RD::Uniform u_load_counter;
+ u_load_counter.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER;
+ u_load_counter.binding = 2;
+ u_load_counter.append_id(ssao.importance_map_load_counter);
+
+ RID shader_adaptive = ssao.gather_shader.version_get_shader(ssao.gather_shader_version, SSAO_GATHER_ADAPTIVE);
+ importance_map_uniform_set = uniform_set_cache->get_cache(shader_adaptive, 1, u_pong, u_importance_map, u_load_counter);
}
if (ssao_quality == RS::ENV_SSAO_QUALITY_ULTRA) {
@@ -1266,41 +1152,44 @@ void SSEffects::generate_ssao(SSAORenderBuffers &p_ssao_buffers, RID p_normal_bu
//base pass
RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssao.pipelines[SSAO_GATHER_BASE]);
- gather_ssao(compute_list, p_ssao_buffers.ao_pong_slices, p_settings, true, p_ssao_buffers.gather_uniform_set, RID());
+ gather_ssao(compute_list, ao_pong_slices, p_settings, true, gather_uniform_set, RID());
//generate importance map
+ RID gen_imp_shader = ssao.importance_map_shader.version_get_shader(ssao.importance_map_shader_version, 0);
RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssao.pipelines[SSAO_GENERATE_IMPORTANCE_MAP]);
- RD::Uniform u_ao_pong_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssao_buffers.ao_pong }));
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_ao_pong_with_sampler), 0);
+ RD::Uniform u_ao_pong_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, ao_pong }));
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(gen_imp_shader, 0, u_ao_pong_with_sampler), 0);
- RD::Uniform u_importance_map(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssao_buffers.importance_map[0] }));
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_importance_map), 1);
+ RD::Uniform u_importance_map(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ importance_map }));
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(gen_imp_shader, 1, u_importance_map), 1);
RD::get_singleton()->compute_list_set_push_constant(compute_list, &ssao.importance_map_push_constant, sizeof(SSAOImportanceMapPushConstant));
RD::get_singleton()->compute_list_dispatch_threads(compute_list, p_ssao_buffers.half_buffer_width, p_ssao_buffers.half_buffer_height, 1);
RD::get_singleton()->compute_list_add_barrier(compute_list);
//process importance map A
+ RID proc_imp_shader_a = ssao.importance_map_shader.version_get_shader(ssao.importance_map_shader_version, 1);
RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssao.pipelines[SSAO_PROCESS_IMPORTANCE_MAPA]);
- RD::Uniform u_importance_map_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssao_buffers.importance_map[0] }));
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_importance_map_with_sampler), 0);
+ RD::Uniform u_importance_map_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, importance_map }));
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(proc_imp_shader_a, 0, u_importance_map_with_sampler), 0);
- RD::Uniform u_importance_map_pong(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssao_buffers.importance_map[1] }));
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_importance_map_pong), 1);
+ RD::Uniform u_importance_map_pong(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ importance_pong }));
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(proc_imp_shader_a, 1, u_importance_map_pong), 1);
RD::get_singleton()->compute_list_set_push_constant(compute_list, &ssao.importance_map_push_constant, sizeof(SSAOImportanceMapPushConstant));
RD::get_singleton()->compute_list_dispatch_threads(compute_list, p_ssao_buffers.half_buffer_width, p_ssao_buffers.half_buffer_height, 1);
RD::get_singleton()->compute_list_add_barrier(compute_list);
//process Importance Map B
+ RID proc_imp_shader_b = ssao.importance_map_shader.version_get_shader(ssao.importance_map_shader_version, 2);
RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssao.pipelines[SSAO_PROCESS_IMPORTANCE_MAPB]);
- RD::Uniform u_importance_map_pong_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssao_buffers.importance_map[1] }));
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_importance_map_pong_with_sampler), 0);
+ RD::Uniform u_importance_map_pong_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, importance_pong }));
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(proc_imp_shader_b, 0, u_importance_map_pong_with_sampler), 0);
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_importance_map), 1);
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(proc_imp_shader_b, 1, u_importance_map), 1);
RD::get_singleton()->compute_list_bind_uniform_set(compute_list, ssao.counter_uniform_set, 2);
RD::get_singleton()->compute_list_set_push_constant(compute_list, &ssao.importance_map_push_constant, sizeof(SSAOImportanceMapPushConstant));
RD::get_singleton()->compute_list_dispatch_threads(compute_list, p_ssao_buffers.half_buffer_width, p_ssao_buffers.half_buffer_height, 1);
@@ -1312,7 +1201,7 @@ void SSEffects::generate_ssao(SSAORenderBuffers &p_ssao_buffers, RID p_normal_bu
RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssao.pipelines[SSAO_GATHER]);
}
- gather_ssao(compute_list, p_ssao_buffers.ao_deinterleaved_slices, p_settings, false, p_ssao_buffers.gather_uniform_set, p_ssao_buffers.importance_map_uniform_set);
+ gather_ssao(compute_list, ao_deinterleaved_slices, p_settings, false, gather_uniform_set, importance_map_uniform_set);
RD::get_singleton()->draw_command_end_label(); // Gather SSAO
}
@@ -1344,29 +1233,30 @@ void SSEffects::generate_ssao(SSAORenderBuffers &p_ssao_buffers, RID p_normal_bu
continue;
}
+ RID blur_shader = ssao.blur_shader.version_get_shader(ssao.blur_shader_version, blur_pipeline - SSAO_BLUR_PASS);
RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssao.pipelines[blur_pipeline]);
if (pass % 2 == 0) {
if (ssao_quality == RS::ENV_SSAO_QUALITY_VERY_LOW) {
- RD::Uniform u_ao_slices_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssao_buffers.ao_deinterleaved_slices[i] }));
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_ao_slices_with_sampler), 0);
+ RD::Uniform u_ao_slices_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, ao_deinterleaved_slices[i] }));
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(blur_shader, 0, u_ao_slices_with_sampler), 0);
} else {
- RD::Uniform u_ao_slices_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ ss_effects.mirror_sampler, p_ssao_buffers.ao_deinterleaved_slices[i] }));
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_ao_slices_with_sampler), 0);
+ RD::Uniform u_ao_slices_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ ss_effects.mirror_sampler, ao_deinterleaved_slices[i] }));
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(blur_shader, 0, u_ao_slices_with_sampler), 0);
}
- RD::Uniform u_ao_pong_slices(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssao_buffers.ao_pong_slices[i] }));
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_ao_pong_slices), 1);
+ RD::Uniform u_ao_pong_slices(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ ao_pong_slices[i] }));
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(blur_shader, 1, u_ao_pong_slices), 1);
} else {
if (ssao_quality == RS::ENV_SSAO_QUALITY_VERY_LOW) {
- RD::Uniform u_ao_pong_slices_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssao_buffers.ao_pong_slices[i] }));
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_ao_pong_slices_with_sampler), 0);
+ RD::Uniform u_ao_pong_slices_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, ao_pong_slices[i] }));
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(blur_shader, 0, u_ao_pong_slices_with_sampler), 0);
} else {
- RD::Uniform u_ao_pong_slices_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ ss_effects.mirror_sampler, p_ssao_buffers.ao_pong_slices[i] }));
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_ao_pong_slices_with_sampler), 0);
+ RD::Uniform u_ao_pong_slices_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ ss_effects.mirror_sampler, ao_pong_slices[i] }));
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(blur_shader, 0, u_ao_pong_slices_with_sampler), 0);
}
- RD::Uniform u_ao_slices(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssao_buffers.ao_deinterleaved_slices[i] }));
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_ao_slices), 1);
+ RD::Uniform u_ao_slices(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ ao_deinterleaved_slices[i] }));
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(blur_shader, 1, u_ao_slices), 1);
}
RD::get_singleton()->compute_list_set_push_constant(compute_list, &ssao.blur_push_constant, sizeof(SSAOBlurPushConstant));
@@ -1400,17 +1290,18 @@ void SSEffects::generate_ssao(SSAORenderBuffers &p_ssao_buffers, RID p_normal_bu
interleave_pipeline = SSAO_INTERLEAVE_SMART;
}
+ RID interleave_shader = ssao.interleave_shader.version_get_shader(ssao.interleave_shader_version, interleave_pipeline - SSAO_INTERLEAVE);
RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssao.pipelines[interleave_pipeline]);
- RD::Uniform u_upscale_buffer(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssao_buffers.ao_final }));
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_upscale_buffer), 0);
+ RD::Uniform u_upscale_buffer(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ ao_final }));
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(interleave_shader, 0, u_upscale_buffer), 0);
if (ssao_quality > RS::ENV_SSAO_QUALITY_VERY_LOW && ssao_blur_passes % 2 == 0) {
- RD::Uniform u_ao(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssao_buffers.ao_deinterleaved }));
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_ao), 1);
+ RD::Uniform u_ao(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, ao_deinterleaved }));
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(interleave_shader, 1, u_ao), 1);
} else {
- RD::Uniform u_ao(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssao_buffers.ao_pong }));
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_ao), 1);
+ RD::Uniform u_ao(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, ao_pong }));
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(interleave_shader, 1, u_ao), 1);
}
RD::get_singleton()->compute_list_set_push_constant(compute_list, &ssao.interleave_push_constant, sizeof(SSAOInterleavePushConstant));
@@ -1426,116 +1317,43 @@ void SSEffects::generate_ssao(SSAORenderBuffers &p_ssao_buffers, RID p_normal_bu
RD::get_singleton()->buffer_update(ssao.importance_map_load_counter, 0, sizeof(uint32_t), &zero, 0); //no barrier
}
-void SSEffects::ssao_free(SSAORenderBuffers &p_ssao_buffers) {
- if (p_ssao_buffers.ao_final.is_valid()) {
- RD::get_singleton()->free(p_ssao_buffers.ao_deinterleaved);
- RD::get_singleton()->free(p_ssao_buffers.ao_pong);
- RD::get_singleton()->free(p_ssao_buffers.ao_final);
-
- RD::get_singleton()->free(p_ssao_buffers.importance_map[0]);
- RD::get_singleton()->free(p_ssao_buffers.importance_map[1]);
-
- p_ssao_buffers.ao_deinterleaved = RID();
- p_ssao_buffers.ao_pong = RID();
- p_ssao_buffers.ao_final = RID();
- p_ssao_buffers.importance_map[0] = RID();
- p_ssao_buffers.importance_map[1] = RID();
- p_ssao_buffers.ao_deinterleaved_slices.clear();
- p_ssao_buffers.ao_pong_slices.clear();
-
- p_ssao_buffers.gather_uniform_set = RID();
- p_ssao_buffers.importance_map_uniform_set = RID();
- }
-}
-
/* Screen Space Reflection */
void SSEffects::ssr_set_roughness_quality(RS::EnvironmentSSRRoughnessQuality p_quality) {
ssr_roughness_quality = p_quality;
}
-void SSEffects::ssr_allocate_buffers(SSRRenderBuffers &p_ssr_buffers, const RenderingDevice::DataFormat p_color_format, const Size2i &p_screen_size, const uint32_t p_view_count) {
- // As we are processing one view at a time, we can reuse buffers, only our output needs to have layers for each view.
- if (p_ssr_buffers.size != p_screen_size || p_ssr_buffers.roughness_quality != ssr_roughness_quality) {
- ssr_free(p_ssr_buffers);
- }
-
- if (p_ssr_buffers.output.is_valid()) {
- // already allocated
- return;
+void SSEffects::ssr_allocate_buffers(Ref<RenderSceneBuffersRD> p_render_buffers, SSRRenderBuffers &p_ssr_buffers, const RenderingDevice::DataFormat p_color_format) {
+ if (p_ssr_buffers.roughness_quality != ssr_roughness_quality) {
+ // Buffers will already be cleared if view count or viewport size has changed, also cleared them if we change roughness.
+ p_render_buffers->clear_context(RB_SCOPE_SSR);
}
- p_ssr_buffers.size = p_screen_size;
+ Size2i internal_size = p_render_buffers->get_internal_size();
+ p_ssr_buffers.size = Size2i(internal_size.x / 2, internal_size.y / 2);
p_ssr_buffers.roughness_quality = ssr_roughness_quality;
- if (p_ssr_buffers.depth_scaled.is_null()) {
- RD::TextureFormat tf;
- tf.format = RD::DATA_FORMAT_R32_SFLOAT;
- tf.width = p_screen_size.x;
- tf.height = p_screen_size.y;
- tf.texture_type = RD::TEXTURE_TYPE_2D;
- tf.array_layers = 1;
- tf.usage_bits = RD::TEXTURE_USAGE_STORAGE_BIT;
-
- p_ssr_buffers.depth_scaled = RD::get_singleton()->texture_create(tf, RD::TextureView());
- RD::get_singleton()->set_resource_name(p_ssr_buffers.depth_scaled, "SSR Depth Scaled");
+ // We are using barriers so we do not need to allocate textures for both views on anything but output...
- tf.format = RD::DATA_FORMAT_R8G8B8A8_UNORM;
+ p_render_buffers->create_texture(RB_SCOPE_SSR, RB_DEPTH_SCALED, RD::DATA_FORMAT_R32_SFLOAT, RD::TEXTURE_USAGE_STORAGE_BIT, RD::TEXTURE_SAMPLES_1, p_ssr_buffers.size, 1);
+ p_render_buffers->create_texture(RB_SCOPE_SSR, RB_NORMAL_SCALED, RD::DATA_FORMAT_R8G8B8A8_UNORM, RD::TEXTURE_USAGE_STORAGE_BIT, RD::TEXTURE_SAMPLES_1, p_ssr_buffers.size, 1);
- p_ssr_buffers.normal_scaled = RD::get_singleton()->texture_create(tf, RD::TextureView());
- RD::get_singleton()->set_resource_name(p_ssr_buffers.normal_scaled, "SSR Normal Scaled");
+ if (ssr_roughness_quality != RS::ENV_SSR_ROUGHNESS_QUALITY_DISABLED && !p_render_buffers->has_texture(RB_SCOPE_SSR, RB_BLUR_RADIUS)) {
+ p_render_buffers->create_texture(RB_SCOPE_SSR, RB_BLUR_RADIUS, RD::DATA_FORMAT_R8_UNORM, RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_SAMPLING_BIT, RD::TEXTURE_SAMPLES_1, p_ssr_buffers.size, 2); // 2 layers, for our two blur stages
}
- if (ssr_roughness_quality != RS::ENV_SSR_ROUGHNESS_QUALITY_DISABLED && !p_ssr_buffers.blur_radius[0].is_valid()) {
- RD::TextureFormat tf;
- tf.format = RD::DATA_FORMAT_R8_UNORM;
- tf.width = p_screen_size.x;
- tf.height = p_screen_size.y;
- tf.texture_type = RD::TEXTURE_TYPE_2D;
- tf.array_layers = 1;
- tf.usage_bits = RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_SAMPLING_BIT;
-
- p_ssr_buffers.blur_radius[0] = RD::get_singleton()->texture_create(tf, RD::TextureView());
- RD::get_singleton()->set_resource_name(p_ssr_buffers.blur_radius[0], "SSR Blur Radius 0");
- p_ssr_buffers.blur_radius[1] = RD::get_singleton()->texture_create(tf, RD::TextureView());
- RD::get_singleton()->set_resource_name(p_ssr_buffers.blur_radius[1], "SSR Blur Radius 1");
- }
-
- if (p_ssr_buffers.intermediate.is_null()) {
- RD::TextureFormat tf;
- tf.format = p_color_format;
- tf.width = p_screen_size.x;
- tf.height = p_screen_size.y;
- tf.texture_type = RD::TEXTURE_TYPE_2D;
- tf.array_layers = 1;
- tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_CAN_COPY_TO_BIT | RD::TEXTURE_USAGE_STORAGE_BIT;
-
- p_ssr_buffers.intermediate = RD::get_singleton()->texture_create(tf, RD::TextureView());
- RD::get_singleton()->set_resource_name(p_ssr_buffers.intermediate, "SSR Intermediate");
-
- if (p_view_count > 1) {
- tf.texture_type = RD::TEXTURE_TYPE_2D_ARRAY;
- tf.array_layers = p_view_count;
- } else {
- tf.texture_type = RD::TEXTURE_TYPE_2D;
- tf.array_layers = 1;
- }
-
- p_ssr_buffers.output = RD::get_singleton()->texture_create(tf, RD::TextureView());
- RD::get_singleton()->set_resource_name(p_ssr_buffers.output, "SSR Output");
-
- for (uint32_t v = 0; v < p_view_count; v++) {
- p_ssr_buffers.output_slices[v] = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), p_ssr_buffers.output, v, 0);
- }
- }
+ p_render_buffers->create_texture(RB_SCOPE_SSR, RB_INTERMEDIATE, p_color_format, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_CAN_COPY_TO_BIT | RD::TEXTURE_USAGE_STORAGE_BIT, RD::TEXTURE_SAMPLES_1, p_ssr_buffers.size, 1);
+ p_render_buffers->create_texture(RB_SCOPE_SSR, RB_OUTPUT, p_color_format, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_CAN_COPY_TO_BIT | RD::TEXTURE_USAGE_STORAGE_BIT, RD::TEXTURE_SAMPLES_1, p_ssr_buffers.size);
}
-void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const RID *p_diffuse_slices, const RID *p_normal_roughness_slices, const RID *p_metallic_slices, const RID *p_depth_slices, const Size2i &p_screen_size, int p_max_steps, float p_fade_in, float p_fade_out, float p_tolerance, const uint32_t p_view_count, const Projection *p_projections, const Vector3 *p_eye_offsets) {
+void SSEffects::screen_space_reflection(Ref<RenderSceneBuffersRD> p_render_buffers, SSRRenderBuffers &p_ssr_buffers, const RID *p_normal_roughness_slices, const RID *p_metallic_slices, int p_max_steps, float p_fade_in, float p_fade_out, float p_tolerance, const Projection *p_projections, const Vector3 *p_eye_offsets) {
UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton();
ERR_FAIL_NULL(uniform_set_cache);
MaterialStorage *material_storage = MaterialStorage::get_singleton();
ERR_FAIL_NULL(material_storage);
+ uint32_t view_count = p_render_buffers->get_view_count();
+
RID default_sampler = material_storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
{
@@ -1546,7 +1364,7 @@ void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const R
ssr.ubo = RD::get_singleton()->uniform_buffer_create(sizeof(ScreenSpaceReflectionSceneData));
}
- for (uint32_t v = 0; v < p_view_count; v++) {
+ for (uint32_t v = 0; v < view_count; v++) {
store_camera(p_projections[v], scene_data.projection[v]);
store_camera(p_projections[v].inverse(), scene_data.inv_projection[v]);
scene_data.eye_offset[v][0] = p_eye_offsets[v].x;
@@ -1559,13 +1377,27 @@ void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const R
}
uint32_t pipeline_specialization = 0;
- if (p_view_count > 1) {
+ if (view_count > 1) {
pipeline_specialization |= SSR_MULTIVIEW;
}
RD::ComputeListID compute_list = RD::get_singleton()->compute_list_begin();
- for (uint32_t v = 0; v < p_view_count; v++) {
+ for (uint32_t v = 0; v < view_count; v++) {
+ // get buffers we need to use for this view
+ RID diffuse_slice = p_render_buffers->get_internal_texture(v);
+ RID depth_slice = p_render_buffers->get_depth_texture(v);
+ RID depth_scaled = p_render_buffers->get_texture(RB_SCOPE_SSR, RB_DEPTH_SCALED);
+ RID normal_scaled = p_render_buffers->get_texture(RB_SCOPE_SSR, RB_NORMAL_SCALED);
+ RID intermediate = p_render_buffers->get_texture(RB_SCOPE_SSR, RB_INTERMEDIATE);
+ RID output = p_render_buffers->get_texture_slice(RB_SCOPE_SSR, RB_OUTPUT, v, 0);
+
+ RID blur_radius[2];
+ if (ssr_roughness_quality != RS::ENV_SSR_ROUGHNESS_QUALITY_DISABLED) {
+ blur_radius[0] = p_render_buffers->get_texture_slice(RB_SCOPE_SSR, RB_BLUR_RADIUS, 0, 0);
+ blur_radius[1] = p_render_buffers->get_texture_slice(RB_SCOPE_SSR, RB_BLUR_RADIUS, 1, 0);
+ }
+
RD::get_singleton()->draw_command_begin_label(String("SSR View ") + itos(v));
{ //scale color and depth to half
@@ -1577,34 +1409,29 @@ void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const R
push_constant.camera_z_near = p_projections[v].get_z_near();
push_constant.orthogonal = p_projections[v].is_orthogonal();
push_constant.filter = false; //enabling causes arctifacts
- push_constant.screen_size[0] = p_screen_size.x;
- push_constant.screen_size[1] = p_screen_size.y;
+ push_constant.screen_size[0] = p_ssr_buffers.size.x;
+ push_constant.screen_size[1] = p_ssr_buffers.size.y;
RID shader = ssr_scale.shader.version_get_shader(ssr_scale.shader_version, 0);
RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssr_scale.pipelines[pipeline_specialization]);
- RD::Uniform u_diffuse(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_diffuse_slices[v] }));
+ RD::Uniform u_diffuse(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, diffuse_slice }));
RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_diffuse), 0);
- RD::Uniform u_depth(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_depth_slices[v] }));
+ RD::Uniform u_depth(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, depth_slice }));
RD::Uniform u_normal_roughness(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 1, Vector<RID>({ default_sampler, p_normal_roughness_slices[v] }));
RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_depth, u_normal_roughness), 1);
- if (ssr_roughness_quality != RS::ENV_SSR_ROUGHNESS_QUALITY_DISABLED) {
- RD::Uniform u_output(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssr_buffers.output_slices[v] }));
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 2, u_output), 2);
- } else {
- RD::Uniform u_intermediate(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssr_buffers.intermediate }));
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 2, u_intermediate), 2);
- }
+ RD::Uniform u_intermediate(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ intermediate }));
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 2, u_intermediate), 2);
- RD::Uniform u_scale_depth(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssr_buffers.depth_scaled }));
- RD::Uniform u_scale_normal(RD::UNIFORM_TYPE_IMAGE, 1, Vector<RID>({ p_ssr_buffers.normal_scaled }));
+ RD::Uniform u_scale_depth(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ depth_scaled }));
+ RD::Uniform u_scale_normal(RD::UNIFORM_TYPE_IMAGE, 1, Vector<RID>({ normal_scaled }));
RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 3, u_scale_depth, u_scale_normal), 3);
RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(ScreenSpaceReflectionScalePushConstant));
- RD::get_singleton()->compute_list_dispatch_threads(compute_list, p_screen_size.width, p_screen_size.height, 1);
+ RD::get_singleton()->compute_list_dispatch_threads(compute_list, p_ssr_buffers.size.width, p_ssr_buffers.size.height, 1);
RD::get_singleton()->compute_list_add_barrier(compute_list);
@@ -1619,15 +1446,15 @@ void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const R
push_constant.camera_z_far = p_projections[v].get_z_far();
push_constant.camera_z_near = p_projections[v].get_z_near();
push_constant.orthogonal = p_projections[v].is_orthogonal();
- push_constant.screen_size[0] = p_screen_size.x;
- push_constant.screen_size[1] = p_screen_size.y;
+ push_constant.screen_size[0] = p_ssr_buffers.size.x;
+ push_constant.screen_size[1] = p_ssr_buffers.size.y;
push_constant.curve_fade_in = p_fade_in;
push_constant.distance_fade = p_fade_out;
push_constant.num_steps = p_max_steps;
push_constant.depth_tolerance = p_tolerance;
push_constant.use_half_res = true;
- push_constant.proj_info[0] = -2.0f / (p_screen_size.width * p_projections[v].columns[0][0]);
- push_constant.proj_info[1] = -2.0f / (p_screen_size.height * p_projections[v].columns[1][1]);
+ push_constant.proj_info[0] = -2.0f / (p_ssr_buffers.size.width * p_projections[v].columns[0][0]);
+ push_constant.proj_info[1] = -2.0f / (p_ssr_buffers.size.height * p_projections[v].columns[1][1]);
push_constant.proj_info[2] = (1.0f - p_projections[v].columns[0][2]) / p_projections[v].columns[0][0];
push_constant.proj_info[3] = (1.0f + p_projections[v].columns[1][2]) / p_projections[v].columns[1][1];
@@ -1639,35 +1466,30 @@ void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const R
RD::Uniform u_scene_data(RD::UNIFORM_TYPE_UNIFORM_BUFFER, 0, ssr.ubo);
RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 4, u_scene_data), 4);
+ // read from intermediate
+ RD::Uniform u_intermediate(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ intermediate }));
+ RD::Uniform u_scale_depth(RD::UNIFORM_TYPE_IMAGE, 1, Vector<RID>({ depth_scaled }));
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_intermediate, u_scale_depth), 0);
+
if (ssr_roughness_quality != RS::ENV_SSR_ROUGHNESS_QUALITY_DISABLED) {
- // read from output slices (our scale wrote into these)
- RD::Uniform u_output(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssr_buffers.output_slices[v] }));
- RD::Uniform u_scale_depth(RD::UNIFORM_TYPE_IMAGE, 1, Vector<RID>({ p_ssr_buffers.depth_scaled }));
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_output, u_scale_depth), 0);
-
- // write to intermediate (our roughness pass will output into output slices)
- RD::Uniform u_intermediate(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssr_buffers.intermediate }));
- RD::Uniform u_blur_radius(RD::UNIFORM_TYPE_IMAGE, 1, Vector<RID>({ p_ssr_buffers.blur_radius[0] }));
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_intermediate, u_blur_radius), 1);
+ // write to output and blur radius
+ RD::Uniform u_output(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ output }));
+ RD::Uniform u_blur_radius(RD::UNIFORM_TYPE_IMAGE, 1, Vector<RID>({ blur_radius[0] }));
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_output, u_blur_radius), 1);
} else {
- // read from intermediate (our scale wrote into these)
- RD::Uniform u_intermediate(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssr_buffers.intermediate }));
- RD::Uniform u_scale_depth(RD::UNIFORM_TYPE_IMAGE, 1, Vector<RID>({ p_ssr_buffers.depth_scaled }));
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_intermediate, u_scale_depth), 0);
-
- // We are not performing our blur so go directly to output.
- RD::Uniform u_output(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssr_buffers.output_slices[v] }));
+ // We are only writing output
+ RD::Uniform u_output(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ output }));
RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_output), 1);
}
- RD::Uniform u_scale_normal(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssr_buffers.normal_scaled }));
+ RD::Uniform u_scale_normal(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ normal_scaled }));
RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 2, u_scale_normal), 2);
RD::Uniform u_metallic(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_metallic_slices[v] }));
RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 3, u_metallic), 3);
RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(ScreenSpaceReflectionPushConstant));
- RD::get_singleton()->compute_list_dispatch_threads(compute_list, p_screen_size.width, p_screen_size.height, 1);
+ RD::get_singleton()->compute_list_dispatch_threads(compute_list, p_ssr_buffers.size.width, p_ssr_buffers.size.height, 1);
RD::get_singleton()->draw_command_end_label();
}
@@ -1682,8 +1504,8 @@ void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const R
push_constant.view_index = v;
push_constant.orthogonal = p_projections[v].is_orthogonal();
push_constant.edge_tolerance = Math::sin(Math::deg_to_rad(15.0));
- push_constant.proj_info[0] = -2.0f / (p_screen_size.width * p_projections[v].columns[0][0]);
- push_constant.proj_info[1] = -2.0f / (p_screen_size.height * p_projections[v].columns[1][1]);
+ push_constant.proj_info[0] = -2.0f / (p_ssr_buffers.size.width * p_projections[v].columns[0][0]);
+ push_constant.proj_info[1] = -2.0f / (p_ssr_buffers.size.height * p_projections[v].columns[1][1]);
push_constant.proj_info[2] = (1.0f - p_projections[v].columns[0][2]) / p_projections[v].columns[0][0];
push_constant.proj_info[3] = (1.0f + p_projections[v].columns[1][2]) / p_projections[v].columns[1][1];
push_constant.vertical = 0;
@@ -1698,8 +1520,8 @@ void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const R
push_constant.increment = 1;
}
- push_constant.screen_size[0] = p_screen_size.width;
- push_constant.screen_size[1] = p_screen_size.height;
+ push_constant.screen_size[0] = p_ssr_buffers.size.width;
+ push_constant.screen_size[1] = p_ssr_buffers.size.height;
// Horizontal pass
@@ -1709,25 +1531,25 @@ void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const R
RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssr_filter.pipelines[pipeline_specialization][mode]);
- RD::Uniform u_scene_data(RD::UNIFORM_TYPE_UNIFORM_BUFFER, 0, ssr.ubo);
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 4, u_scene_data), 4);
-
- RD::Uniform u_intermediate(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssr_buffers.intermediate }));
- RD::Uniform u_blur_radius(RD::UNIFORM_TYPE_IMAGE, 1, Vector<RID>({ p_ssr_buffers.blur_radius[0] }));
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_intermediate, u_blur_radius), 0);
+ RD::Uniform u_output(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ output }));
+ RD::Uniform u_blur_radius(RD::UNIFORM_TYPE_IMAGE, 1, Vector<RID>({ blur_radius[0] }));
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_output, u_blur_radius), 0);
- RD::Uniform u_scale_normal(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssr_buffers.normal_scaled }));
+ RD::Uniform u_scale_normal(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ normal_scaled }));
RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_scale_normal), 1);
- RD::Uniform u_output_blur(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssr_buffers.output_slices[v] }));
- RD::Uniform u_blur_radius2(RD::UNIFORM_TYPE_IMAGE, 1, Vector<RID>({ p_ssr_buffers.blur_radius[1] }));
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 2, u_output_blur, u_blur_radius2), 2);
+ RD::Uniform u_intermediate(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ intermediate }));
+ RD::Uniform u_blur_radius2(RD::UNIFORM_TYPE_IMAGE, 1, Vector<RID>({ blur_radius[1] }));
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 2, u_intermediate, u_blur_radius2), 2);
- RD::Uniform u_scale_depth(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssr_buffers.depth_scaled }));
+ RD::Uniform u_scale_depth(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ depth_scaled }));
RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 3, u_scale_depth), 3);
+ RD::Uniform u_scene_data(RD::UNIFORM_TYPE_UNIFORM_BUFFER, 0, ssr.ubo);
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 4, u_scene_data), 4);
+
RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(ScreenSpaceReflectionFilterPushConstant));
- RD::get_singleton()->compute_list_dispatch_threads(compute_list, p_screen_size.width, p_screen_size.height, 1);
+ RD::get_singleton()->compute_list_dispatch_threads(compute_list, p_ssr_buffers.size.width, p_ssr_buffers.size.height, 1);
RD::get_singleton()->compute_list_add_barrier(compute_list);
// Vertical pass
@@ -1739,16 +1561,16 @@ void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const R
push_constant.vertical = 1;
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_output_blur, u_blur_radius2), 0);
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_intermediate, u_blur_radius2), 0);
RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_scale_normal), 1);
- RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 2, u_intermediate), 2);
+ RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 2, u_output), 2);
RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 3, u_scale_depth), 3);
RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 4, u_scene_data), 4);
RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(ScreenSpaceReflectionFilterPushConstant));
- RD::get_singleton()->compute_list_dispatch_threads(compute_list, p_screen_size.width, p_screen_size.height, 1);
+ RD::get_singleton()->compute_list_dispatch_threads(compute_list, p_ssr_buffers.size.width, p_ssr_buffers.size.height, 1);
- if (v != p_view_count - 1) {
+ if (v != view_count - 1) {
RD::get_singleton()->compute_list_add_barrier(compute_list);
}
@@ -1761,36 +1583,6 @@ void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const R
RD::get_singleton()->compute_list_end();
}
-void SSEffects::ssr_free(SSRRenderBuffers &p_ssr_buffers) {
- for (uint32_t v = 0; v < RendererSceneRender::MAX_RENDER_VIEWS; v++) {
- p_ssr_buffers.output_slices[v] = RID();
- }
-
- if (p_ssr_buffers.output.is_valid()) {
- RD::get_singleton()->free(p_ssr_buffers.output);
- p_ssr_buffers.output = RID();
- }
-
- if (p_ssr_buffers.intermediate.is_valid()) {
- RD::get_singleton()->free(p_ssr_buffers.intermediate);
- p_ssr_buffers.intermediate = RID();
- }
-
- if (p_ssr_buffers.blur_radius[0].is_valid()) {
- RD::get_singleton()->free(p_ssr_buffers.blur_radius[0]);
- RD::get_singleton()->free(p_ssr_buffers.blur_radius[1]);
- p_ssr_buffers.blur_radius[0] = RID();
- p_ssr_buffers.blur_radius[1] = RID();
- }
-
- if (p_ssr_buffers.depth_scaled.is_valid()) {
- RD::get_singleton()->free(p_ssr_buffers.depth_scaled);
- p_ssr_buffers.depth_scaled = RID();
- RD::get_singleton()->free(p_ssr_buffers.normal_scaled);
- p_ssr_buffers.normal_scaled = RID();
- }
-}
-
/* Subsurface scattering */
void SSEffects::sss_set_quality(RS::SubSurfaceScatteringQuality p_quality) {
diff --git a/servers/rendering/renderer_rd/effects/ss_effects.h b/servers/rendering/renderer_rd/effects/ss_effects.h
index bac1d9b786..8585277e19 100644
--- a/servers/rendering/renderer_rd/effects/ss_effects.h
+++ b/servers/rendering/renderer_rd/effects/ss_effects.h
@@ -48,6 +48,26 @@
#include "servers/rendering/renderer_scene_render.h"
#include "servers/rendering_server.h"
+#define RB_SCOPE_SSDS SNAME("rb_ssds")
+#define RB_SCOPE_SSIL SNAME("rb_ssil")
+#define RB_SCOPE_SSAO SNAME("rb_ssao")
+#define RB_SCOPE_SSR SNAME("rb_ssr")
+
+#define RB_LINEAR_DEPTH SNAME("linear_depth")
+#define RB_FINAL SNAME("final")
+#define RB_LAST_FRAME SNAME("last_frame")
+#define RB_DEINTERLEAVED SNAME("deinterleaved")
+#define RB_DEINTERLEAVED_PONG SNAME("deinterleaved_pong")
+#define RB_EDGES SNAME("edges")
+#define RB_IMPORTANCE_MAP SNAME("importance_map")
+#define RB_IMPORTANCE_PONG SNAME("importance_pong")
+
+#define RB_DEPTH_SCALED SNAME("depth_scaled")
+#define RB_NORMAL_SCALED SNAME("normal_scaled")
+#define RB_BLUR_RADIUS SNAME("blur_radius")
+#define RB_INTERMEDIATE SNAME("intermediate")
+#define RB_OUTPUT SNAME("output")
+
class RenderSceneBuffersRD;
namespace RendererRD {
@@ -64,7 +84,7 @@ public:
/* SS Downsampler */
- void downsample_depth(RID p_depth_buffer, const Vector<RID> &p_depth_mipmaps, bool p_invalidate_uniform_set, Size2i p_full_screen_size, const Projection &p_projection);
+ void downsample_depth(Ref<RenderSceneBuffersRD> p_render_buffers, uint32_t p_view, const Projection &p_projection);
/* SSIL */
void ssil_set_quality(RS::EnvironmentSSILQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to);
@@ -75,23 +95,6 @@ public:
int buffer_height;
int half_buffer_width;
int half_buffer_height;
-
- RID ssil_final;
- RID deinterleaved;
- Vector<RID> deinterleaved_slices;
- RID pong;
- Vector<RID> pong_slices;
- RID edges;
- Vector<RID> edges_slices;
- RID importance_map[2];
- RID depth_texture_view;
-
- RID last_frame;
- Vector<RID> last_frame_slices;
-
- RID gather_uniform_set;
- RID importance_map_uniform_set;
- RID projection_uniform_set;
};
struct SSILSettings {
@@ -103,9 +106,8 @@ public:
Size2i full_screen_size;
};
- void ssil_allocate_buffers(SSILRenderBuffers &p_ssil_buffers, const SSILSettings &p_settings, RID p_linear_depth);
- void screen_space_indirect_lighting(SSILRenderBuffers &p_ssil_buffers, RID p_normal_buffer, const Projection &p_projection, const Projection &p_last_projection, const SSILSettings &p_settings);
- void ssil_free(SSILRenderBuffers &p_ssil_buffers);
+ void ssil_allocate_buffers(Ref<RenderSceneBuffersRD> p_render_buffers, SSILRenderBuffers &p_ssil_buffers, const SSILSettings &p_settings);
+ void screen_space_indirect_lighting(Ref<RenderSceneBuffersRD> p_render_buffers, SSILRenderBuffers &p_ssil_buffers, uint32_t p_view, RID p_normal_buffer, const Projection &p_projection, const Projection &p_last_projection, const SSILSettings &p_settings);
/* SSAO */
void ssao_set_quality(RS::EnvironmentSSAOQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to);
@@ -116,17 +118,6 @@ public:
int buffer_height;
int half_buffer_width;
int half_buffer_height;
-
- RID ao_deinterleaved;
- Vector<RID> ao_deinterleaved_slices;
- RID ao_pong;
- Vector<RID> ao_pong_slices;
- RID ao_final;
- RID importance_map[2];
- RID depth_texture_view;
-
- RID gather_uniform_set;
- RID importance_map_uniform_set;
};
struct SSAOSettings {
@@ -140,9 +131,8 @@ public:
Size2i full_screen_size;
};
- void ssao_allocate_buffers(SSAORenderBuffers &p_ssao_buffers, const SSAOSettings &p_settings, RID p_linear_depth);
- void generate_ssao(SSAORenderBuffers &p_ssao_buffers, RID p_normal_buffer, const Projection &p_projection, const SSAOSettings &p_settings);
- void ssao_free(SSAORenderBuffers &p_ssao_buffers);
+ void ssao_allocate_buffers(Ref<RenderSceneBuffersRD> p_render_buffers, SSAORenderBuffers &p_ssao_buffers, const SSAOSettings &p_settings);
+ void generate_ssao(Ref<RenderSceneBuffersRD> p_render_buffers, SSAORenderBuffers &p_ssao_buffers, uint32_t p_view, RID p_normal_buffer, const Projection &p_projection, const SSAOSettings &p_settings);
/* Screen Space Reflection */
void ssr_set_roughness_quality(RS::EnvironmentSSRRoughnessQuality p_quality);
@@ -150,18 +140,10 @@ public:
struct SSRRenderBuffers {
Size2i size;
RenderingServer::EnvironmentSSRRoughnessQuality roughness_quality = RenderingServer::ENV_SSR_ROUGHNESS_QUALITY_DISABLED;
-
- RID normal_scaled;
- RID depth_scaled;
- RID blur_radius[2];
- RID intermediate;
- RID output;
- RID output_slices[RendererSceneRender::MAX_RENDER_VIEWS];
};
- void ssr_allocate_buffers(SSRRenderBuffers &p_ssr_buffers, const RenderingDevice::DataFormat p_color_format, const Size2i &p_screen_size, const uint32_t p_view_count);
- void screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const RID *p_diffuse_slices, const RID *p_normal_roughness_slices, const RID *p_metallic_slices, const RID *p_depth_slices, const Size2i &p_screen_size, int p_max_steps, float p_fade_in, float p_fade_out, float p_tolerance, const uint32_t p_view_count, const Projection *p_projections, const Vector3 *p_eye_offsets);
- void ssr_free(SSRRenderBuffers &p_ssr_buffers);
+ void ssr_allocate_buffers(Ref<RenderSceneBuffersRD> p_render_buffers, SSRRenderBuffers &p_ssr_buffers, const RenderingDevice::DataFormat p_color_format);
+ void screen_space_reflection(Ref<RenderSceneBuffersRD> p_render_buffers, SSRRenderBuffers &p_ssr_buffers, const RID *p_normal_roughness_slices, const RID *p_metallic_slices, int p_max_steps, float p_fade_in, float p_fade_out, float p_tolerance, const Projection *p_projections, const Vector3 *p_eye_offsets);
/* subsurface scattering */
void sss_set_quality(RS::SubSurfaceScatteringQuality p_quality);
@@ -223,7 +205,6 @@ private:
SSEffectsDownsamplePushConstant downsample_push_constant;
SsEffectsDownsampleShaderRD downsample_shader;
RID downsample_shader_version;
- RID downsample_uniform_set;
bool used_half_size_last_frame = false;
bool used_mips_last_frame = false;
bool used_full_mips_last_frame = false;
@@ -332,7 +313,7 @@ private:
RID pipelines[SSIL_MAX];
} ssil;
- void gather_ssil(RD::ComputeListID p_compute_list, const Vector<RID> p_ssil_slices, const Vector<RID> p_edges_slices, const SSILSettings &p_settings, bool p_adaptive_base_pass, RID p_gather_uniform_set, RID p_importance_map_uniform_set, RID p_projection_uniform_set);
+ void gather_ssil(RD::ComputeListID p_compute_list, const RID *p_ssil_slices, const RID *p_edges_slices, const SSILSettings &p_settings, bool p_adaptive_base_pass, RID p_gather_uniform_set, RID p_importance_map_uniform_set, RID p_projection_uniform_set);
/* SSAO */
@@ -426,7 +407,7 @@ private:
RID pipelines[SSAO_MAX];
} ssao;
- void gather_ssao(RD::ComputeListID p_compute_list, const Vector<RID> p_ao_slices, const SSAOSettings &p_settings, bool p_adaptive_base_pass, RID p_gather_uniform_set, RID p_importance_map_uniform_set);
+ void gather_ssao(RD::ComputeListID p_compute_list, const RID *p_ao_slices, const SSAOSettings &p_settings, bool p_adaptive_base_pass, RID p_gather_uniform_set, RID p_importance_map_uniform_set);
/* Screen Space Reflection */
diff --git a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp
index 59e1f559c7..6d5e55ee6a 100644
--- a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp
+++ b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp
@@ -30,6 +30,7 @@
#include "render_forward_clustered.h"
#include "core/config/project_settings.h"
+#include "core/object/worker_thread_pool.h"
#include "servers/rendering/renderer_rd/framebuffer_cache_rd.h"
#include "servers/rendering/renderer_rd/renderer_compositor_rd.h"
#include "servers/rendering/renderer_rd/storage_rd/light_storage.h"
@@ -108,6 +109,10 @@ void RenderForwardClustered::RenderBufferDataForwardClustered::free_data() {
// JIC, should already have been cleared
if (render_buffers) {
render_buffers->clear_context(RB_SCOPE_FORWARD_CLUSTERED);
+ render_buffers->clear_context(RB_SCOPE_SSDS);
+ render_buffers->clear_context(RB_SCOPE_SSIL);
+ render_buffers->clear_context(RB_SCOPE_SSAO);
+ render_buffers->clear_context(RB_SCOPE_SSR);
}
if (cluster_builder) {
@@ -118,21 +123,6 @@ void RenderForwardClustered::RenderBufferDataForwardClustered::free_data() {
if (!render_sdfgi_uniform_set.is_null() && RD::get_singleton()->uniform_set_is_valid(render_sdfgi_uniform_set)) {
RD::get_singleton()->free(render_sdfgi_uniform_set);
}
-
- if (ss_effects_data.linear_depth.is_valid()) {
- RD::get_singleton()->free(ss_effects_data.linear_depth);
- ss_effects_data.linear_depth = RID();
- ss_effects_data.linear_depth_slices.clear();
- }
-
- if (ss_effects_data.downsample_uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(ss_effects_data.downsample_uniform_set)) {
- RD::get_singleton()->free(ss_effects_data.downsample_uniform_set);
- ss_effects_data.downsample_uniform_set = RID();
- }
-
- RenderForwardClustered::get_singleton()->get_ss_effects()->ssao_free(ss_effects_data.ssao);
- RenderForwardClustered::get_singleton()->get_ss_effects()->ssil_free(ss_effects_data.ssil);
- RenderForwardClustered::get_singleton()->get_ss_effects()->ssr_free(ss_effects_data.ssr);
}
void RenderForwardClustered::RenderBufferDataForwardClustered::configure(RenderSceneBuffersRD *p_render_buffers) {
@@ -1252,7 +1242,7 @@ void RenderForwardClustered::setup_added_decal(const Transform3D &p_transform, c
/* Render scene */
-void RenderForwardClustered::_process_ssao(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, RID p_normal_buffer, const Projection &p_projection) {
+void RenderForwardClustered::_process_ssao(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, const RID *p_normal_buffers, const Projection *p_projections) {
ERR_FAIL_NULL(ss_effects);
ERR_FAIL_COND(p_render_buffers.is_null());
ERR_FAIL_COND(p_environment.is_null());
@@ -1271,11 +1261,14 @@ void RenderForwardClustered::_process_ssao(Ref<RenderSceneBuffersRD> p_render_bu
settings.sharpness = environment_get_ssao_sharpness(p_environment);
settings.full_screen_size = p_render_buffers->get_internal_size();
- ss_effects->ssao_allocate_buffers(rb_data->ss_effects_data.ssao, settings, rb_data->ss_effects_data.linear_depth);
- ss_effects->generate_ssao(rb_data->ss_effects_data.ssao, p_normal_buffer, p_projection, settings);
+ ss_effects->ssao_allocate_buffers(p_render_buffers, rb_data->ss_effects_data.ssao, settings);
+
+ for (uint32_t v = 0; v < p_render_buffers->get_view_count(); v++) {
+ ss_effects->generate_ssao(p_render_buffers, rb_data->ss_effects_data.ssao, v, p_normal_buffers[v], p_projections[v], settings);
+ }
}
-void RenderForwardClustered::_process_ssil(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, RID p_normal_buffer, const Projection &p_projection, const Transform3D &p_transform) {
+void RenderForwardClustered::_process_ssil(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, const RID *p_normal_buffers, const Projection *p_projections, const Transform3D &p_transform) {
ERR_FAIL_NULL(ss_effects);
ERR_FAIL_COND(p_render_buffers.is_null());
ERR_FAIL_COND(p_environment.is_null());
@@ -1292,36 +1285,46 @@ void RenderForwardClustered::_process_ssil(Ref<RenderSceneBuffersRD> p_render_bu
settings.normal_rejection = environment_get_ssil_normal_rejection(p_environment);
settings.full_screen_size = p_render_buffers->get_internal_size();
- Projection correction;
- correction.set_depth_correction(true);
- Projection projection = correction * p_projection;
+ ss_effects->ssil_allocate_buffers(p_render_buffers, rb_data->ss_effects_data.ssil, settings);
+
Transform3D transform = p_transform;
transform.set_origin(Vector3(0.0, 0.0, 0.0));
- Projection last_frame_projection = rb_data->ss_effects_data.last_frame_projection * Projection(rb_data->ss_effects_data.last_frame_transform.affine_inverse()) * Projection(transform) * projection.inverse();
- ss_effects->ssil_allocate_buffers(rb_data->ss_effects_data.ssil, settings, rb_data->ss_effects_data.linear_depth);
- ss_effects->screen_space_indirect_lighting(rb_data->ss_effects_data.ssil, p_normal_buffer, p_projection, last_frame_projection, settings);
- rb_data->ss_effects_data.last_frame_projection = projection;
+ for (uint32_t v = 0; v < p_render_buffers->get_view_count(); v++) {
+ Projection correction;
+ correction.set_depth_correction(true);
+ Projection projection = correction * p_projections[v];
+ Projection last_frame_projection = rb_data->ss_effects_data.last_frame_projections[v] * Projection(rb_data->ss_effects_data.last_frame_transform.affine_inverse()) * Projection(transform) * projection.inverse();
+
+ ss_effects->screen_space_indirect_lighting(p_render_buffers, rb_data->ss_effects_data.ssil, v, p_normal_buffers[v], p_projections[v], last_frame_projection, settings);
+
+ rb_data->ss_effects_data.last_frame_projections[v] = projection;
+ }
rb_data->ss_effects_data.last_frame_transform = transform;
}
void RenderForwardClustered::_copy_framebuffer_to_ssil(Ref<RenderSceneBuffersRD> p_render_buffers) {
ERR_FAIL_COND(p_render_buffers.is_null());
- Ref<RenderBufferDataForwardClustered> rb_data = p_render_buffers->get_custom_data(RB_SCOPE_FORWARD_CLUSTERED);
- ERR_FAIL_COND(rb_data.is_null());
-
- if (rb_data->ss_effects_data.ssil.last_frame.is_valid()) {
+ if (p_render_buffers->has_texture(RB_SCOPE_SSIL, RB_LAST_FRAME)) {
Size2i size = p_render_buffers->get_internal_size();
- RID texture = p_render_buffers->get_internal_texture();
- copy_effects->copy_to_rect(texture, rb_data->ss_effects_data.ssil.last_frame, Rect2i(0, 0, size.x, size.y));
-
- int width = size.x;
- int height = size.y;
- for (int i = 0; i < rb_data->ss_effects_data.ssil.last_frame_slices.size() - 1; i++) {
- width = MAX(1, width >> 1);
- height = MAX(1, height >> 1);
- copy_effects->make_mipmap(rb_data->ss_effects_data.ssil.last_frame_slices[i], rb_data->ss_effects_data.ssil.last_frame_slices[i + 1], Size2i(width, height));
+ uint32_t mipmaps = p_render_buffers->get_texture_format(RB_SCOPE_SSIL, RB_LAST_FRAME).mipmaps;
+ for (uint32_t v = 0; v < p_render_buffers->get_view_count(); v++) {
+ RID source = p_render_buffers->get_internal_texture(v);
+ RID dest = p_render_buffers->get_texture_slice(RB_SCOPE_SSIL, RB_LAST_FRAME, v, 0);
+ copy_effects->copy_to_rect(source, dest, Rect2i(0, 0, size.x, size.y));
+
+ int width = size.x;
+ int height = size.y;
+ for (uint32_t m = 1; m < mipmaps; m++) {
+ width = MAX(1, width >> 1);
+ height = MAX(1, height >> 1);
+
+ source = dest;
+ dest = p_render_buffers->get_texture_slice(RB_SCOPE_SSIL, RB_LAST_FRAME, v, m);
+
+ copy_effects->make_mipmap(source, dest, Size2i(width, height));
+ }
}
}
}
@@ -1421,41 +1424,23 @@ void RenderForwardClustered::_pre_opaque_render(RenderDataRD *p_render_data, boo
}
if (rb_data.is_valid() && ss_effects) {
- if (p_use_ssao || p_use_ssil) {
- Size2i size = rb->get_internal_size();
+ // Note, in multiview we're allocating buffers for each eye/view we're rendering.
+ // This should allow most of the processing to happen in parallel even if we're doing
+ // drawcalls per eye/view. It will all sync up at the barrier.
- bool invalidate_uniform_set = false;
- if (rb_data->ss_effects_data.linear_depth.is_null()) {
- RD::TextureFormat tf;
- tf.format = RD::DATA_FORMAT_R16_SFLOAT;
- tf.texture_type = RD::TEXTURE_TYPE_2D_ARRAY;
- tf.width = (size.x + 1) / 2;
- tf.height = (size.y + 1) / 2;
- tf.mipmaps = 5;
- tf.array_layers = 4;
- tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT;
- rb_data->ss_effects_data.linear_depth = RD::get_singleton()->texture_create(tf, RD::TextureView());
- RD::get_singleton()->set_resource_name(rb_data->ss_effects_data.linear_depth, "SS Effects Depth");
- for (uint32_t i = 0; i < tf.mipmaps; i++) {
- RID slice = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), rb_data->ss_effects_data.linear_depth, 0, i, 1, RD::TEXTURE_SLICE_2D_ARRAY);
- rb_data->ss_effects_data.linear_depth_slices.push_back(slice);
- RD::get_singleton()->set_resource_name(slice, "SS Effects Depth Mip " + itos(i) + " ");
- }
- invalidate_uniform_set = true;
+ if (p_use_ssao || p_use_ssil) {
+ // Convert our depth buffer data to linear data in
+ for (uint32_t v = 0; v < rb->get_view_count(); v++) {
+ ss_effects->downsample_depth(rb, v, p_render_data->scene_data->view_projection[v]);
}
- RID depth_texture = rb->get_depth_texture();
- ss_effects->downsample_depth(depth_texture, rb_data->ss_effects_data.linear_depth_slices, invalidate_uniform_set, size, p_render_data->scene_data->cam_projection);
- }
-
- if (p_use_ssao) {
- // TODO make these proper stereo
- _process_ssao(rb, p_render_data->environment, p_normal_roughness_slices[0], p_render_data->scene_data->cam_projection);
- }
+ if (p_use_ssao) {
+ _process_ssao(rb, p_render_data->environment, p_normal_roughness_slices, p_render_data->scene_data->view_projection);
+ }
- if (p_use_ssil) {
- // TODO make these proper stereo
- _process_ssil(rb, p_render_data->environment, p_normal_roughness_slices[0], p_render_data->scene_data->cam_projection, p_render_data->scene_data->cam_transform);
+ if (p_use_ssil) {
+ _process_ssil(rb, p_render_data->environment, p_normal_roughness_slices, p_render_data->scene_data->view_projection, p_render_data->scene_data->cam_transform);
+ }
}
}
@@ -1514,17 +1499,11 @@ void RenderForwardClustered::_process_ssr(Ref<RenderSceneBuffersRD> p_render_buf
ERR_FAIL_COND(p_environment.is_null());
ERR_FAIL_COND(!environment_get_ssr_enabled(p_environment));
- Size2i half_size = Size2i(internal_size.x / 2, internal_size.y / 2);
- ss_effects->ssr_allocate_buffers(rb_data->ss_effects_data.ssr, _render_buffers_get_color_format(), half_size, view_count);
+ ss_effects->ssr_allocate_buffers(p_render_buffers, rb_data->ss_effects_data.ssr, _render_buffers_get_color_format());
+ ss_effects->screen_space_reflection(p_render_buffers, rb_data->ss_effects_data.ssr, p_normal_slices, p_metallic_slices, environment_get_ssr_max_steps(p_environment), environment_get_ssr_fade_in(p_environment), environment_get_ssr_fade_out(p_environment), environment_get_ssr_depth_tolerance(p_environment), p_projections, p_eye_offsets);
- RID texture_slices[RendererSceneRender::MAX_RENDER_VIEWS];
- RID depth_slices[RendererSceneRender::MAX_RENDER_VIEWS];
- for (uint32_t v = 0; v < view_count; v++) {
- texture_slices[v] = p_render_buffers->get_internal_texture(v);
- depth_slices[v] = p_render_buffers->get_depth_texture(v);
- }
- ss_effects->screen_space_reflection(rb_data->ss_effects_data.ssr, texture_slices, p_normal_slices, p_metallic_slices, depth_slices, half_size, environment_get_ssr_max_steps(p_environment), environment_get_ssr_fade_in(p_environment), environment_get_ssr_fade_out(p_environment), environment_get_ssr_depth_tolerance(p_environment), view_count, p_projections, p_eye_offsets);
- copy_effects->merge_specular(p_dest_framebuffer, p_specular_buffer, p_use_additive ? RID() : p_render_buffers->get_internal_texture(), rb_data->ss_effects_data.ssr.output, view_count);
+ RID output = p_render_buffers->get_texture(RB_SCOPE_SSR, RB_OUTPUT);
+ copy_effects->merge_specular(p_dest_framebuffer, p_specular_buffer, p_use_additive ? RID() : p_render_buffers->get_internal_texture(), output, view_count);
}
void RenderForwardClustered::_process_sss(Ref<RenderSceneBuffersRD> p_render_buffers, const Projection &p_camera) {
@@ -2129,14 +2108,16 @@ void RenderForwardClustered::_render_buffers_debug_draw(Ref<RenderSceneBuffersRD
RID render_target = p_render_buffers->get_render_target();
- if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_SSAO && rb_data->ss_effects_data.ssao.ao_final.is_valid()) {
+ if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_SSAO && p_render_buffers->has_texture(RB_SCOPE_SSAO, RB_FINAL)) {
+ RID final = p_render_buffers->get_texture_slice(RB_SCOPE_SSAO, RB_FINAL, 0, 0);
Size2i rtsize = texture_storage->render_target_get_size(render_target);
- copy_effects->copy_to_fb_rect(rb_data->ss_effects_data.ssao.ao_final, texture_storage->render_target_get_rd_framebuffer(render_target), Rect2(Vector2(), rtsize), false, true);
+ copy_effects->copy_to_fb_rect(final, texture_storage->render_target_get_rd_framebuffer(render_target), Rect2(Vector2(), rtsize), false, true);
}
- if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_SSIL && rb_data->ss_effects_data.ssil.ssil_final.is_valid()) {
+ if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_SSIL && p_render_buffers->has_texture(RB_SCOPE_SSIL, RB_FINAL)) {
+ RID final = p_render_buffers->get_texture_slice(RB_SCOPE_SSIL, RB_FINAL, 0, 0);
Size2i rtsize = texture_storage->render_target_get_size(render_target);
- copy_effects->copy_to_fb_rect(rb_data->ss_effects_data.ssil.ssil_final, texture_storage->render_target_get_rd_framebuffer(render_target), Rect2(Vector2(), rtsize), false, false);
+ copy_effects->copy_to_fb_rect(final, texture_storage->render_target_get_rd_framebuffer(render_target), Rect2(Vector2(), rtsize), false, false);
}
if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_GI_BUFFER && p_render_buffers->has_texture(RB_SCOPE_GI, RB_TEX_AMBIENT)) {
@@ -3058,7 +3039,7 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend
RD::Uniform u;
u.binding = 13;
u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
- RID aot = rb_data.is_valid() ? rb_data->get_ao_texture() : RID();
+ RID aot = rb.is_valid() && rb->has_texture(RB_SCOPE_SSAO, RB_FINAL) ? rb->get_texture(RB_SCOPE_SSAO, RB_FINAL) : RID();
RID texture = aot.is_valid() ? aot : texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK);
u.append_id(texture);
uniforms.push_back(u);
@@ -3144,7 +3125,7 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend
RD::Uniform u;
u.binding = 20;
u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
- RID ssil = rb_data.is_valid() ? rb_data->get_ssil_texture() : RID();
+ RID ssil = rb.is_valid() && rb->has_texture(RB_SCOPE_SSIL, RB_FINAL) ? rb->get_texture(RB_SCOPE_SSIL, RB_FINAL) : RID();
RID texture = ssil.is_valid() ? ssil : texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK);
u.append_id(texture);
uniforms.push_back(u);
diff --git a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h
index 8eb17ba6f4..e07d2f2258 100644
--- a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h
+++ b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h
@@ -104,16 +104,11 @@ class RenderForwardClustered : public RendererSceneRenderRD {
ClusterBuilderRD *cluster_builder = nullptr;
struct SSEffectsData {
- RID linear_depth;
- Vector<RID> linear_depth_slices;
-
- RID downsample_uniform_set;
-
- Projection last_frame_projection;
+ Projection last_frame_projections[RendererSceneRender::MAX_RENDER_VIEWS];
Transform3D last_frame_transform;
- RendererRD::SSEffects::SSAORenderBuffers ssao;
RendererRD::SSEffects::SSILRenderBuffers ssil;
+ RendererRD::SSEffects::SSAORenderBuffers ssao;
RendererRD::SSEffects::SSRRenderBuffers ssr;
} ss_effects_data;
@@ -155,9 +150,6 @@ class RenderForwardClustered : public RendererSceneRenderRD {
RID get_depth_fb(DepthFrameBufferType p_type = DEPTH_FB);
RID get_specular_only_fb();
- RID get_ao_texture() const { return ss_effects_data.ssao.ao_final; }
- RID get_ssil_texture() const { return ss_effects_data.ssil.ssil_final; }
-
virtual void configure(RenderSceneBuffersRD *p_render_buffers) override;
virtual void free_data() override;
};
@@ -600,8 +592,8 @@ class RenderForwardClustered : public RendererSceneRenderRD {
void _render_shadow_end(uint32_t p_barrier = RD::BARRIER_MASK_ALL_BARRIERS);
/* Render Scene */
- void _process_ssao(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, RID p_normal_buffer, const Projection &p_projection);
- void _process_ssil(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, RID p_normal_buffer, const Projection &p_projection, const Transform3D &p_transform);
+ void _process_ssao(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, const RID *p_normal_buffers, const Projection *p_projections);
+ void _process_ssil(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, const RID *p_normal_buffers, const Projection *p_projections, const Transform3D &p_transform);
void _copy_framebuffer_to_ssil(Ref<RenderSceneBuffersRD> p_render_buffers);
void _pre_opaque_render(RenderDataRD *p_render_data, bool p_use_ssao, bool p_use_ssil, bool p_use_gi, const RID *p_normal_roughness_slices, RID p_voxel_gi_buffer);
void _process_ssr(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_dest_framebuffer, const RID *p_normal_buffer_slices, RID p_specular_buffer, const RID *p_metallic_slices, RID p_environment, const Projection *p_projections, const Vector3 *p_eye_offsets, bool p_use_additive);
diff --git a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp
index f9529de6dd..45fe067a6f 100644
--- a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp
+++ b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp
@@ -30,6 +30,7 @@
#include "render_forward_mobile.h"
#include "core/config/project_settings.h"
+#include "core/object/worker_thread_pool.h"
#include "servers/rendering/renderer_rd/storage_rd/light_storage.h"
#include "servers/rendering/renderer_rd/storage_rd/mesh_storage.h"
#include "servers/rendering/renderer_rd/storage_rd/particles_storage.h"
diff --git a/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp b/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp
index 5776414b14..efd961fd89 100644
--- a/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp
+++ b/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp
@@ -1110,6 +1110,8 @@ float RendererSceneRenderRD::screen_space_roughness_limiter_get_limit() const {
}
TypedArray<Image> RendererSceneRenderRD::bake_render_uv2(RID p_base, const TypedArray<RID> &p_material_overrides, const Size2i &p_image_size) {
+ ERR_FAIL_COND_V_MSG(p_image_size.width <= 0, TypedArray<Image>(), "Image width must be greater than 0.");
+ ERR_FAIL_COND_V_MSG(p_image_size.height <= 0, TypedArray<Image>(), "Image height must be greater than 0.");
RD::TextureFormat tf;
tf.format = RD::DATA_FORMAT_R8G8B8A8_UNORM;
tf.width = p_image_size.width; // Always 64x64
diff --git a/servers/rendering/renderer_rd/shader_rd.cpp b/servers/rendering/renderer_rd/shader_rd.cpp
index 533a912a34..c85ece6366 100644
--- a/servers/rendering/renderer_rd/shader_rd.cpp
+++ b/servers/rendering/renderer_rd/shader_rd.cpp
@@ -33,6 +33,7 @@
#include "core/io/compression.h"
#include "core/io/dir_access.h"
#include "core/io/file_access.h"
+#include "core/object/worker_thread_pool.h"
#include "core/version.h"
#include "renderer_compositor_rd.h"
#include "servers/rendering/rendering_device.h"
diff --git a/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl b/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl
index 21fa7fa148..c8ad1f0312 100644
--- a/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl
+++ b/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl
@@ -1390,7 +1390,11 @@ void fragment_shader(in SceneData scene_data) {
#endif // !USE_LIGHTMAP
if (bool(implementation_data.ss_effects_flags & SCREEN_SPACE_EFFECTS_FLAGS_USE_SSAO)) {
+#ifdef USE_MULTIVIEW
+ float ssao = texture(sampler2DArray(ao_buffer, material_samplers[SAMPLER_LINEAR_CLAMP]), vec3(screen_uv, ViewIndex)).r;
+#else
float ssao = texture(sampler2D(ao_buffer, material_samplers[SAMPLER_LINEAR_CLAMP]), screen_uv).r;
+#endif
ao = min(ao, ssao);
ao_light_affect = mix(ao_light_affect, max(ao_light_affect, implementation_data.ssao_light_affect), implementation_data.ssao_ao_affect);
}
@@ -1473,7 +1477,11 @@ void fragment_shader(in SceneData scene_data) {
ambient_light *= ao;
if (bool(implementation_data.ss_effects_flags & SCREEN_SPACE_EFFECTS_FLAGS_USE_SSIL)) {
+#ifdef USE_MULTIVIEW
+ vec4 ssil = textureLod(sampler2DArray(ssil_buffer, material_samplers[SAMPLER_LINEAR_CLAMP]), vec3(screen_uv, ViewIndex), 0.0);
+#else
vec4 ssil = textureLod(sampler2D(ssil_buffer, material_samplers[SAMPLER_LINEAR_CLAMP]), screen_uv, 0.0);
+#endif // USE_MULTIVIEW
ambient_light *= 1.0 - ssil.a;
ambient_light += ssil.rgb * albedo.rgb;
}
diff --git a/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered_inc.glsl b/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered_inc.glsl
index 8ff7a784dc..043bba1e4e 100644
--- a/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered_inc.glsl
+++ b/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered_inc.glsl
@@ -275,6 +275,7 @@ layout(r32ui, set = 1, binding = 13) uniform restrict uimage3D geom_facing_grid;
layout(set = 1, binding = 10) uniform texture2DArray depth_buffer;
layout(set = 1, binding = 11) uniform texture2DArray color_buffer;
layout(set = 1, binding = 12) uniform texture2DArray normal_roughness_buffer;
+layout(set = 1, binding = 13) uniform texture2DArray ao_buffer;
layout(set = 1, binding = 14) uniform texture2DArray ambient_buffer;
layout(set = 1, binding = 15) uniform texture2DArray reflection_buffer;
#define multiviewSampler sampler2DArray
@@ -282,11 +283,11 @@ layout(set = 1, binding = 15) uniform texture2DArray reflection_buffer;
layout(set = 1, binding = 10) uniform texture2D depth_buffer;
layout(set = 1, binding = 11) uniform texture2D color_buffer;
layout(set = 1, binding = 12) uniform texture2D normal_roughness_buffer;
+layout(set = 1, binding = 13) uniform texture2D ao_buffer;
layout(set = 1, binding = 14) uniform texture2D ambient_buffer;
layout(set = 1, binding = 15) uniform texture2D reflection_buffer;
#define multiviewSampler sampler2D
#endif
-layout(set = 1, binding = 13) uniform texture2D ao_buffer;
layout(set = 1, binding = 16) uniform texture2DArray sdfgi_lightprobe_texture;
layout(set = 1, binding = 17) uniform texture3D sdfgi_occlusion_cascades;
@@ -312,7 +313,11 @@ voxel_gi_instances;
layout(set = 1, binding = 19) uniform texture3D volumetric_fog_texture;
+#ifdef USE_MULTIVIEW
+layout(set = 1, binding = 20) uniform texture2DArray ssil_buffer;
+#else
layout(set = 1, binding = 20) uniform texture2D ssil_buffer;
+#endif // USE_MULTIVIEW
#endif
diff --git a/servers/rendering/renderer_rd/storage_rd/material_storage.cpp b/servers/rendering/renderer_rd/storage_rd/material_storage.cpp
index d631a89dd2..6f67d628a9 100644
--- a/servers/rendering/renderer_rd/storage_rd/material_storage.cpp
+++ b/servers/rendering/renderer_rd/storage_rd/material_storage.cpp
@@ -2803,6 +2803,7 @@ void MaterialStorage::material_set_render_priority(RID p_material, int priority)
if (material->data) {
material->data->set_render_priority(priority);
}
+ material->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MATERIAL);
}
bool MaterialStorage::material_is_animated(RID p_material) {
diff --git a/servers/rendering/renderer_scene_cull.cpp b/servers/rendering/renderer_scene_cull.cpp
index 7d2cd12959..813c1fa4ff 100644
--- a/servers/rendering/renderer_scene_cull.cpp
+++ b/servers/rendering/renderer_scene_cull.cpp
@@ -31,6 +31,7 @@
#include "renderer_scene_cull.h"
#include "core/config/project_settings.h"
+#include "core/object/worker_thread_pool.h"
#include "core/os/os.h"
#include "rendering_server_default.h"
#include "rendering_server_globals.h"
diff --git a/servers/rendering/renderer_viewport.cpp b/servers/rendering/renderer_viewport.cpp
index aecd0593bc..0e2a3c682d 100644
--- a/servers/rendering/renderer_viewport.cpp
+++ b/servers/rendering/renderer_viewport.cpp
@@ -31,6 +31,7 @@
#include "renderer_viewport.h"
#include "core/config/project_settings.h"
+#include "core/object/worker_thread_pool.h"
#include "renderer_canvas_cull.h"
#include "renderer_scene_cull.h"
#include "rendering_server_globals.h"
@@ -229,6 +230,7 @@ void RendererViewport::_draw_viewport(Viewport *p_viewport) {
bool scenario_draw_canvas_bg = false; //draw canvas, or some layer of it, as BG for 3D instead of in front
int scenario_canvas_max_layer = 0;
+ bool force_clear_render_target = false;
for (int i = 0; i < RS::VIEWPORT_RENDER_INFO_TYPE_MAX; i++) {
for (int j = 0; j < RS::VIEWPORT_RENDER_INFO_MAX; j++) {
@@ -236,11 +238,16 @@ void RendererViewport::_draw_viewport(Viewport *p_viewport) {
}
}
- if (!p_viewport->disable_2d && !viewport_is_environment_disabled(p_viewport) && RSG::scene->is_scenario(p_viewport->scenario)) {
+ if (RSG::scene->is_scenario(p_viewport->scenario)) {
RID environment = RSG::scene->scenario_get_environment(p_viewport->scenario);
if (RSG::scene->is_environment(environment)) {
- scenario_draw_canvas_bg = RSG::scene->environment_get_background(environment) == RS::ENV_BG_CANVAS;
- scenario_canvas_max_layer = RSG::scene->environment_get_canvas_max_layer(environment);
+ if (!p_viewport->disable_2d && !viewport_is_environment_disabled(p_viewport)) {
+ scenario_draw_canvas_bg = RSG::scene->environment_get_background(environment) == RS::ENV_BG_CANVAS;
+ scenario_canvas_max_layer = RSG::scene->environment_get_canvas_max_layer(environment);
+ } else if (RSG::scene->environment_get_background(environment) == RS::ENV_BG_CANVAS) {
+ // The scene renderer will still copy over the last frame, so we need to clear the render target.
+ force_clear_render_target = true;
+ }
}
}
@@ -263,6 +270,9 @@ void RendererViewport::_draw_viewport(Viewport *p_viewport) {
}
if (!scenario_draw_canvas_bg && can_draw_3d) {
+ if (force_clear_render_target) {
+ RSG::texture_storage->render_target_do_clear_request(p_viewport->render_target);
+ }
_draw_3d(p_viewport);
}
@@ -844,7 +854,7 @@ void RendererViewport::viewport_set_scaling_3d_scale(RID p_viewport, float p_sca
}
void RendererViewport::viewport_set_size(RID p_viewport, int p_width, int p_height) {
- ERR_FAIL_COND(p_width < 0 && p_height < 0);
+ ERR_FAIL_COND(p_width < 0 || p_height < 0);
Viewport *viewport = viewport_owner.get_or_null(p_viewport);
ERR_FAIL_COND(!viewport);
diff --git a/servers/rendering/rendering_device.cpp b/servers/rendering/rendering_device.cpp
index 28f872761a..286d1b683f 100644
--- a/servers/rendering/rendering_device.cpp
+++ b/servers/rendering/rendering_device.cpp
@@ -746,7 +746,7 @@ void RenderingDevice::_bind_methods() {
ClassDB::bind_method(D_METHOD("buffer_update", "buffer", "offset", "size_bytes", "data", "post_barrier"), &RenderingDevice::_buffer_update, DEFVAL(BARRIER_MASK_ALL_BARRIERS));
ClassDB::bind_method(D_METHOD("buffer_clear", "buffer", "offset", "size_bytes", "post_barrier"), &RenderingDevice::buffer_clear, DEFVAL(BARRIER_MASK_ALL_BARRIERS));
- ClassDB::bind_method(D_METHOD("buffer_get_data", "buffer"), &RenderingDevice::buffer_get_data);
+ ClassDB::bind_method(D_METHOD("buffer_get_data", "buffer", "offset_bytes", "size_bytes"), &RenderingDevice::buffer_get_data, DEFVAL(0), DEFVAL(0));
ClassDB::bind_method(D_METHOD("render_pipeline_create", "shader", "framebuffer_format", "vertex_format", "primitive", "rasterization_state", "multisample_state", "stencil_state", "color_blend_state", "dynamic_state_flags", "for_render_pass", "specialization_constants"), &RenderingDevice::_render_pipeline_create, DEFVAL(0), DEFVAL(0), DEFVAL(TypedArray<RDPipelineSpecializationConstant>()));
ClassDB::bind_method(D_METHOD("render_pipeline_is_valid", "render_pipeline"), &RenderingDevice::render_pipeline_is_valid);
diff --git a/servers/rendering/rendering_device.h b/servers/rendering/rendering_device.h
index 9117669124..447627b08e 100644
--- a/servers/rendering/rendering_device.h
+++ b/servers/rendering/rendering_device.h
@@ -828,7 +828,7 @@ public:
virtual Error buffer_update(RID p_buffer, uint32_t p_offset, uint32_t p_size, const void *p_data, BitField<BarrierMask> p_post_barrier = BARRIER_MASK_ALL_BARRIERS) = 0;
virtual Error buffer_clear(RID p_buffer, uint32_t p_offset, uint32_t p_size, BitField<BarrierMask> p_post_barrier = BARRIER_MASK_ALL_BARRIERS) = 0;
- virtual Vector<uint8_t> buffer_get_data(RID p_buffer) = 0; //this causes stall, only use to retrieve large buffers for saving
+ virtual Vector<uint8_t> buffer_get_data(RID p_buffer, uint32_t p_offset = 0, uint32_t p_size = 0) = 0; // This causes stall, only use to retrieve large buffers for saving.
/******************************************/
/**** PIPELINE SPECIALIZATION CONSTANT ****/
diff --git a/servers/rendering/rendering_server_default.h b/servers/rendering/rendering_server_default.h
index 4f52a63b2f..a3bdf7d146 100644
--- a/servers/rendering/rendering_server_default.h
+++ b/servers/rendering/rendering_server_default.h
@@ -31,6 +31,7 @@
#ifndef RENDERING_SERVER_DEFAULT_H
#define RENDERING_SERVER_DEFAULT_H
+#include "core/os/thread.h"
#include "core/templates/command_queue_mt.h"
#include "core/templates/hash_map.h"
#include "renderer_canvas_cull.h"
diff --git a/servers/rendering/shader_compiler.cpp b/servers/rendering/shader_compiler.cpp
index 2710724066..8737d3b217 100644
--- a/servers/rendering/shader_compiler.cpp
+++ b/servers/rendering/shader_compiler.cpp
@@ -1151,6 +1151,9 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene
bool is_texture_func = false;
bool is_screen_texture = false;
+ bool texture_func_no_uv = false;
+ bool texture_func_returns_data = false;
+
if (onode->op == SL::OP_STRUCT) {
code += _mkid(vnode->name);
} else if (onode->op == SL::OP_CONSTRUCT) {
@@ -1164,6 +1167,8 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene
if (is_internal_func) {
code += vnode->name;
is_texture_func = texture_functions.has(vnode->name);
+ texture_func_no_uv = (vnode->name == "textureSize" || vnode->name == "textureQueryLevels");
+ texture_func_returns_data = texture_func_no_uv || vnode->name == "textureQueryLod";
} else if (p_default_actions.renames.has(vnode->name)) {
code += p_default_actions.renames[vnode->name];
} else {
@@ -1313,7 +1318,7 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene
} else {
code += node_code;
}
- } else if (multiview_uv_needed && i == 2) {
+ } else if (multiview_uv_needed && !texture_func_no_uv && i == 2) {
// UV coordinate after using color, depth or normal roughness texture.
node_code = "multiview_uv(" + node_code + ".xy)";
@@ -1323,7 +1328,7 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene
}
}
code += ")";
- if (is_screen_texture && actions.apply_luminance_multiplier) {
+ if (is_screen_texture && !texture_func_returns_data && actions.apply_luminance_multiplier) {
code = "(" + code + " * vec4(vec3(sc_luminance_multiplier), 1.0))";
}
} break;
diff --git a/servers/rendering_server.cpp b/servers/rendering_server.cpp
index 848b6d01d4..3d0443b494 100644
--- a/servers/rendering_server.cpp
+++ b/servers/rendering_server.cpp
@@ -31,6 +31,7 @@
#include "rendering_server.h"
#include "core/config/project_settings.h"
+#include "core/object/worker_thread_pool.h"
#include "core/variant/typed_array.h"
#include "servers/rendering/rendering_server_globals.h"
#include "servers/rendering/shader_language.h"
@@ -2855,8 +2856,8 @@ RenderingServer::RenderingServer() {
}
void RenderingServer::init() {
- GLOBAL_DEF_RST("rendering/textures/vram_compression/import_s3tc_bptc", OS::get_singleton()->get_preferred_texture_format() == OS::PREFERRED_TEXTURE_FORMAT_S3TC_BPTC);
- GLOBAL_DEF_RST("rendering/textures/vram_compression/import_etc2_astc", OS::get_singleton()->get_preferred_texture_format() == OS::PREFERRED_TEXTURE_FORMAT_ETC2_ASTC);
+ GLOBAL_DEF_RST_NOVAL_BASIC("rendering/textures/vram_compression/import_s3tc_bptc", OS::get_singleton()->get_preferred_texture_format() == OS::PREFERRED_TEXTURE_FORMAT_S3TC_BPTC);
+ GLOBAL_DEF_RST_NOVAL_BASIC("rendering/textures/vram_compression/import_etc2_astc", OS::get_singleton()->get_preferred_texture_format() == OS::PREFERRED_TEXTURE_FORMAT_ETC2_ASTC);
GLOBAL_DEF("rendering/textures/lossless_compression/force_png", false);
diff --git a/servers/rendering_server.h b/servers/rendering_server.h
index 1f9bff7c3f..b53b7d2ff9 100644
--- a/servers/rendering_server.h
+++ b/servers/rendering_server.h
@@ -35,7 +35,6 @@
#include "core/math/geometry_3d.h"
#include "core/math/transform_2d.h"
#include "core/object/class_db.h"
-#include "core/object/worker_thread_pool.h"
#include "core/templates/rid.h"
#include "core/variant/typed_array.h"
#include "core/variant/variant.h"
diff --git a/tests/core/math/test_vector3.h b/tests/core/math/test_vector3.h
index c3488954ce..ca0aa02882 100644
--- a/tests/core/math/test_vector3.h
+++ b/tests/core/math/test_vector3.h
@@ -354,6 +354,14 @@ TEST_CASE("[Vector3] Other methods") {
CHECK_MESSAGE(
vector.snapped(Vector3(0.25, 0.25, 0.25)) == Vector3(1.25, 3.5, 5.5),
"Vector3 snapped to 0.25 should give exact results.");
+
+ CHECK_MESSAGE(
+ Vector3(1.2, 2.5, 2.0).is_equal_approx(vector.min(Vector3(3.0, 2.5, 2.0))),
+ "Vector3 min should return expected value.");
+
+ CHECK_MESSAGE(
+ Vector3(5.3, 3.4, 5.6).is_equal_approx(vector.max(Vector3(5.3, 2.0, 3.0))),
+ "Vector3 max should return expected value.");
}
TEST_CASE("[Vector3] Plane methods") {
diff --git a/tests/core/math/test_vector3i.h b/tests/core/math/test_vector3i.h
index 6eef129a36..485a500715 100644
--- a/tests/core/math/test_vector3i.h
+++ b/tests/core/math/test_vector3i.h
@@ -131,6 +131,13 @@ TEST_CASE("[Vector3i] Other methods") {
const Vector3i vector = Vector3i(1, 3, -7);
CHECK_MESSAGE(
+ vector.min(Vector3i(3, 2, 5)) == Vector3i(1, 2, -7),
+ "Vector3i min should return expected value.");
+ CHECK_MESSAGE(
+ vector.max(Vector3i(5, 2, 4)) == Vector3i(5, 3, 4),
+ "Vector3i max should return expected value.");
+
+ CHECK_MESSAGE(
vector.snapped(Vector3i(4, 2, 5)) == Vector3i(0, 4, -5),
"Vector3i snapped should work as expected.");
}
diff --git a/tests/core/math/test_vector4.h b/tests/core/math/test_vector4.h
index b85cc710e0..331e0fcfd5 100644
--- a/tests/core/math/test_vector4.h
+++ b/tests/core/math/test_vector4.h
@@ -255,6 +255,14 @@ TEST_CASE("[Vector4] Other methods") {
CHECK_MESSAGE(
vector.snapped(Vector4(0.25, 0.25, 0.25, 0.25)) == Vector4(1.25, 3.5, 5.5, 1.5),
"Vector4 snapped to 0.25 should give exact results.");
+
+ CHECK_MESSAGE(
+ Vector4(1.2, 2.5, 2.0, 1.6).is_equal_approx(vector.min(Vector4(3.0, 2.5, 2.0, 3.4))),
+ "Vector4 min should return expected value.");
+
+ CHECK_MESSAGE(
+ Vector4(5.3, 3.4, 5.6, 4.2).is_equal_approx(vector.max(Vector4(5.3, 2.0, 3.0, 4.2))),
+ "Vector4 max should return expected value.");
}
TEST_CASE("[Vector4] Rounding methods") {
diff --git a/tests/core/math/test_vector4i.h b/tests/core/math/test_vector4i.h
index e5b47af7c4..5fda6f1778 100644
--- a/tests/core/math/test_vector4i.h
+++ b/tests/core/math/test_vector4i.h
@@ -134,6 +134,14 @@ TEST_CASE("[Vector3i] Other methods") {
const Vector4i vector = Vector4i(1, 3, -7, 13);
CHECK_MESSAGE(
+ vector.min(Vector4i(3, 2, 5, 8)) == Vector4i(1, 2, -7, 8),
+ "Vector4i min should return expected value.");
+
+ CHECK_MESSAGE(
+ vector.max(Vector4i(5, 2, 4, 8)) == Vector4i(5, 3, 4, 13),
+ "Vector4i max should return expected value.");
+
+ CHECK_MESSAGE(
vector.snapped(Vector4i(4, 2, 5, 8)) == Vector4i(0, 4, -5, 16),
"Vector4i snapped should work as expected.");
}
diff --git a/tests/core/string/test_string.h b/tests/core/string/test_string.h
index 0cf3448a48..5d19b5a164 100644
--- a/tests/core/string/test_string.h
+++ b/tests/core/string/test_string.h
@@ -512,6 +512,14 @@ TEST_CASE("[String] Splitting") {
CHECK(l[i] == slices_3[i]);
}
+ s = "";
+ l = s.split();
+ CHECK(l.size() == 1);
+ CHECK(l[0] == "");
+
+ l = s.split("", false);
+ CHECK(l.size() == 0);
+
s = "Mars Jupiter Saturn Uranus";
const char *slices_s[4] = { "Mars", "Jupiter", "Saturn", "Uranus" };
l = s.split_spaces();
diff --git a/tests/display_server_mock.h b/tests/display_server_mock.h
index 1736f2c452..fe36fa0b69 100644
--- a/tests/display_server_mock.h
+++ b/tests/display_server_mock.h
@@ -42,6 +42,7 @@ private:
friend class DisplayServer;
Point2i mouse_position = Point2i(-1, -1); // Outside of Window.
+ CursorShape cursor_shape = CursorShape::CURSOR_ARROW;
bool window_over = false;
Callable event_callback;
Callable input_event_callback;
@@ -103,6 +104,7 @@ public:
bool has_feature(Feature p_feature) const override {
switch (p_feature) {
case FEATURE_MOUSE:
+ case FEATURE_CURSOR_SHAPE:
return true;
default: {
}
@@ -115,12 +117,24 @@ public:
// You can simulate DisplayServer-events by calling this function.
// The events will be deliverd to Godot's Input-system.
// Mouse-events (Button & Motion) will additionally update the DisplayServer's mouse position.
+ // For Mouse motion events, the `relative`-property is set based on the distance to the previous mouse position.
void simulate_event(Ref<InputEvent> p_event) {
+ Ref<InputEvent> event = p_event;
Ref<InputEventMouse> me = p_event;
if (me.is_valid()) {
+ Ref<InputEventMouseMotion> mm = p_event;
+ if (mm.is_valid()) {
+ mm->set_relative(mm->get_position() - mouse_position);
+ event = mm;
+ }
_set_mouse_position(me->get_position());
}
- Input::get_singleton()->parse_input_event(p_event);
+ Input::get_singleton()->parse_input_event(event);
+ }
+
+ // Returns the current cursor shape.
+ CursorShape get_cursor_shape() {
+ return cursor_shape;
}
virtual Point2i mouse_get_position() const override { return mouse_position; }
@@ -129,6 +143,10 @@ public:
return Size2i(1920, 1080);
}
+ virtual void cursor_set_shape(CursorShape p_shape) override {
+ cursor_shape = p_shape;
+ }
+
virtual void window_set_window_event_callback(const Callable &p_callable, WindowID p_window = MAIN_WINDOW_ID) override {
event_callback = p_callable;
}
diff --git a/tests/scene/test_text_edit.h b/tests/scene/test_text_edit.h
index d42ef8859a..64ad3bd5b0 100644
--- a/tests/scene/test_text_edit.h
+++ b/tests/scene/test_text_edit.h
@@ -1134,7 +1134,6 @@ TEST_CASE("[SceneTree][TextEdit] text entry") {
SUBCASE("[TextEdit] text drag") {
TextEdit *target_text_edit = memnew(TextEdit);
SceneTree::get_singleton()->get_root()->add_child(target_text_edit);
- text_edit->get_viewport()->set_embedding_subwindows(true); // Bypass display server for drop handling.
target_text_edit->set_size(Size2(200, 200));
target_text_edit->set_position(Point2(400, 0));
@@ -3083,8 +3082,6 @@ TEST_CASE("[SceneTree][TextEdit] context menu") {
TextEdit *text_edit = memnew(TextEdit);
SceneTree::get_singleton()->get_root()->add_child(text_edit);
- text_edit->get_viewport()->set_embedding_subwindows(true); // Bypass display server for drop handling.
-
text_edit->set_size(Size2(800, 200));
text_edit->set_line(0, "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec vasius mattis leo, sed porta ex lacinia bibendum. Nunc bibendum pellentesque.");
MessageQueue::get_singleton()->flush();
diff --git a/tests/scene/test_viewport.h b/tests/scene/test_viewport.h
new file mode 100644
index 0000000000..62f4635927
--- /dev/null
+++ b/tests/scene/test_viewport.h
@@ -0,0 +1,718 @@
+/**************************************************************************/
+/* test_viewport.h */
+/**************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/**************************************************************************/
+/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
+/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/**************************************************************************/
+
+#ifndef TEST_VIEWPORT_H
+#define TEST_VIEWPORT_H
+
+#include "scene/2d/node_2d.h"
+#include "scene/gui/control.h"
+#include "scene/main/window.h"
+
+#include "tests/test_macros.h"
+
+namespace TestViewport {
+
+class NotificationControl : public Control {
+ GDCLASS(NotificationControl, Control);
+
+protected:
+ void _notification(int p_what) {
+ switch (p_what) {
+ case NOTIFICATION_MOUSE_ENTER: {
+ mouse_over = true;
+ } break;
+
+ case NOTIFICATION_MOUSE_EXIT: {
+ mouse_over = false;
+ } break;
+ }
+ }
+
+public:
+ bool mouse_over = false;
+};
+
+// `NotificationControl`-derived class that additionally
+// - allows start Dragging
+// - stores mouse information of last event
+class DragStart : public NotificationControl {
+ GDCLASS(DragStart, NotificationControl);
+
+public:
+ MouseButton last_mouse_button;
+ Point2i last_mouse_move_position;
+ StringName drag_data_name = SNAME("Drag Data");
+
+ virtual Variant get_drag_data(const Point2 &p_point) override {
+ return drag_data_name;
+ }
+
+ virtual void gui_input(const Ref<InputEvent> &p_event) override {
+ Ref<InputEventMouseButton> mb = p_event;
+ if (mb.is_valid()) {
+ last_mouse_button = mb->get_button_index();
+ return;
+ }
+
+ Ref<InputEventMouseMotion> mm = p_event;
+ if (mm.is_valid()) {
+ last_mouse_move_position = mm->get_position();
+ return;
+ }
+ }
+};
+
+// `NotificationControl`-derived class that acts as a Drag and Drop target.
+class DragTarget : public NotificationControl {
+ GDCLASS(DragTarget, NotificationControl);
+
+public:
+ Variant drag_data;
+ virtual bool can_drop_data(const Point2 &p_point, const Variant &p_data) const override {
+ StringName string_data = p_data;
+ // Verify drag data is compatible.
+ if (string_data != SNAME("Drag Data")) {
+ return false;
+ }
+ // Only the left half is droppable area.
+ if (p_point.x * 2 > get_size().x) {
+ return false;
+ }
+ return true;
+ }
+
+ virtual void drop_data(const Point2 &p_point, const Variant &p_data) override {
+ drag_data = p_data;
+ }
+};
+
+TEST_CASE("[SceneTree][Viewport] Controls and InputEvent handling") {
+ DragStart *node_a = memnew(DragStart);
+ Control *node_b = memnew(Control);
+ Node2D *node_c = memnew(Node2D);
+ DragTarget *node_d = memnew(DragTarget);
+ Control *node_e = memnew(Control);
+ Node *node_f = memnew(Node);
+ Control *node_g = memnew(Control);
+
+ node_a->set_name(SNAME("NodeA"));
+ node_b->set_name(SNAME("NodeB"));
+ node_c->set_name(SNAME("NodeC"));
+ node_d->set_name(SNAME("NodeD"));
+ node_e->set_name(SNAME("NodeE"));
+ node_f->set_name(SNAME("NodeF"));
+ node_g->set_name(SNAME("NodeG"));
+
+ node_a->set_position(Point2i(0, 0));
+ node_b->set_position(Point2i(10, 10));
+ node_c->set_position(Point2i(0, 0));
+ node_d->set_position(Point2i(10, 10));
+ node_e->set_position(Point2i(10, 100));
+ node_g->set_position(Point2i(10, 100));
+ node_a->set_size(Point2i(30, 30));
+ node_b->set_size(Point2i(30, 30));
+ node_d->set_size(Point2i(30, 30));
+ node_e->set_size(Point2i(10, 10));
+ node_g->set_size(Point2i(10, 10));
+ node_a->set_focus_mode(Control::FOCUS_CLICK);
+ node_b->set_focus_mode(Control::FOCUS_CLICK);
+ node_d->set_focus_mode(Control::FOCUS_CLICK);
+ node_e->set_focus_mode(Control::FOCUS_CLICK);
+ node_g->set_focus_mode(Control::FOCUS_CLICK);
+ Window *root = SceneTree::get_singleton()->get_root();
+ DisplayServerMock *DS = (DisplayServerMock *)(DisplayServer::get_singleton());
+
+ // Scene tree:
+ // - root
+ // - a (Control)
+ // - b (Control)
+ // - c (Node2D)
+ // - d (Control)
+ // - e (Control)
+ // - f (Node)
+ // - g (Control)
+ root->add_child(node_a);
+ root->add_child(node_b);
+ node_b->add_child(node_c);
+ node_c->add_child(node_d);
+ root->add_child(node_e);
+ node_e->add_child(node_f);
+ node_f->add_child(node_g);
+
+ Point2i on_a = Point2i(5, 5);
+ Point2i on_b = Point2i(15, 15);
+ Point2i on_d = Point2i(25, 25);
+ Point2i on_e = Point2i(15, 105);
+ Point2i on_g = Point2i(15, 105);
+ Point2i on_background = Point2i(500, 500);
+ Point2i on_outside = Point2i(-1, -1);
+
+ // Unit tests for Viewport::gui_find_control and Viewport::_gui_find_control_at_pos
+ SUBCASE("[VIEWPORT][GuiFindControl] Finding Controls at a Viewport-position") {
+ // FIXME: It is extremely difficult to create a situation where the Control has a zero determinant.
+ // Leaving that if-branch untested.
+
+ SUBCASE("[VIEWPORT][GuiFindControl] Basic position tests") {
+ CHECK(root->gui_find_control(on_a) == node_a);
+ CHECK(root->gui_find_control(on_b) == node_b);
+ CHECK(root->gui_find_control(on_d) == node_d);
+ CHECK(root->gui_find_control(on_e) == node_g); // Node F makes G a Root Control at the same position as E
+ CHECK(root->gui_find_control(on_g) == node_g);
+ CHECK_FALSE(root->gui_find_control(on_background));
+ }
+
+ SUBCASE("[VIEWPORT][GuiFindControl] Invisible nodes are not considered as results.") {
+ // Non-Root Control
+ node_d->hide();
+ CHECK(root->gui_find_control(on_d) == node_b);
+ // Root Control
+ node_b->hide();
+ CHECK(root->gui_find_control(on_b) == node_a);
+ }
+
+ SUBCASE("[VIEWPORT][GuiFindControl] Root Control with CanvasItem as parent is affected by parent's transform.") {
+ node_b->remove_child(node_c);
+ node_c->set_position(Point2i(50, 50));
+ root->add_child(node_c);
+ CHECK(root->gui_find_control(Point2i(65, 65)) == node_d);
+ }
+
+ SUBCASE("[VIEWPORT][GuiFindControl] Control Contents Clipping clips accessible position of children.") {
+ CHECK_FALSE(node_b->is_clipping_contents());
+ CHECK(root->gui_find_control(on_d + Point2i(20, 20)) == node_d);
+ node_b->set_clip_contents(true);
+ CHECK(root->gui_find_control(on_d) == node_d);
+ CHECK_FALSE(root->gui_find_control(on_d + Point2i(20, 20)));
+ }
+
+ SUBCASE("[VIEWPORT][GuiFindControl] Top Level Control as descendant of CanvasItem isn't affected by parent's transform.") {
+ CHECK(root->gui_find_control(on_d + Point2i(20, 20)) == node_d);
+ node_d->set_as_top_level(true);
+ CHECK_FALSE(root->gui_find_control(on_d + Point2i(20, 20)));
+ CHECK(root->gui_find_control(on_b) == node_d);
+ }
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] nullptr as argument doesn't lead to a crash.") {
+ CHECK_NOTHROW(root->push_input(nullptr));
+ }
+
+ // Unit tests for Viewport::_gui_input_event (Mouse Buttons)
+ SUBCASE("[Viewport][GuiInputEvent] Mouse Button Down/Up.") {
+ SUBCASE("[Viewport][GuiInputEvent] Mouse Button Control Focus Change.") {
+ SUBCASE("[Viewport][GuiInputEvent] Grab Focus while no Control has focus.") {
+ CHECK_FALSE(root->gui_get_focus_owner());
+
+ // Click on A
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
+ CHECK(node_a->has_focus());
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] Grab Focus from other Control.") {
+ node_a->grab_focus();
+ CHECK(node_a->has_focus());
+
+ // Click on D
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_d, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
+ CHECK(node_d->has_focus());
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_d, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] Non-CanvasItem breaks Transform hierarchy.") {
+ CHECK_FALSE(root->gui_get_focus_owner());
+
+ // Click on G absolute coordinates
+ SEND_GUI_MOUSE_BUTTON_EVENT(Point2i(15, 105), MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
+ CHECK(node_g->has_focus());
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(Point2i(15, 105), MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] No Focus change when clicking in background.") {
+ CHECK_FALSE(root->gui_get_focus_owner());
+
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_background, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
+ CHECK_FALSE(root->gui_get_focus_owner());
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_background, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);
+
+ node_a->grab_focus();
+ CHECK(node_a->has_focus());
+
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_background, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_background, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);
+ CHECK(node_a->has_focus());
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] Mouse Button No Focus Steal while other Mouse Button is pressed.") {
+ CHECK_FALSE(root->gui_get_focus_owner());
+
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
+ CHECK(node_a->has_focus());
+
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_b, MouseButton::RIGHT, (int)MouseButtonMask::LEFT | (int)MouseButtonMask::RIGHT, Key::NONE);
+ CHECK(node_a->has_focus());
+
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_b, MouseButton::RIGHT, MouseButtonMask::LEFT, Key::NONE);
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_b, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);
+ CHECK(node_a->has_focus());
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] Allow Focus Steal with LMB while other Mouse Button is held down and was initially pressed without being over a Control.") {
+ // TODO: Not sure, if this is intended behavior, but this is an edge case.
+ CHECK_FALSE(root->gui_get_focus_owner());
+
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_background, MouseButton::RIGHT, MouseButtonMask::RIGHT, Key::NONE);
+ CHECK_FALSE(root->gui_get_focus_owner());
+
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_a, MouseButton::LEFT, (int)MouseButtonMask::LEFT | (int)MouseButtonMask::RIGHT, Key::NONE);
+ CHECK(node_a->has_focus());
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::RIGHT, Key::NONE);
+ CHECK(node_a->has_focus());
+
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_b, MouseButton::LEFT, (int)MouseButtonMask::LEFT | (int)MouseButtonMask::RIGHT, Key::NONE);
+ CHECK(node_b->has_focus());
+
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_d, MouseButton::LEFT, MouseButtonMask::RIGHT, Key::NONE);
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_d, MouseButton::RIGHT, MouseButtonMask::NONE, Key::NONE);
+ CHECK(node_b->has_focus());
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] Ignore Focus from Mouse Buttons when mouse-filter is set to ignore.") {
+ node_d->grab_focus();
+ node_d->set_mouse_filter(Control::MOUSE_FILTER_IGNORE);
+ CHECK(node_d->has_focus());
+
+ // Click on overlapping area B&D.
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_d, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
+ CHECK(node_b->has_focus());
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_d, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] RMB doesn't grab focus.") {
+ node_a->grab_focus();
+ CHECK(node_a->has_focus());
+
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_d, MouseButton::RIGHT, MouseButtonMask::RIGHT, Key::NONE);
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_d, MouseButton::RIGHT, MouseButtonMask::NONE, Key::NONE);
+ CHECK(node_a->has_focus());
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] LMB on unfocusable Control doesn't grab focus.") {
+ CHECK_FALSE(node_g->has_focus());
+ node_g->set_focus_mode(Control::FOCUS_NONE);
+
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_g, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_g, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);
+ CHECK_FALSE(node_g->has_focus());
+
+ // Now verify the opposite with FOCUS_CLICK
+ node_g->set_focus_mode(Control::FOCUS_CLICK);
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_g, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_g, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);
+ CHECK(node_g->has_focus());
+ node_g->set_focus_mode(Control::FOCUS_CLICK);
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] Signal 'gui_focus_changed' is only emitted if a previously unfocused Control grabs focus.") {
+ SIGNAL_WATCH(root, SNAME("gui_focus_changed"));
+ Array node_array;
+ node_array.push_back(node_a);
+ Array signal_args;
+ signal_args.push_back(node_array);
+
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);
+ SIGNAL_CHECK(SNAME("gui_focus_changed"), signal_args);
+
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);
+ CHECK(node_a->has_focus());
+ SIGNAL_CHECK_FALSE(SNAME("gui_focus_changed"));
+
+ SIGNAL_UNWATCH(root, SNAME("gui_focus_changed"));
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] Focus Propagation to parent items.") {
+ SUBCASE("[Viewport][GuiInputEvent] Unfocusable Control with MOUSE_FILTER_PASS propagates focus to parent CanvasItem.") {
+ node_d->set_focus_mode(Control::FOCUS_NONE);
+ node_d->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_d + Point2i(20, 20), MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
+ CHECK(node_b->has_focus());
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_d + Point2i(20, 20), MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);
+
+ // Verify break condition for Root Control.
+ node_a->set_focus_mode(Control::FOCUS_NONE);
+ node_a->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);
+ CHECK(node_b->has_focus());
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] Top Level CanvasItem stops focus propagation.") {
+ node_d->set_focus_mode(Control::FOCUS_NONE);
+ node_d->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+ node_c->set_as_top_level(true);
+
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_b, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_b, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);
+ CHECK_FALSE(root->gui_get_focus_owner());
+
+ node_d->set_focus_mode(Control::FOCUS_CLICK);
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_b, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_b, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);
+ CHECK(node_d->has_focus());
+ }
+ }
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] Process-Mode affects, if GUI Mouse Button Events are processed.") {
+ node_a->last_mouse_button = MouseButton::NONE;
+ node_a->set_process_mode(Node::PROCESS_MODE_DISABLED);
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);
+ CHECK(node_a->last_mouse_button == MouseButton::NONE);
+
+ // Now verify that with allowed processing the event is processed.
+ node_a->set_process_mode(Node::PROCESS_MODE_ALWAYS);
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);
+ CHECK(node_a->last_mouse_button == MouseButton::LEFT);
+ }
+ }
+
+ // Unit tests for Viewport::_gui_input_event (Mouse Motion)
+ SUBCASE("[Viewport][GuiInputEvent] Mouse Motion") {
+ // FIXME: Tooltips are not yet tested. They likely require an internal clock.
+
+ SUBCASE("[Viewport][GuiInputEvent] Mouse Motion changes the Control, that it is over.") {
+ SEND_GUI_MOUSE_MOTION_EVENT(on_background, MouseButtonMask::NONE, Key::NONE);
+ CHECK_FALSE(node_a->mouse_over);
+
+ // Move over Control.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_a, MouseButtonMask::NONE, Key::NONE);
+ CHECK(node_a->mouse_over);
+
+ // No change.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_a + Point2i(1, 1), MouseButtonMask::NONE, Key::NONE);
+ CHECK(node_a->mouse_over);
+
+ // Move over other Control.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_d, MouseButtonMask::NONE, Key::NONE);
+ CHECK_FALSE(node_a->mouse_over);
+ CHECK(node_d->mouse_over);
+
+ // Move to background
+ SEND_GUI_MOUSE_MOTION_EVENT(on_background, MouseButtonMask::NONE, Key::NONE);
+ CHECK_FALSE(node_d->mouse_over);
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] Window Mouse Enter/Exit signals.") {
+ SIGNAL_WATCH(root, SNAME("mouse_entered"));
+ SIGNAL_WATCH(root, SNAME("mouse_exited"));
+ Array signal_args;
+ signal_args.push_back(Array());
+
+ SEND_GUI_MOUSE_MOTION_EVENT(on_outside, MouseButtonMask::NONE, Key::NONE);
+ SIGNAL_CHECK_FALSE(SNAME("mouse_entered"));
+ SIGNAL_CHECK(SNAME("mouse_exited"), signal_args);
+
+ SEND_GUI_MOUSE_MOTION_EVENT(on_a, MouseButtonMask::NONE, Key::NONE);
+ SIGNAL_CHECK(SNAME("mouse_entered"), signal_args);
+ SIGNAL_CHECK_FALSE(SNAME("mouse_exited"));
+
+ SIGNAL_UNWATCH(root, SNAME("mouse_entered"));
+ SIGNAL_UNWATCH(root, SNAME("mouse_exited"));
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] Process-Mode affects, if GUI Mouse Motion Events are processed.") {
+ node_a->last_mouse_move_position = on_outside;
+ node_a->set_process_mode(Node::PROCESS_MODE_DISABLED);
+ SEND_GUI_MOUSE_MOTION_EVENT(on_a, MouseButtonMask::NONE, Key::NONE);
+ CHECK(node_a->last_mouse_move_position == on_outside);
+
+ // Now verify that with allowed processing the event is processed.
+ node_a->set_process_mode(Node::PROCESS_MODE_ALWAYS);
+ SEND_GUI_MOUSE_MOTION_EVENT(on_a, MouseButtonMask::NONE, Key::NONE);
+ CHECK(node_a->last_mouse_move_position == on_a);
+ }
+ }
+
+ // Unit tests for Viewport::_gui_input_event (Drag and Drop)
+ SUBCASE("[Viewport][GuiInputEvent] Drag and Drop") {
+ // FIXME: Drag-Preview will likely change. Tests for this part would have to be rewritten anyway.
+ // See https://github.com/godotengine/godot/pull/67531#issuecomment-1385353430 for details.
+ // FIXME: Testing Drag and Drop with non-embedded windows would require DisplayServerMock additions
+ // FIXME: Drag and Drop currently doesn't work with embedded Windows and SubViewports - not testing.
+ // See https://github.com/godotengine/godot/issues/28522 for example.
+ int min_grab_movement = 11;
+ SUBCASE("[Viewport][GuiInputEvent] Drag from one Control to another in the same viewport.") {
+ SUBCASE("[Viewport][GuiInputEvent] Perform successful Drag and Drop on a different Control.") {
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
+ CHECK_FALSE(root->gui_is_dragging());
+
+ SEND_GUI_MOUSE_MOTION_EVENT(on_a + Point2i(min_grab_movement, 0), MouseButtonMask::LEFT, Key::NONE);
+ CHECK(root->gui_is_dragging());
+
+ // Move above a Control, that is a Drop target and allows dropping at this point.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_d, MouseButtonMask::LEFT, Key::NONE);
+ CHECK(DS->get_cursor_shape() == DisplayServer::CURSOR_CAN_DROP);
+
+ CHECK(root->gui_is_dragging());
+ CHECK_FALSE(root->gui_is_drag_successful());
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_d, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);
+ CHECK_FALSE(root->gui_is_dragging());
+ CHECK(root->gui_is_drag_successful());
+ CHECK((StringName)node_d->drag_data == SNAME("Drag Data"));
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] Perform unsuccessful drop on Control.") {
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
+ CHECK_FALSE(root->gui_is_dragging());
+
+ // Move, but don't trigger DnD yet.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_a + Point2i(0, min_grab_movement - 1), MouseButtonMask::LEFT, Key::NONE);
+ CHECK_FALSE(root->gui_is_dragging());
+
+ // Move and trigger DnD.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_a + Point2i(0, min_grab_movement), MouseButtonMask::LEFT, Key::NONE);
+ CHECK(root->gui_is_dragging());
+
+ // Move above a Control, that is not a Drop target.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_a, MouseButtonMask::LEFT, Key::NONE);
+ CHECK(DS->get_cursor_shape() == DisplayServer::CURSOR_FORBIDDEN);
+
+ // Move above a Control, that is a Drop target, but has disallowed this point.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_d + Point2i(20, 0), MouseButtonMask::LEFT, Key::NONE);
+ CHECK(DS->get_cursor_shape() == DisplayServer::CURSOR_FORBIDDEN);
+ CHECK(root->gui_is_dragging());
+
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_d + Point2i(20, 0), MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);
+ CHECK_FALSE(root->gui_is_dragging());
+ CHECK_FALSE(root->gui_is_drag_successful());
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] Perform unsuccessful drop on No-Control.") {
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
+ CHECK_FALSE(root->gui_is_dragging());
+
+ // Move, but don't trigger DnD yet.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_a + Point2i(min_grab_movement - 1, 0), MouseButtonMask::LEFT, Key::NONE);
+ CHECK_FALSE(root->gui_is_dragging());
+
+ // Move and trigger DnD.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_a + Point2i(min_grab_movement, 0), MouseButtonMask::LEFT, Key::NONE);
+ CHECK(root->gui_is_dragging());
+
+ // Move away from Controls.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_background, MouseButtonMask::LEFT, Key::NONE);
+ CHECK(DS->get_cursor_shape() == DisplayServer::CURSOR_ARROW); // This could also be CURSOR_FORBIDDEN.
+
+ CHECK(root->gui_is_dragging());
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_background, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);
+ CHECK_FALSE(root->gui_is_dragging());
+ CHECK_FALSE(root->gui_is_drag_successful());
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] Perform unsuccessful drop outside of window.") {
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
+ CHECK_FALSE(root->gui_is_dragging());
+
+ // Move and trigger DnD.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_a + Point2i(min_grab_movement, 0), MouseButtonMask::LEFT, Key::NONE);
+ CHECK(root->gui_is_dragging());
+
+ SEND_GUI_MOUSE_MOTION_EVENT(on_d, MouseButtonMask::LEFT, Key::NONE);
+ CHECK(DS->get_cursor_shape() == DisplayServer::CURSOR_CAN_DROP);
+
+ // Move outside of window.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_outside, MouseButtonMask::LEFT, Key::NONE);
+ CHECK(DS->get_cursor_shape() == DisplayServer::CURSOR_ARROW);
+ CHECK(root->gui_is_dragging());
+
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_outside, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);
+ CHECK_FALSE(root->gui_is_dragging());
+ CHECK_FALSE(root->gui_is_drag_successful());
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] Drag and Drop doesn't work with other Mouse Buttons than LMB.") {
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_a, MouseButton::MIDDLE, MouseButtonMask::MIDDLE, Key::NONE);
+ CHECK_FALSE(root->gui_is_dragging());
+
+ SEND_GUI_MOUSE_MOTION_EVENT(on_a + Point2i(min_grab_movement, 0), MouseButtonMask::MIDDLE, Key::NONE);
+ CHECK_FALSE(root->gui_is_dragging());
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_a, MouseButton::MIDDLE, MouseButtonMask::NONE, Key::NONE);
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] Drag and Drop parent propagation.") {
+ Node2D *node_aa = memnew(Node2D);
+ Control *node_aaa = memnew(Control);
+ Node2D *node_dd = memnew(Node2D);
+ Control *node_ddd = memnew(Control);
+ node_aaa->set_size(Size2i(10, 10));
+ node_aaa->set_position(Point2i(0, 5));
+ node_ddd->set_size(Size2i(10, 10));
+ node_ddd->set_position(Point2i(0, 5));
+ node_a->add_child(node_aa);
+ node_aa->add_child(node_aaa);
+ node_d->add_child(node_dd);
+ node_dd->add_child(node_ddd);
+ Point2i on_aaa = on_a + Point2i(-2, 2);
+ Point2i on_ddd = on_d + Point2i(-2, 2);
+
+ SUBCASE("[Viewport][GuiInputEvent] Drag and Drop propagation to parent Controls.") {
+ node_aaa->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+ node_ddd->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_aaa, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
+ CHECK_FALSE(root->gui_is_dragging());
+
+ SEND_GUI_MOUSE_MOTION_EVENT(on_aaa + Point2i(0, min_grab_movement), MouseButtonMask::LEFT, Key::NONE);
+ CHECK(root->gui_is_dragging());
+
+ SEND_GUI_MOUSE_MOTION_EVENT(on_ddd, MouseButtonMask::LEFT, Key::NONE);
+
+ CHECK(root->gui_is_dragging());
+ CHECK_FALSE(root->gui_is_drag_successful());
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_ddd, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);
+ CHECK_FALSE(root->gui_is_dragging());
+ CHECK(root->gui_is_drag_successful());
+
+ node_aaa->set_mouse_filter(Control::MOUSE_FILTER_STOP);
+ node_ddd->set_mouse_filter(Control::MOUSE_FILTER_STOP);
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] Drag and Drop grab-propagation stopped by Top Level.") {
+ node_aaa->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+ node_aaa->set_as_top_level(true);
+
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_aaa, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
+ CHECK_FALSE(root->gui_is_dragging());
+
+ SEND_GUI_MOUSE_MOTION_EVENT(on_aaa + Point2i(0, min_grab_movement), MouseButtonMask::LEFT, Key::NONE);
+ CHECK_FALSE(root->gui_is_dragging());
+
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_background, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);
+ node_aaa->set_as_top_level(false);
+ node_aaa->set_mouse_filter(Control::MOUSE_FILTER_STOP);
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] Drag and Drop target-propagation stopped by Top Level.") {
+ node_aaa->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+ node_ddd->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+ node_ddd->set_as_top_level(true);
+ node_ddd->set_position(Point2i(30, 100));
+
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_aaa, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
+ CHECK_FALSE(root->gui_is_dragging());
+
+ SEND_GUI_MOUSE_MOTION_EVENT(on_aaa + Point2i(0, min_grab_movement), MouseButtonMask::LEFT, Key::NONE);
+ CHECK(root->gui_is_dragging());
+
+ SEND_GUI_MOUSE_MOTION_EVENT(Point2i(35, 105), MouseButtonMask::LEFT, Key::NONE);
+
+ CHECK(root->gui_is_dragging());
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(Point2i(35, 105), MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);
+ CHECK_FALSE(root->gui_is_dragging());
+ CHECK_FALSE(root->gui_is_drag_successful());
+
+ node_ddd->set_position(Point2i(0, 5));
+ node_ddd->set_as_top_level(false);
+ node_aaa->set_mouse_filter(Control::MOUSE_FILTER_STOP);
+ node_ddd->set_mouse_filter(Control::MOUSE_FILTER_STOP);
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] Drag and Drop grab-propagation stopped by non-CanvasItem.") {
+ node_g->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_g, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
+ SEND_GUI_MOUSE_MOTION_EVENT(on_g + Point2i(0, min_grab_movement), MouseButtonMask::LEFT, Key::NONE);
+ CHECK_FALSE(root->gui_is_dragging());
+
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_background, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);
+ node_g->set_mouse_filter(Control::MOUSE_FILTER_STOP);
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] Drag and Drop target-propagation stopped by non-CanvasItem.") {
+ node_g->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_a - Point2i(1, 1), MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE); // Offset for node_aaa.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_a + Point2i(0, min_grab_movement), MouseButtonMask::LEFT, Key::NONE);
+ CHECK(root->gui_is_dragging());
+
+ SEND_GUI_MOUSE_MOTION_EVENT(on_g, MouseButtonMask::LEFT, Key::NONE);
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_g, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);
+ CHECK_FALSE(root->gui_is_dragging());
+
+ node_g->set_mouse_filter(Control::MOUSE_FILTER_STOP);
+ }
+
+ memdelete(node_ddd);
+ memdelete(node_dd);
+ memdelete(node_aaa);
+ memdelete(node_aa);
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] Force Drag and Drop.") {
+ SEND_GUI_MOUSE_MOTION_EVENT(on_background, MouseButtonMask::NONE, Key::NONE);
+ CHECK_FALSE(root->gui_is_dragging());
+ node_a->force_drag(SNAME("Drag Data"), nullptr);
+ CHECK(root->gui_is_dragging());
+
+ SEND_GUI_MOUSE_MOTION_EVENT(on_d, MouseButtonMask::NONE, Key::NONE);
+
+ // Force Drop doesn't get triggered by mouse Buttons other than LMB.
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_d, MouseButton::RIGHT, MouseButtonMask::RIGHT, Key::NONE);
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_a, MouseButton::RIGHT, MouseButtonMask::NONE, Key::NONE);
+ CHECK(root->gui_is_dragging());
+
+ // Force Drop with LMB-Down.
+ SEND_GUI_MOUSE_BUTTON_EVENT(on_d, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
+ CHECK_FALSE(root->gui_is_dragging());
+ CHECK(root->gui_is_drag_successful());
+
+ SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_d, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);
+ }
+ }
+ }
+
+ memdelete(node_g);
+ memdelete(node_f);
+ memdelete(node_e);
+ memdelete(node_d);
+ memdelete(node_c);
+ memdelete(node_b);
+ memdelete(node_a);
+}
+
+} // namespace TestViewport
+
+#endif // TEST_VIEWPORT_H
diff --git a/tests/test_macros.h b/tests/test_macros.h
index 9fd95465f6..5d1bcdecf4 100644
--- a/tests/test_macros.h
+++ b/tests/test_macros.h
@@ -209,7 +209,6 @@ int register_test_command(String p_command, TestFunc p_function);
event.instantiate(); \
event->set_position(m_screen_pos); \
event->set_button_mask(m_mask); \
- event->set_relative(Vector2(10, 10)); \
_UPDATE_EVENT_MODIFERS(event, m_modifers); \
_SEND_DISPLAYSERVER_EVENT(event); \
MessageQueue::get_singleton()->flush(); \
diff --git a/tests/test_main.cpp b/tests/test_main.cpp
index ea6058f707..e029ea7190 100644
--- a/tests/test_main.cpp
+++ b/tests/test_main.cpp
@@ -101,6 +101,7 @@
#include "tests/scene/test_sprite_frames.h"
#include "tests/scene/test_text_edit.h"
#include "tests/scene/test_theme.h"
+#include "tests/scene/test_viewport.h"
#include "tests/scene/test_visual_shader.h"
#include "tests/servers/test_text_server.h"
#include "tests/test_validate_testing.h"
@@ -233,6 +234,9 @@ struct GodotTestCaseListener : public doctest::IReporter {
memnew(SceneTree);
SceneTree::get_singleton()->initialize();
+ if (!DisplayServer::get_singleton()->has_feature(DisplayServer::Feature::FEATURE_SUBWINDOWS)) {
+ SceneTree::get_singleton()->get_root()->set_embedding_subwindows(true);
+ }
return;
}
diff --git a/thirdparty/README.md b/thirdparty/README.md
index 38ace2c2e3..f883a3a6da 100644
--- a/thirdparty/README.md
+++ b/thirdparty/README.md
@@ -346,7 +346,7 @@ Files extracted from upstream source:
## libwebp
- Upstream: https://chromium.googlesource.com/webm/libwebp/
-- Version: 1.2.4 (0d1f12546bd803099a60c070517a552483f3790e, 2022)
+- Version: 1.3.0 (b557776962a3dcc985d83bd4ed94e1e2e50d0fa2, 2022)
- License: BSD-3-Clause
Files extracted from upstream source:
diff --git a/thirdparty/libwebp/AUTHORS b/thirdparty/libwebp/AUTHORS
index 3efcbe25b6..2f0c537d1c 100644
--- a/thirdparty/libwebp/AUTHORS
+++ b/thirdparty/libwebp/AUTHORS
@@ -11,11 +11,13 @@ Contributors:
- Djordje Pesut (djordje dot pesut at imgtec dot com)
- Frank Barchard (fbarchard at google dot com)
- Hui Su (huisu at google dot com)
+- H. Vetinari (h dot vetinari at gmx dot com)
- Ilya Kurdyukov (jpegqs at gmail dot com)
- Ingvar Stepanyan (rreverser at google dot com)
- James Zern (jzern at google dot com)
- Jan Engelhardt (jengelh at medozas dot de)
- Jehan (jehan at girinstud dot io)
+- Jeremy Maitin-Shepard (jbms at google dot com)
- Johann Koenig (johann dot koenig at duck dot com)
- Jovan Zelincevic (jovan dot zelincevic at imgtec dot com)
- Jyrki Alakuijala (jyrki at google dot com)
diff --git a/thirdparty/libwebp/sharpyuv/sharpyuv.c b/thirdparty/libwebp/sharpyuv/sharpyuv.c
index 8b3ab7216b..7de34fb0b2 100644
--- a/thirdparty/libwebp/sharpyuv/sharpyuv.c
+++ b/thirdparty/libwebp/sharpyuv/sharpyuv.c
@@ -15,16 +15,22 @@
#include <assert.h>
#include <limits.h>
-#include <math.h>
+#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include "src/webp/types.h"
-#include "src/dsp/cpu.h"
+#include "sharpyuv/sharpyuv_cpu.h"
#include "sharpyuv/sharpyuv_dsp.h"
#include "sharpyuv/sharpyuv_gamma.h"
//------------------------------------------------------------------------------
+
+int SharpYuvGetVersion(void) {
+ return SHARPYUV_VERSION;
+}
+
+//------------------------------------------------------------------------------
// Sharp RGB->YUV conversion
static const int kNumIterations = 4;
@@ -414,24 +420,45 @@ static int DoSharpArgbToYuv(const uint8_t* r_ptr, const uint8_t* g_ptr,
}
#undef SAFE_ALLOC
+#if defined(WEBP_USE_THREAD) && !defined(_WIN32)
+#include <pthread.h> // NOLINT
+
+#define LOCK_ACCESS \
+ static pthread_mutex_t sharpyuv_lock = PTHREAD_MUTEX_INITIALIZER; \
+ if (pthread_mutex_lock(&sharpyuv_lock)) return
+#define UNLOCK_ACCESS_AND_RETURN \
+ do { \
+ (void)pthread_mutex_unlock(&sharpyuv_lock); \
+ return; \
+ } while (0)
+#else // !(defined(WEBP_USE_THREAD) && !defined(_WIN32))
+#define LOCK_ACCESS do {} while (0)
+#define UNLOCK_ACCESS_AND_RETURN return
+#endif // defined(WEBP_USE_THREAD) && !defined(_WIN32)
+
// Hidden exported init function.
-// By default SharpYuvConvert calls it with NULL. If needed, users can declare
-// it as extern and call it with a VP8CPUInfo function.
-extern void SharpYuvInit(VP8CPUInfo cpu_info_func);
+// By default SharpYuvConvert calls it with SharpYuvGetCPUInfo. If needed,
+// users can declare it as extern and call it with an alternate VP8CPUInfo
+// function.
+SHARPYUV_EXTERN void SharpYuvInit(VP8CPUInfo cpu_info_func);
void SharpYuvInit(VP8CPUInfo cpu_info_func) {
static volatile VP8CPUInfo sharpyuv_last_cpuinfo_used =
(VP8CPUInfo)&sharpyuv_last_cpuinfo_used;
- const int initialized =
- (sharpyuv_last_cpuinfo_used != (VP8CPUInfo)&sharpyuv_last_cpuinfo_used);
- if (cpu_info_func == NULL && initialized) return;
- if (sharpyuv_last_cpuinfo_used == cpu_info_func) return;
-
- SharpYuvInitDsp(cpu_info_func);
- if (!initialized) {
- SharpYuvInitGammaTables();
+ LOCK_ACCESS;
+ // Only update SharpYuvGetCPUInfo when called from external code to avoid a
+ // race on reading the value in SharpYuvConvert().
+ if (cpu_info_func != (VP8CPUInfo)&SharpYuvGetCPUInfo) {
+ SharpYuvGetCPUInfo = cpu_info_func;
+ }
+ if (sharpyuv_last_cpuinfo_used == SharpYuvGetCPUInfo) {
+ UNLOCK_ACCESS_AND_RETURN;
}
- sharpyuv_last_cpuinfo_used = cpu_info_func;
+ SharpYuvInitDsp();
+ SharpYuvInitGammaTables();
+
+ sharpyuv_last_cpuinfo_used = SharpYuvGetCPUInfo;
+ UNLOCK_ACCESS_AND_RETURN;
}
int SharpYuvConvert(const void* r_ptr, const void* g_ptr,
@@ -467,7 +494,8 @@ int SharpYuvConvert(const void* r_ptr, const void* g_ptr,
// Stride should be even for uint16_t buffers.
return 0;
}
- SharpYuvInit(NULL);
+ // The address of the function pointer is used to avoid a read race.
+ SharpYuvInit((VP8CPUInfo)&SharpYuvGetCPUInfo);
// Add scaling factor to go from rgb_bit_depth to yuv_bit_depth, to the
// rgb->yuv conversion matrix.
diff --git a/thirdparty/libwebp/sharpyuv/sharpyuv.h b/thirdparty/libwebp/sharpyuv/sharpyuv.h
index 9386ea2185..181b20a0bc 100644
--- a/thirdparty/libwebp/sharpyuv/sharpyuv.h
+++ b/thirdparty/libwebp/sharpyuv/sharpyuv.h
@@ -12,15 +12,31 @@
#ifndef WEBP_SHARPYUV_SHARPYUV_H_
#define WEBP_SHARPYUV_SHARPYUV_H_
-#include <inttypes.h>
-
#ifdef __cplusplus
extern "C" {
#endif
+#ifndef SHARPYUV_EXTERN
+#ifdef WEBP_EXTERN
+#define SHARPYUV_EXTERN WEBP_EXTERN
+#else
+// This explicitly marks library functions and allows for changing the
+// signature for e.g., Windows DLL builds.
+#if defined(__GNUC__) && __GNUC__ >= 4
+#define SHARPYUV_EXTERN extern __attribute__((visibility("default")))
+#else
+#if defined(_MSC_VER) && defined(WEBP_DLL)
+#define SHARPYUV_EXTERN __declspec(dllexport)
+#else
+#define SHARPYUV_EXTERN extern
+#endif /* _MSC_VER && WEBP_DLL */
+#endif /* __GNUC__ >= 4 */
+#endif /* WEBP_EXTERN */
+#endif /* SHARPYUV_EXTERN */
+
// SharpYUV API version following the convention from semver.org
#define SHARPYUV_VERSION_MAJOR 0
-#define SHARPYUV_VERSION_MINOR 1
+#define SHARPYUV_VERSION_MINOR 2
#define SHARPYUV_VERSION_PATCH 0
// Version as a uint32_t. The major number is the high 8 bits.
// The minor number is the middle 8 bits. The patch number is the low 16 bits.
@@ -30,6 +46,10 @@ extern "C" {
SHARPYUV_MAKE_VERSION(SHARPYUV_VERSION_MAJOR, SHARPYUV_VERSION_MINOR, \
SHARPYUV_VERSION_PATCH)
+// Returns the library's version number, packed in hexadecimal. See
+// SHARPYUV_VERSION.
+SHARPYUV_EXTERN int SharpYuvGetVersion(void);
+
// RGB to YUV conversion matrix, in 16 bit fixed point.
// y = rgb_to_y[0] * r + rgb_to_y[1] * g + rgb_to_y[2] * b + rgb_to_y[3]
// u = rgb_to_u[0] * r + rgb_to_u[1] * g + rgb_to_u[2] * b + rgb_to_u[3]
@@ -65,11 +85,13 @@ typedef struct {
// adjacent pixels on the y, u and v channels. If yuv_bit_depth > 8, they
// should be multiples of 2.
// width, height: width and height of the image in pixels
-int SharpYuvConvert(const void* r_ptr, const void* g_ptr, const void* b_ptr,
- int rgb_step, int rgb_stride, int rgb_bit_depth,
- void* y_ptr, int y_stride, void* u_ptr, int u_stride,
- void* v_ptr, int v_stride, int yuv_bit_depth, int width,
- int height, const SharpYuvConversionMatrix* yuv_matrix);
+SHARPYUV_EXTERN int SharpYuvConvert(const void* r_ptr, const void* g_ptr,
+ const void* b_ptr, int rgb_step,
+ int rgb_stride, int rgb_bit_depth,
+ void* y_ptr, int y_stride, void* u_ptr,
+ int u_stride, void* v_ptr, int v_stride,
+ int yuv_bit_depth, int width, int height,
+ const SharpYuvConversionMatrix* yuv_matrix);
// TODO(b/194336375): Add YUV444 to YUV420 conversion. Maybe also add 422
// support (it's rarely used in practice, especially for images).
diff --git a/thirdparty/libwebp/sharpyuv/sharpyuv_cpu.c b/thirdparty/libwebp/sharpyuv/sharpyuv_cpu.c
new file mode 100644
index 0000000000..29425a0c49
--- /dev/null
+++ b/thirdparty/libwebp/sharpyuv/sharpyuv_cpu.c
@@ -0,0 +1,14 @@
+// Copyright 2022 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+#include "sharpyuv/sharpyuv_cpu.h"
+
+// Include src/dsp/cpu.c to create SharpYuvGetCPUInfo from VP8GetCPUInfo. The
+// function pointer is renamed in sharpyuv_cpu.h.
+#include "src/dsp/cpu.c"
diff --git a/thirdparty/libwebp/sharpyuv/sharpyuv_cpu.h b/thirdparty/libwebp/sharpyuv/sharpyuv_cpu.h
new file mode 100644
index 0000000000..176ca3eb16
--- /dev/null
+++ b/thirdparty/libwebp/sharpyuv/sharpyuv_cpu.h
@@ -0,0 +1,22 @@
+// Copyright 2022 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+#ifndef WEBP_SHARPYUV_SHARPYUV_CPU_H_
+#define WEBP_SHARPYUV_SHARPYUV_CPU_H_
+
+#include "sharpyuv/sharpyuv.h"
+
+// Avoid exporting SharpYuvGetCPUInfo in shared object / DLL builds.
+// SharpYuvInit() replaces the use of the function pointer.
+#undef WEBP_EXTERN
+#define WEBP_EXTERN extern
+#define VP8GetCPUInfo SharpYuvGetCPUInfo
+#include "src/dsp/cpu.h"
+
+#endif // WEBP_SHARPYUV_SHARPYUV_CPU_H_
diff --git a/thirdparty/libwebp/sharpyuv/sharpyuv_csp.c b/thirdparty/libwebp/sharpyuv/sharpyuv_csp.c
index 5334fa64fa..0ad22be945 100644
--- a/thirdparty/libwebp/sharpyuv/sharpyuv_csp.c
+++ b/thirdparty/libwebp/sharpyuv/sharpyuv_csp.c
@@ -13,7 +13,7 @@
#include <assert.h>
#include <math.h>
-#include <string.h>
+#include <stddef.h>
static int ToFixed16(float f) { return (int)floor(f * (1 << 16) + 0.5f); }
diff --git a/thirdparty/libwebp/sharpyuv/sharpyuv_csp.h b/thirdparty/libwebp/sharpyuv/sharpyuv_csp.h
index 63c99ef5cd..3214e3ac60 100644
--- a/thirdparty/libwebp/sharpyuv/sharpyuv_csp.h
+++ b/thirdparty/libwebp/sharpyuv/sharpyuv_csp.h
@@ -35,8 +35,9 @@ typedef struct {
} SharpYuvColorSpace;
// Fills in 'matrix' for the given YUVColorSpace.
-void SharpYuvComputeConversionMatrix(const SharpYuvColorSpace* yuv_color_space,
- SharpYuvConversionMatrix* matrix);
+SHARPYUV_EXTERN void SharpYuvComputeConversionMatrix(
+ const SharpYuvColorSpace* yuv_color_space,
+ SharpYuvConversionMatrix* matrix);
// Enums for precomputed conversion matrices.
typedef enum {
@@ -49,7 +50,7 @@ typedef enum {
} SharpYuvMatrixType;
// Returns a pointer to a matrix for one of the predefined colorspaces.
-const SharpYuvConversionMatrix* SharpYuvGetConversionMatrix(
+SHARPYUV_EXTERN const SharpYuvConversionMatrix* SharpYuvGetConversionMatrix(
SharpYuvMatrixType matrix_type);
#ifdef __cplusplus
diff --git a/thirdparty/libwebp/sharpyuv/sharpyuv_dsp.c b/thirdparty/libwebp/sharpyuv/sharpyuv_dsp.c
index 956fa7ce55..31c272c408 100644
--- a/thirdparty/libwebp/sharpyuv/sharpyuv_dsp.c
+++ b/thirdparty/libwebp/sharpyuv/sharpyuv_dsp.c
@@ -16,7 +16,7 @@
#include <assert.h>
#include <stdlib.h>
-#include "src/dsp/cpu.h"
+#include "sharpyuv/sharpyuv_cpu.h"
//-----------------------------------------------------------------------------
@@ -75,23 +75,24 @@ void (*SharpYuvFilterRow)(const int16_t* A, const int16_t* B, int len,
extern void InitSharpYuvSSE2(void);
extern void InitSharpYuvNEON(void);
-void SharpYuvInitDsp(VP8CPUInfo cpu_info_func) {
- (void)cpu_info_func;
-
+void SharpYuvInitDsp(void) {
#if !WEBP_NEON_OMIT_C_CODE
SharpYuvUpdateY = SharpYuvUpdateY_C;
SharpYuvUpdateRGB = SharpYuvUpdateRGB_C;
SharpYuvFilterRow = SharpYuvFilterRow_C;
#endif
+ if (SharpYuvGetCPUInfo != NULL) {
#if defined(WEBP_HAVE_SSE2)
- if (cpu_info_func == NULL || cpu_info_func(kSSE2)) {
- InitSharpYuvSSE2();
- }
+ if (SharpYuvGetCPUInfo(kSSE2)) {
+ InitSharpYuvSSE2();
+ }
#endif // WEBP_HAVE_SSE2
+ }
#if defined(WEBP_HAVE_NEON)
- if (WEBP_NEON_OMIT_C_CODE || cpu_info_func == NULL || cpu_info_func(kNEON)) {
+ if (WEBP_NEON_OMIT_C_CODE ||
+ (SharpYuvGetCPUInfo != NULL && SharpYuvGetCPUInfo(kNEON))) {
InitSharpYuvNEON();
}
#endif // WEBP_HAVE_NEON
diff --git a/thirdparty/libwebp/sharpyuv/sharpyuv_dsp.h b/thirdparty/libwebp/sharpyuv/sharpyuv_dsp.h
index e561d8d3d0..805fbadbf6 100644
--- a/thirdparty/libwebp/sharpyuv/sharpyuv_dsp.h
+++ b/thirdparty/libwebp/sharpyuv/sharpyuv_dsp.h
@@ -12,9 +12,8 @@
#ifndef WEBP_SHARPYUV_SHARPYUV_DSP_H_
#define WEBP_SHARPYUV_SHARPYUV_DSP_H_
-#include <stdint.h>
-
-#include "src/dsp/cpu.h"
+#include "sharpyuv/sharpyuv_cpu.h"
+#include "src/webp/types.h"
extern uint64_t (*SharpYuvUpdateY)(const uint16_t* src, const uint16_t* ref,
uint16_t* dst, int len, int bit_depth);
@@ -24,6 +23,6 @@ extern void (*SharpYuvFilterRow)(const int16_t* A, const int16_t* B, int len,
const uint16_t* best_y, uint16_t* out,
int bit_depth);
-void SharpYuvInitDsp(VP8CPUInfo cpu_info_func);
+void SharpYuvInitDsp(void);
#endif // WEBP_SHARPYUV_SHARPYUV_DSP_H_
diff --git a/thirdparty/libwebp/sharpyuv/sharpyuv_gamma.c b/thirdparty/libwebp/sharpyuv/sharpyuv_gamma.c
index 05b5436f83..20ab2da6bc 100644
--- a/thirdparty/libwebp/sharpyuv/sharpyuv_gamma.c
+++ b/thirdparty/libwebp/sharpyuv/sharpyuv_gamma.c
@@ -13,7 +13,6 @@
#include <assert.h>
#include <math.h>
-#include <stdint.h>
#include "src/webp/types.h"
diff --git a/thirdparty/libwebp/sharpyuv/sharpyuv_gamma.h b/thirdparty/libwebp/sharpyuv/sharpyuv_gamma.h
index 2f1a3ff4a0..d13aff59e1 100644
--- a/thirdparty/libwebp/sharpyuv/sharpyuv_gamma.h
+++ b/thirdparty/libwebp/sharpyuv/sharpyuv_gamma.h
@@ -12,7 +12,7 @@
#ifndef WEBP_SHARPYUV_SHARPYUV_GAMMA_H_
#define WEBP_SHARPYUV_SHARPYUV_GAMMA_H_
-#include <stdint.h>
+#include "src/webp/types.h"
#ifdef __cplusplus
extern "C" {
diff --git a/thirdparty/libwebp/sharpyuv/sharpyuv_neon.c b/thirdparty/libwebp/sharpyuv/sharpyuv_neon.c
index 5cf6aaffb0..5840914865 100644
--- a/thirdparty/libwebp/sharpyuv/sharpyuv_neon.c
+++ b/thirdparty/libwebp/sharpyuv/sharpyuv_neon.c
@@ -17,11 +17,6 @@
#include <assert.h>
#include <stdlib.h>
#include <arm_neon.h>
-#endif
-
-extern void InitSharpYuvNEON(void);
-
-#if defined(WEBP_USE_NEON)
static uint16_t clip_NEON(int v, int max) {
return (v < 0) ? 0 : (v > max) ? max : (uint16_t)v;
@@ -169,6 +164,8 @@ static void SharpYuvFilterRow_NEON(const int16_t* A, const int16_t* B, int len,
//------------------------------------------------------------------------------
+extern void InitSharpYuvNEON(void);
+
WEBP_TSAN_IGNORE_FUNCTION void InitSharpYuvNEON(void) {
SharpYuvUpdateY = SharpYuvUpdateY_NEON;
SharpYuvUpdateRGB = SharpYuvUpdateRGB_NEON;
@@ -177,6 +174,8 @@ WEBP_TSAN_IGNORE_FUNCTION void InitSharpYuvNEON(void) {
#else // !WEBP_USE_NEON
+extern void InitSharpYuvNEON(void);
+
void InitSharpYuvNEON(void) {}
#endif // WEBP_USE_NEON
diff --git a/thirdparty/libwebp/sharpyuv/sharpyuv_sse2.c b/thirdparty/libwebp/sharpyuv/sharpyuv_sse2.c
index 1943873748..9744d1bb6c 100644
--- a/thirdparty/libwebp/sharpyuv/sharpyuv_sse2.c
+++ b/thirdparty/libwebp/sharpyuv/sharpyuv_sse2.c
@@ -16,11 +16,6 @@
#if defined(WEBP_USE_SSE2)
#include <stdlib.h>
#include <emmintrin.h>
-#endif
-
-extern void InitSharpYuvSSE2(void);
-
-#if defined(WEBP_USE_SSE2)
static uint16_t clip_SSE2(int v, int max) {
return (v < 0) ? 0 : (v > max) ? max : (uint16_t)v;
@@ -199,6 +194,8 @@ WEBP_TSAN_IGNORE_FUNCTION void InitSharpYuvSSE2(void) {
}
#else // !WEBP_USE_SSE2
+extern void InitSharpYuvSSE2(void);
+
void InitSharpYuvSSE2(void) {}
#endif // WEBP_USE_SSE2
diff --git a/thirdparty/libwebp/src/dec/vp8i_dec.h b/thirdparty/libwebp/src/dec/vp8i_dec.h
index 30c1bd3ef9..83791ecd25 100644
--- a/thirdparty/libwebp/src/dec/vp8i_dec.h
+++ b/thirdparty/libwebp/src/dec/vp8i_dec.h
@@ -31,8 +31,8 @@ extern "C" {
// version numbers
#define DEC_MAJ_VERSION 1
-#define DEC_MIN_VERSION 2
-#define DEC_REV_VERSION 4
+#define DEC_MIN_VERSION 3
+#define DEC_REV_VERSION 0
// YUV-cache parameters. Cache is 32-bytes wide (= one cacheline).
// Constraints are: We need to store one 16x16 block of luma samples (y),
diff --git a/thirdparty/libwebp/src/dec/vp8l_dec.c b/thirdparty/libwebp/src/dec/vp8l_dec.c
index 1348055128..c0ea0181e5 100644
--- a/thirdparty/libwebp/src/dec/vp8l_dec.c
+++ b/thirdparty/libwebp/src/dec/vp8l_dec.c
@@ -1336,7 +1336,7 @@ static int ReadTransform(int* const xsize, int const* ysize,
ok = ok && ExpandColorMap(num_colors, transform);
break;
}
- case SUBTRACT_GREEN:
+ case SUBTRACT_GREEN_TRANSFORM:
break;
default:
assert(0); // can't happen
diff --git a/thirdparty/libwebp/src/dec/webp_dec.c b/thirdparty/libwebp/src/dec/webp_dec.c
index 77a54c55d2..3f4f7bb659 100644
--- a/thirdparty/libwebp/src/dec/webp_dec.c
+++ b/thirdparty/libwebp/src/dec/webp_dec.c
@@ -179,7 +179,7 @@ static VP8StatusCode ParseOptionalChunks(const uint8_t** const data,
return VP8_STATUS_BITSTREAM_ERROR; // Not a valid chunk size.
}
// For odd-sized chunk-payload, there's one byte padding at the end.
- disk_chunk_size = (CHUNK_HEADER_SIZE + chunk_size + 1) & ~1;
+ disk_chunk_size = (CHUNK_HEADER_SIZE + chunk_size + 1) & ~1u;
total_size += disk_chunk_size;
// Check that total bytes skipped so far does not exceed riff_size.
diff --git a/thirdparty/libwebp/src/demux/demux.c b/thirdparty/libwebp/src/demux/demux.c
index 41387ec2d6..324e5eb993 100644
--- a/thirdparty/libwebp/src/demux/demux.c
+++ b/thirdparty/libwebp/src/demux/demux.c
@@ -24,8 +24,8 @@
#include "src/webp/format_constants.h"
#define DMUX_MAJ_VERSION 1
-#define DMUX_MIN_VERSION 2
-#define DMUX_REV_VERSION 4
+#define DMUX_MIN_VERSION 3
+#define DMUX_REV_VERSION 0
typedef struct {
size_t start_; // start location of the data
diff --git a/thirdparty/libwebp/src/dsp/alpha_processing_sse2.c b/thirdparty/libwebp/src/dsp/alpha_processing_sse2.c
index a5f8c9f7c7..f0843d0feb 100644
--- a/thirdparty/libwebp/src/dsp/alpha_processing_sse2.c
+++ b/thirdparty/libwebp/src/dsp/alpha_processing_sse2.c
@@ -26,8 +26,8 @@ static int DispatchAlpha_SSE2(const uint8_t* WEBP_RESTRICT alpha,
uint32_t alpha_and = 0xff;
int i, j;
const __m128i zero = _mm_setzero_si128();
- const __m128i rgb_mask = _mm_set1_epi32(0xffffff00u); // to preserve RGB
- const __m128i all_0xff = _mm_set_epi32(0, 0, ~0u, ~0u);
+ const __m128i rgb_mask = _mm_set1_epi32((int)0xffffff00); // to preserve RGB
+ const __m128i all_0xff = _mm_set_epi32(0, 0, ~0, ~0);
__m128i all_alphas = all_0xff;
// We must be able to access 3 extra bytes after the last written byte
@@ -106,8 +106,8 @@ static int ExtractAlpha_SSE2(const uint8_t* WEBP_RESTRICT argb, int argb_stride,
// value is not 0xff if any of the alpha[] is not equal to 0xff.
uint32_t alpha_and = 0xff;
int i, j;
- const __m128i a_mask = _mm_set1_epi32(0xffu); // to preserve alpha
- const __m128i all_0xff = _mm_set_epi32(0, 0, ~0u, ~0u);
+ const __m128i a_mask = _mm_set1_epi32(0xff); // to preserve alpha
+ const __m128i all_0xff = _mm_set_epi32(0, 0, ~0, ~0);
__m128i all_alphas = all_0xff;
// We must be able to access 3 extra bytes after the last written byte
@@ -178,7 +178,7 @@ static int ExtractAlpha_SSE2(const uint8_t* WEBP_RESTRICT argb, int argb_stride,
static void ApplyAlphaMultiply_SSE2(uint8_t* rgba, int alpha_first,
int w, int h, int stride) {
const __m128i zero = _mm_setzero_si128();
- const __m128i kMult = _mm_set1_epi16(0x8081u);
+ const __m128i kMult = _mm_set1_epi16((short)0x8081);
const __m128i kMask = _mm_set_epi16(0, 0xff, 0xff, 0, 0, 0xff, 0xff, 0);
const int kSpan = 4;
while (h-- > 0) {
@@ -267,7 +267,7 @@ static int HasAlpha32b_SSE2(const uint8_t* src, int length) {
}
static void AlphaReplace_SSE2(uint32_t* src, int length, uint32_t color) {
- const __m128i m_color = _mm_set1_epi32(color);
+ const __m128i m_color = _mm_set1_epi32((int)color);
const __m128i zero = _mm_setzero_si128();
int i = 0;
for (; i + 8 <= length; i += 8) {
diff --git a/thirdparty/libwebp/src/dsp/alpha_processing_sse41.c b/thirdparty/libwebp/src/dsp/alpha_processing_sse41.c
index cdf877ce49..1156ac3417 100644
--- a/thirdparty/libwebp/src/dsp/alpha_processing_sse41.c
+++ b/thirdparty/libwebp/src/dsp/alpha_processing_sse41.c
@@ -26,7 +26,7 @@ static int ExtractAlpha_SSE41(const uint8_t* WEBP_RESTRICT argb,
// value is not 0xff if any of the alpha[] is not equal to 0xff.
uint32_t alpha_and = 0xff;
int i, j;
- const __m128i all_0xff = _mm_set1_epi32(~0u);
+ const __m128i all_0xff = _mm_set1_epi32(~0);
__m128i all_alphas = all_0xff;
// We must be able to access 3 extra bytes after the last written byte
diff --git a/thirdparty/libwebp/src/dsp/cpu.c b/thirdparty/libwebp/src/dsp/cpu.c
index a4ba7f2cb7..62de73f750 100644
--- a/thirdparty/libwebp/src/dsp/cpu.c
+++ b/thirdparty/libwebp/src/dsp/cpu.c
@@ -212,7 +212,7 @@ VP8CPUInfo VP8GetCPUInfo = wasmCPUInfo;
#elif defined(WEBP_HAVE_NEON)
// In most cases this function doesn't check for NEON support (it's assumed by
// the configuration), but enables turning off NEON at runtime, for testing
-// purposes, by setting VP8DecGetCPUInfo = NULL.
+// purposes, by setting VP8GetCPUInfo = NULL.
static int armCPUInfo(CPUFeature feature) {
if (feature != kNEON) return 0;
#if defined(__linux__) && defined(WEBP_HAVE_NEON_RTCD)
diff --git a/thirdparty/libwebp/src/dsp/cpu.h b/thirdparty/libwebp/src/dsp/cpu.h
index 57a40d87d4..be80727c0d 100644
--- a/thirdparty/libwebp/src/dsp/cpu.h
+++ b/thirdparty/libwebp/src/dsp/cpu.h
@@ -14,6 +14,8 @@
#ifndef WEBP_DSP_CPU_H_
#define WEBP_DSP_CPU_H_
+#include <stddef.h>
+
#ifdef HAVE_CONFIG_H
#include "src/webp/config.h"
#endif
diff --git a/thirdparty/libwebp/src/dsp/dec_sse2.c b/thirdparty/libwebp/src/dsp/dec_sse2.c
index 873aa59e8a..01e6bcb636 100644
--- a/thirdparty/libwebp/src/dsp/dec_sse2.c
+++ b/thirdparty/libwebp/src/dsp/dec_sse2.c
@@ -158,10 +158,10 @@ static void Transform_SSE2(const int16_t* in, uint8_t* dst, int do_two) {
dst3 = _mm_loadl_epi64((__m128i*)(dst + 3 * BPS));
} else {
// Load four bytes/pixels per line.
- dst0 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 0 * BPS));
- dst1 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 1 * BPS));
- dst2 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 2 * BPS));
- dst3 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 3 * BPS));
+ dst0 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 0 * BPS));
+ dst1 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 1 * BPS));
+ dst2 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 2 * BPS));
+ dst3 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 3 * BPS));
}
// Convert to 16b.
dst0 = _mm_unpacklo_epi8(dst0, zero);
@@ -187,10 +187,10 @@ static void Transform_SSE2(const int16_t* in, uint8_t* dst, int do_two) {
_mm_storel_epi64((__m128i*)(dst + 3 * BPS), dst3);
} else {
// Store four bytes/pixels per line.
- WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(dst0));
- WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(dst1));
- WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(dst2));
- WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(dst3));
+ WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(dst0));
+ WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(dst1));
+ WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(dst2));
+ WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(dst3));
}
}
}
@@ -213,10 +213,10 @@ static void TransformAC3(const int16_t* in, uint8_t* dst) {
const __m128i m3 = _mm_subs_epi16(B, d4);
const __m128i zero = _mm_setzero_si128();
// Load the source pixels.
- __m128i dst0 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 0 * BPS));
- __m128i dst1 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 1 * BPS));
- __m128i dst2 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 2 * BPS));
- __m128i dst3 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 3 * BPS));
+ __m128i dst0 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 0 * BPS));
+ __m128i dst1 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 1 * BPS));
+ __m128i dst2 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 2 * BPS));
+ __m128i dst3 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 3 * BPS));
// Convert to 16b.
dst0 = _mm_unpacklo_epi8(dst0, zero);
dst1 = _mm_unpacklo_epi8(dst1, zero);
@@ -233,10 +233,10 @@ static void TransformAC3(const int16_t* in, uint8_t* dst) {
dst2 = _mm_packus_epi16(dst2, dst2);
dst3 = _mm_packus_epi16(dst3, dst3);
// Store the results.
- WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(dst0));
- WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(dst1));
- WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(dst2));
- WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(dst3));
+ WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(dst0));
+ WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(dst1));
+ WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(dst2));
+ WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(dst3));
}
#undef MUL
#endif // USE_TRANSFORM_AC3
@@ -477,11 +477,11 @@ static WEBP_INLINE void Load8x4_SSE2(const uint8_t* const b, int stride,
// A0 = 63 62 61 60 23 22 21 20 43 42 41 40 03 02 01 00
// A1 = 73 72 71 70 33 32 31 30 53 52 51 50 13 12 11 10
const __m128i A0 = _mm_set_epi32(
- WebPMemToUint32(&b[6 * stride]), WebPMemToUint32(&b[2 * stride]),
- WebPMemToUint32(&b[4 * stride]), WebPMemToUint32(&b[0 * stride]));
+ WebPMemToInt32(&b[6 * stride]), WebPMemToInt32(&b[2 * stride]),
+ WebPMemToInt32(&b[4 * stride]), WebPMemToInt32(&b[0 * stride]));
const __m128i A1 = _mm_set_epi32(
- WebPMemToUint32(&b[7 * stride]), WebPMemToUint32(&b[3 * stride]),
- WebPMemToUint32(&b[5 * stride]), WebPMemToUint32(&b[1 * stride]));
+ WebPMemToInt32(&b[7 * stride]), WebPMemToInt32(&b[3 * stride]),
+ WebPMemToInt32(&b[5 * stride]), WebPMemToInt32(&b[1 * stride]));
// B0 = 53 43 52 42 51 41 50 40 13 03 12 02 11 01 10 00
// B1 = 73 63 72 62 71 61 70 60 33 23 32 22 31 21 30 20
@@ -540,7 +540,7 @@ static WEBP_INLINE void Store4x4_SSE2(__m128i* const x,
uint8_t* dst, int stride) {
int i;
for (i = 0; i < 4; ++i, dst += stride) {
- WebPUint32ToMem(dst, _mm_cvtsi128_si32(*x));
+ WebPInt32ToMem(dst, _mm_cvtsi128_si32(*x));
*x = _mm_srli_si128(*x, 4);
}
}
@@ -908,10 +908,10 @@ static void VE4_SSE2(uint8_t* dst) { // vertical
const __m128i lsb = _mm_and_si128(_mm_xor_si128(ABCDEFGH, CDEFGH00), one);
const __m128i b = _mm_subs_epu8(a, lsb);
const __m128i avg = _mm_avg_epu8(b, BCDEFGH0);
- const uint32_t vals = _mm_cvtsi128_si32(avg);
+ const int vals = _mm_cvtsi128_si32(avg);
int i;
for (i = 0; i < 4; ++i) {
- WebPUint32ToMem(dst + i * BPS, vals);
+ WebPInt32ToMem(dst + i * BPS, vals);
}
}
@@ -925,10 +925,10 @@ static void LD4_SSE2(uint8_t* dst) { // Down-Left
const __m128i lsb = _mm_and_si128(_mm_xor_si128(ABCDEFGH, CDEFGHH0), one);
const __m128i avg2 = _mm_subs_epu8(avg1, lsb);
const __m128i abcdefg = _mm_avg_epu8(avg2, BCDEFGH0);
- WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( abcdefg ));
- WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1)));
- WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2)));
- WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3)));
+ WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( abcdefg ));
+ WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1)));
+ WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2)));
+ WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3)));
}
static void VR4_SSE2(uint8_t* dst) { // Vertical-Right
@@ -946,10 +946,10 @@ static void VR4_SSE2(uint8_t* dst) { // Vertical-Right
const __m128i lsb = _mm_and_si128(_mm_xor_si128(IXABCD, ABCD0), one);
const __m128i avg2 = _mm_subs_epu8(avg1, lsb);
const __m128i efgh = _mm_avg_epu8(avg2, XABCD);
- WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( abcd ));
- WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32( efgh ));
- WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(abcd, 1)));
- WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(efgh, 1)));
+ WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( abcd ));
+ WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32( efgh ));
+ WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(abcd, 1)));
+ WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(efgh, 1)));
// these two are hard to implement in SSE2, so we keep the C-version:
DST(0, 2) = AVG3(J, I, X);
@@ -970,11 +970,12 @@ static void VL4_SSE2(uint8_t* dst) { // Vertical-Left
const __m128i abbc = _mm_or_si128(ab, bc);
const __m128i lsb2 = _mm_and_si128(abbc, lsb1);
const __m128i avg4 = _mm_subs_epu8(avg3, lsb2);
- const uint32_t extra_out = _mm_cvtsi128_si32(_mm_srli_si128(avg4, 4));
- WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( avg1 ));
- WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32( avg4 ));
- WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg1, 1)));
- WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg4, 1)));
+ const uint32_t extra_out =
+ (uint32_t)_mm_cvtsi128_si32(_mm_srli_si128(avg4, 4));
+ WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( avg1 ));
+ WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32( avg4 ));
+ WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg1, 1)));
+ WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg4, 1)));
// these two are hard to get and irregular
DST(3, 2) = (extra_out >> 0) & 0xff;
@@ -990,7 +991,7 @@ static void RD4_SSE2(uint8_t* dst) { // Down-right
const uint32_t K = dst[-1 + 2 * BPS];
const uint32_t L = dst[-1 + 3 * BPS];
const __m128i LKJI_____ =
- _mm_cvtsi32_si128(L | (K << 8) | (J << 16) | (I << 24));
+ _mm_cvtsi32_si128((int)(L | (K << 8) | (J << 16) | (I << 24)));
const __m128i LKJIXABCD = _mm_or_si128(LKJI_____, ____XABCD);
const __m128i KJIXABCD_ = _mm_srli_si128(LKJIXABCD, 1);
const __m128i JIXABCD__ = _mm_srli_si128(LKJIXABCD, 2);
@@ -998,10 +999,10 @@ static void RD4_SSE2(uint8_t* dst) { // Down-right
const __m128i lsb = _mm_and_si128(_mm_xor_si128(JIXABCD__, LKJIXABCD), one);
const __m128i avg2 = _mm_subs_epu8(avg1, lsb);
const __m128i abcdefg = _mm_avg_epu8(avg2, KJIXABCD_);
- WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32( abcdefg ));
- WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1)));
- WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2)));
- WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3)));
+ WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32( abcdefg ));
+ WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1)));
+ WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2)));
+ WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3)));
}
#undef DST
@@ -1015,13 +1016,13 @@ static WEBP_INLINE void TrueMotion_SSE2(uint8_t* dst, int size) {
const __m128i zero = _mm_setzero_si128();
int y;
if (size == 4) {
- const __m128i top_values = _mm_cvtsi32_si128(WebPMemToUint32(top));
+ const __m128i top_values = _mm_cvtsi32_si128(WebPMemToInt32(top));
const __m128i top_base = _mm_unpacklo_epi8(top_values, zero);
for (y = 0; y < 4; ++y, dst += BPS) {
const int val = dst[-1] - top[-1];
const __m128i base = _mm_set1_epi16(val);
const __m128i out = _mm_packus_epi16(_mm_add_epi16(base, top_base), zero);
- WebPUint32ToMem(dst, _mm_cvtsi128_si32(out));
+ WebPInt32ToMem(dst, _mm_cvtsi128_si32(out));
}
} else if (size == 8) {
const __m128i top_values = _mm_loadl_epi64((const __m128i*)top);
@@ -1062,7 +1063,7 @@ static void VE16_SSE2(uint8_t* dst) {
static void HE16_SSE2(uint8_t* dst) { // horizontal
int j;
for (j = 16; j > 0; --j) {
- const __m128i values = _mm_set1_epi8(dst[-1]);
+ const __m128i values = _mm_set1_epi8((char)dst[-1]);
_mm_storeu_si128((__m128i*)dst, values);
dst += BPS;
}
@@ -1070,7 +1071,7 @@ static void HE16_SSE2(uint8_t* dst) { // horizontal
static WEBP_INLINE void Put16_SSE2(uint8_t v, uint8_t* dst) {
int j;
- const __m128i values = _mm_set1_epi8(v);
+ const __m128i values = _mm_set1_epi8((char)v);
for (j = 0; j < 16; ++j) {
_mm_storeu_si128((__m128i*)(dst + j * BPS), values);
}
@@ -1130,7 +1131,7 @@ static void VE8uv_SSE2(uint8_t* dst) { // vertical
// helper for chroma-DC predictions
static WEBP_INLINE void Put8x8uv_SSE2(uint8_t v, uint8_t* dst) {
int j;
- const __m128i values = _mm_set1_epi8(v);
+ const __m128i values = _mm_set1_epi8((char)v);
for (j = 0; j < 8; ++j) {
_mm_storel_epi64((__m128i*)(dst + j * BPS), values);
}
diff --git a/thirdparty/libwebp/src/dsp/dec_sse41.c b/thirdparty/libwebp/src/dsp/dec_sse41.c
index 8f18506d54..08a3630272 100644
--- a/thirdparty/libwebp/src/dsp/dec_sse41.c
+++ b/thirdparty/libwebp/src/dsp/dec_sse41.c
@@ -23,7 +23,7 @@ static void HE16_SSE41(uint8_t* dst) { // horizontal
int j;
const __m128i kShuffle3 = _mm_set1_epi8(3);
for (j = 16; j > 0; --j) {
- const __m128i in = _mm_cvtsi32_si128(WebPMemToUint32(dst - 4));
+ const __m128i in = _mm_cvtsi32_si128(WebPMemToInt32(dst - 4));
const __m128i values = _mm_shuffle_epi8(in, kShuffle3);
_mm_storeu_si128((__m128i*)dst, values);
dst += BPS;
diff --git a/thirdparty/libwebp/src/dsp/enc_neon.c b/thirdparty/libwebp/src/dsp/enc_neon.c
index 601962ba76..3a04111c55 100644
--- a/thirdparty/libwebp/src/dsp/enc_neon.c
+++ b/thirdparty/libwebp/src/dsp/enc_neon.c
@@ -764,9 +764,14 @@ static WEBP_INLINE void AccumulateSSE16_NEON(const uint8_t* const a,
// Horizontal sum of all four uint32_t values in 'sum'.
static int SumToInt_NEON(uint32x4_t sum) {
+#if defined(__aarch64__)
+ return (int)vaddvq_u32(sum);
+#else
const uint64x2_t sum2 = vpaddlq_u32(sum);
- const uint64_t sum3 = vgetq_lane_u64(sum2, 0) + vgetq_lane_u64(sum2, 1);
- return (int)sum3;
+ const uint32x2_t sum3 = vadd_u32(vreinterpret_u32_u64(vget_low_u64(sum2)),
+ vreinterpret_u32_u64(vget_high_u64(sum2)));
+ return (int)vget_lane_u32(sum3, 0);
+#endif
}
static int SSE16x16_NEON(const uint8_t* a, const uint8_t* b) {
diff --git a/thirdparty/libwebp/src/dsp/enc_sse2.c b/thirdparty/libwebp/src/dsp/enc_sse2.c
index b2e78ed941..1d1055668f 100644
--- a/thirdparty/libwebp/src/dsp/enc_sse2.c
+++ b/thirdparty/libwebp/src/dsp/enc_sse2.c
@@ -156,10 +156,10 @@ static void ITransform_SSE2(const uint8_t* ref, const int16_t* in, uint8_t* dst,
ref3 = _mm_loadl_epi64((const __m128i*)&ref[3 * BPS]);
} else {
// Load four bytes/pixels per line.
- ref0 = _mm_cvtsi32_si128(WebPMemToUint32(&ref[0 * BPS]));
- ref1 = _mm_cvtsi32_si128(WebPMemToUint32(&ref[1 * BPS]));
- ref2 = _mm_cvtsi32_si128(WebPMemToUint32(&ref[2 * BPS]));
- ref3 = _mm_cvtsi32_si128(WebPMemToUint32(&ref[3 * BPS]));
+ ref0 = _mm_cvtsi32_si128(WebPMemToInt32(&ref[0 * BPS]));
+ ref1 = _mm_cvtsi32_si128(WebPMemToInt32(&ref[1 * BPS]));
+ ref2 = _mm_cvtsi32_si128(WebPMemToInt32(&ref[2 * BPS]));
+ ref3 = _mm_cvtsi32_si128(WebPMemToInt32(&ref[3 * BPS]));
}
// Convert to 16b.
ref0 = _mm_unpacklo_epi8(ref0, zero);
@@ -185,10 +185,10 @@ static void ITransform_SSE2(const uint8_t* ref, const int16_t* in, uint8_t* dst,
_mm_storel_epi64((__m128i*)&dst[3 * BPS], ref3);
} else {
// Store four bytes/pixels per line.
- WebPUint32ToMem(&dst[0 * BPS], _mm_cvtsi128_si32(ref0));
- WebPUint32ToMem(&dst[1 * BPS], _mm_cvtsi128_si32(ref1));
- WebPUint32ToMem(&dst[2 * BPS], _mm_cvtsi128_si32(ref2));
- WebPUint32ToMem(&dst[3 * BPS], _mm_cvtsi128_si32(ref3));
+ WebPInt32ToMem(&dst[0 * BPS], _mm_cvtsi128_si32(ref0));
+ WebPInt32ToMem(&dst[1 * BPS], _mm_cvtsi128_si32(ref1));
+ WebPInt32ToMem(&dst[2 * BPS], _mm_cvtsi128_si32(ref2));
+ WebPInt32ToMem(&dst[3 * BPS], _mm_cvtsi128_si32(ref3));
}
}
}
@@ -481,7 +481,7 @@ static void CollectHistogram_SSE2(const uint8_t* ref, const uint8_t* pred,
// helper for chroma-DC predictions
static WEBP_INLINE void Put8x8uv_SSE2(uint8_t v, uint8_t* dst) {
int j;
- const __m128i values = _mm_set1_epi8(v);
+ const __m128i values = _mm_set1_epi8((char)v);
for (j = 0; j < 8; ++j) {
_mm_storel_epi64((__m128i*)(dst + j * BPS), values);
}
@@ -489,7 +489,7 @@ static WEBP_INLINE void Put8x8uv_SSE2(uint8_t v, uint8_t* dst) {
static WEBP_INLINE void Put16_SSE2(uint8_t v, uint8_t* dst) {
int j;
- const __m128i values = _mm_set1_epi8(v);
+ const __m128i values = _mm_set1_epi8((char)v);
for (j = 0; j < 16; ++j) {
_mm_store_si128((__m128i*)(dst + j * BPS), values);
}
@@ -540,7 +540,7 @@ static WEBP_INLINE void VerticalPred_SSE2(uint8_t* dst,
static WEBP_INLINE void HE8uv_SSE2(uint8_t* dst, const uint8_t* left) {
int j;
for (j = 0; j < 8; ++j) {
- const __m128i values = _mm_set1_epi8(left[j]);
+ const __m128i values = _mm_set1_epi8((char)left[j]);
_mm_storel_epi64((__m128i*)dst, values);
dst += BPS;
}
@@ -549,7 +549,7 @@ static WEBP_INLINE void HE8uv_SSE2(uint8_t* dst, const uint8_t* left) {
static WEBP_INLINE void HE16_SSE2(uint8_t* dst, const uint8_t* left) {
int j;
for (j = 0; j < 16; ++j) {
- const __m128i values = _mm_set1_epi8(left[j]);
+ const __m128i values = _mm_set1_epi8((char)left[j]);
_mm_store_si128((__m128i*)dst, values);
dst += BPS;
}
@@ -722,10 +722,10 @@ static WEBP_INLINE void VE4_SSE2(uint8_t* dst,
const __m128i lsb = _mm_and_si128(_mm_xor_si128(ABCDEFGH, CDEFGH00), one);
const __m128i b = _mm_subs_epu8(a, lsb);
const __m128i avg = _mm_avg_epu8(b, BCDEFGH0);
- const uint32_t vals = _mm_cvtsi128_si32(avg);
+ const int vals = _mm_cvtsi128_si32(avg);
int i;
for (i = 0; i < 4; ++i) {
- WebPUint32ToMem(dst + i * BPS, vals);
+ WebPInt32ToMem(dst + i * BPS, vals);
}
}
@@ -760,10 +760,10 @@ static WEBP_INLINE void LD4_SSE2(uint8_t* dst,
const __m128i lsb = _mm_and_si128(_mm_xor_si128(ABCDEFGH, CDEFGHH0), one);
const __m128i avg2 = _mm_subs_epu8(avg1, lsb);
const __m128i abcdefg = _mm_avg_epu8(avg2, BCDEFGH0);
- WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( abcdefg ));
- WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1)));
- WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2)));
- WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3)));
+ WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( abcdefg ));
+ WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1)));
+ WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2)));
+ WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3)));
}
static WEBP_INLINE void VR4_SSE2(uint8_t* dst,
@@ -782,10 +782,10 @@ static WEBP_INLINE void VR4_SSE2(uint8_t* dst,
const __m128i lsb = _mm_and_si128(_mm_xor_si128(IXABCD, ABCD0), one);
const __m128i avg2 = _mm_subs_epu8(avg1, lsb);
const __m128i efgh = _mm_avg_epu8(avg2, XABCD);
- WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( abcd ));
- WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32( efgh ));
- WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(abcd, 1)));
- WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(efgh, 1)));
+ WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( abcd ));
+ WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32( efgh ));
+ WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(abcd, 1)));
+ WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(efgh, 1)));
// these two are hard to implement in SSE2, so we keep the C-version:
DST(0, 2) = AVG3(J, I, X);
@@ -807,11 +807,12 @@ static WEBP_INLINE void VL4_SSE2(uint8_t* dst,
const __m128i abbc = _mm_or_si128(ab, bc);
const __m128i lsb2 = _mm_and_si128(abbc, lsb1);
const __m128i avg4 = _mm_subs_epu8(avg3, lsb2);
- const uint32_t extra_out = _mm_cvtsi128_si32(_mm_srli_si128(avg4, 4));
- WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( avg1 ));
- WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32( avg4 ));
- WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg1, 1)));
- WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg4, 1)));
+ const uint32_t extra_out =
+ (uint32_t)_mm_cvtsi128_si32(_mm_srli_si128(avg4, 4));
+ WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( avg1 ));
+ WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32( avg4 ));
+ WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg1, 1)));
+ WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg4, 1)));
// these two are hard to get and irregular
DST(3, 2) = (extra_out >> 0) & 0xff;
@@ -829,10 +830,10 @@ static WEBP_INLINE void RD4_SSE2(uint8_t* dst,
const __m128i lsb = _mm_and_si128(_mm_xor_si128(JIXABCD__, LKJIXABCD), one);
const __m128i avg2 = _mm_subs_epu8(avg1, lsb);
const __m128i abcdefg = _mm_avg_epu8(avg2, KJIXABCD_);
- WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32( abcdefg ));
- WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1)));
- WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2)));
- WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3)));
+ WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32( abcdefg ));
+ WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1)));
+ WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2)));
+ WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3)));
}
static WEBP_INLINE void HU4_SSE2(uint8_t* dst, const uint8_t* top) {
@@ -875,14 +876,14 @@ static WEBP_INLINE void HD4_SSE2(uint8_t* dst, const uint8_t* top) {
static WEBP_INLINE void TM4_SSE2(uint8_t* dst, const uint8_t* top) {
const __m128i zero = _mm_setzero_si128();
- const __m128i top_values = _mm_cvtsi32_si128(WebPMemToUint32(top));
+ const __m128i top_values = _mm_cvtsi32_si128(WebPMemToInt32(top));
const __m128i top_base = _mm_unpacklo_epi8(top_values, zero);
int y;
for (y = 0; y < 4; ++y, dst += BPS) {
const int val = top[-2 - y] - top[-1];
const __m128i base = _mm_set1_epi16(val);
const __m128i out = _mm_packus_epi16(_mm_add_epi16(base, top_base), zero);
- WebPUint32ToMem(dst, _mm_cvtsi128_si32(out));
+ WebPInt32ToMem(dst, _mm_cvtsi128_si32(out));
}
}
diff --git a/thirdparty/libwebp/src/dsp/lossless.c b/thirdparty/libwebp/src/dsp/lossless.c
index 84a54296fd..fb86e58d4a 100644
--- a/thirdparty/libwebp/src/dsp/lossless.c
+++ b/thirdparty/libwebp/src/dsp/lossless.c
@@ -49,7 +49,7 @@ static WEBP_INLINE uint32_t Clip255(uint32_t a) {
}
static WEBP_INLINE int AddSubtractComponentFull(int a, int b, int c) {
- return Clip255(a + b - c);
+ return Clip255((uint32_t)(a + b - c));
}
static WEBP_INLINE uint32_t ClampedAddSubtractFull(uint32_t c0, uint32_t c1,
@@ -66,7 +66,7 @@ static WEBP_INLINE uint32_t ClampedAddSubtractFull(uint32_t c0, uint32_t c1,
}
static WEBP_INLINE int AddSubtractComponentHalf(int a, int b) {
- return Clip255(a + (a - b) / 2);
+ return Clip255((uint32_t)(a + (a - b) / 2));
}
static WEBP_INLINE uint32_t ClampedAddSubtractHalf(uint32_t c0, uint32_t c1,
@@ -293,10 +293,10 @@ void VP8LTransformColorInverse_C(const VP8LMultipliers* const m,
const uint32_t red = argb >> 16;
int new_red = red & 0xff;
int new_blue = argb & 0xff;
- new_red += ColorTransformDelta(m->green_to_red_, green);
+ new_red += ColorTransformDelta((int8_t)m->green_to_red_, green);
new_red &= 0xff;
- new_blue += ColorTransformDelta(m->green_to_blue_, green);
- new_blue += ColorTransformDelta(m->red_to_blue_, (int8_t)new_red);
+ new_blue += ColorTransformDelta((int8_t)m->green_to_blue_, green);
+ new_blue += ColorTransformDelta((int8_t)m->red_to_blue_, (int8_t)new_red);
new_blue &= 0xff;
dst[i] = (argb & 0xff00ff00u) | (new_red << 16) | (new_blue);
}
@@ -395,7 +395,7 @@ void VP8LInverseTransform(const VP8LTransform* const transform,
assert(row_start < row_end);
assert(row_end <= transform->ysize_);
switch (transform->type_) {
- case SUBTRACT_GREEN:
+ case SUBTRACT_GREEN_TRANSFORM:
VP8LAddGreenToBlueAndRed(in, (row_end - row_start) * width, out);
break;
case PREDICTOR_TRANSFORM:
diff --git a/thirdparty/libwebp/src/dsp/lossless_enc.c b/thirdparty/libwebp/src/dsp/lossless_enc.c
index de6c4ace5f..b1f9f26d72 100644
--- a/thirdparty/libwebp/src/dsp/lossless_enc.c
+++ b/thirdparty/libwebp/src/dsp/lossless_enc.c
@@ -522,11 +522,11 @@ static void GetCombinedEntropyUnrefined_C(const uint32_t X[],
void VP8LSubtractGreenFromBlueAndRed_C(uint32_t* argb_data, int num_pixels) {
int i;
for (i = 0; i < num_pixels; ++i) {
- const int argb = argb_data[i];
+ const int argb = (int)argb_data[i];
const int green = (argb >> 8) & 0xff;
const uint32_t new_r = (((argb >> 16) & 0xff) - green) & 0xff;
const uint32_t new_b = (((argb >> 0) & 0xff) - green) & 0xff;
- argb_data[i] = (argb & 0xff00ff00u) | (new_r << 16) | new_b;
+ argb_data[i] = ((uint32_t)argb & 0xff00ff00u) | (new_r << 16) | new_b;
}
}
@@ -547,10 +547,10 @@ void VP8LTransformColor_C(const VP8LMultipliers* const m, uint32_t* data,
const int8_t red = U32ToS8(argb >> 16);
int new_red = red & 0xff;
int new_blue = argb & 0xff;
- new_red -= ColorTransformDelta(m->green_to_red_, green);
+ new_red -= ColorTransformDelta((int8_t)m->green_to_red_, green);
new_red &= 0xff;
- new_blue -= ColorTransformDelta(m->green_to_blue_, green);
- new_blue -= ColorTransformDelta(m->red_to_blue_, red);
+ new_blue -= ColorTransformDelta((int8_t)m->green_to_blue_, green);
+ new_blue -= ColorTransformDelta((int8_t)m->red_to_blue_, red);
new_blue &= 0xff;
data[i] = (argb & 0xff00ff00u) | (new_red << 16) | (new_blue);
}
@@ -560,7 +560,7 @@ static WEBP_INLINE uint8_t TransformColorRed(uint8_t green_to_red,
uint32_t argb) {
const int8_t green = U32ToS8(argb >> 8);
int new_red = argb >> 16;
- new_red -= ColorTransformDelta(green_to_red, green);
+ new_red -= ColorTransformDelta((int8_t)green_to_red, green);
return (new_red & 0xff);
}
@@ -569,9 +569,9 @@ static WEBP_INLINE uint8_t TransformColorBlue(uint8_t green_to_blue,
uint32_t argb) {
const int8_t green = U32ToS8(argb >> 8);
const int8_t red = U32ToS8(argb >> 16);
- uint8_t new_blue = argb & 0xff;
- new_blue -= ColorTransformDelta(green_to_blue, green);
- new_blue -= ColorTransformDelta(red_to_blue, red);
+ int new_blue = argb & 0xff;
+ new_blue -= ColorTransformDelta((int8_t)green_to_blue, green);
+ new_blue -= ColorTransformDelta((int8_t)red_to_blue, red);
return (new_blue & 0xff);
}
diff --git a/thirdparty/libwebp/src/dsp/lossless_enc_sse2.c b/thirdparty/libwebp/src/dsp/lossless_enc_sse2.c
index 948001a3d5..66cbaab772 100644
--- a/thirdparty/libwebp/src/dsp/lossless_enc_sse2.c
+++ b/thirdparty/libwebp/src/dsp/lossless_enc_sse2.c
@@ -54,8 +54,8 @@ static void TransformColor_SSE2(const VP8LMultipliers* const m,
const __m128i mults_rb = MK_CST_16(CST_5b(m->green_to_red_),
CST_5b(m->green_to_blue_));
const __m128i mults_b2 = MK_CST_16(CST_5b(m->red_to_blue_), 0);
- const __m128i mask_ag = _mm_set1_epi32(0xff00ff00); // alpha-green masks
- const __m128i mask_rb = _mm_set1_epi32(0x00ff00ff); // red-blue masks
+ const __m128i mask_ag = _mm_set1_epi32((int)0xff00ff00); // alpha-green masks
+ const __m128i mask_rb = _mm_set1_epi32(0x00ff00ff); // red-blue masks
int i;
for (i = 0; i + 4 <= num_pixels; i += 4) {
const __m128i in = _mm_loadu_si128((__m128i*)&argb_data[i]); // argb
@@ -376,7 +376,7 @@ static void BundleColorMap_SSE2(const uint8_t* const row, int width, int xbits,
break;
}
case 2: {
- const __m128i mask_or = _mm_set1_epi32(0xff000000);
+ const __m128i mask_or = _mm_set1_epi32((int)0xff000000);
const __m128i mul_cst = _mm_set1_epi16(0x0104);
const __m128i mask_mul = _mm_set1_epi16(0x0f00);
for (x = 0; x + 16 <= width; x += 16, dst += 4) {
@@ -427,7 +427,7 @@ static WEBP_INLINE void Average2_m128i(const __m128i* const a0,
static void PredictorSub0_SSE2(const uint32_t* in, const uint32_t* upper,
int num_pixels, uint32_t* out) {
int i;
- const __m128i black = _mm_set1_epi32(ARGB_BLACK);
+ const __m128i black = _mm_set1_epi32((int)ARGB_BLACK);
for (i = 0; i + 4 <= num_pixels; i += 4) {
const __m128i src = _mm_loadu_si128((const __m128i*)&in[i]);
const __m128i res = _mm_sub_epi8(src, black);
diff --git a/thirdparty/libwebp/src/dsp/lossless_sse2.c b/thirdparty/libwebp/src/dsp/lossless_sse2.c
index 396cb0bdfc..4b6a532c23 100644
--- a/thirdparty/libwebp/src/dsp/lossless_sse2.c
+++ b/thirdparty/libwebp/src/dsp/lossless_sse2.c
@@ -27,23 +27,22 @@ static WEBP_INLINE uint32_t ClampedAddSubtractFull_SSE2(uint32_t c0,
uint32_t c1,
uint32_t c2) {
const __m128i zero = _mm_setzero_si128();
- const __m128i C0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(c0), zero);
- const __m128i C1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(c1), zero);
- const __m128i C2 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(c2), zero);
+ const __m128i C0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)c0), zero);
+ const __m128i C1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)c1), zero);
+ const __m128i C2 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)c2), zero);
const __m128i V1 = _mm_add_epi16(C0, C1);
const __m128i V2 = _mm_sub_epi16(V1, C2);
const __m128i b = _mm_packus_epi16(V2, V2);
- const uint32_t output = _mm_cvtsi128_si32(b);
- return output;
+ return (uint32_t)_mm_cvtsi128_si32(b);
}
static WEBP_INLINE uint32_t ClampedAddSubtractHalf_SSE2(uint32_t c0,
uint32_t c1,
uint32_t c2) {
const __m128i zero = _mm_setzero_si128();
- const __m128i C0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(c0), zero);
- const __m128i C1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(c1), zero);
- const __m128i B0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(c2), zero);
+ const __m128i C0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)c0), zero);
+ const __m128i C1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)c1), zero);
+ const __m128i B0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)c2), zero);
const __m128i avg = _mm_add_epi16(C1, C0);
const __m128i A0 = _mm_srli_epi16(avg, 1);
const __m128i A1 = _mm_sub_epi16(A0, B0);
@@ -52,16 +51,15 @@ static WEBP_INLINE uint32_t ClampedAddSubtractHalf_SSE2(uint32_t c0,
const __m128i A3 = _mm_srai_epi16(A2, 1);
const __m128i A4 = _mm_add_epi16(A0, A3);
const __m128i A5 = _mm_packus_epi16(A4, A4);
- const uint32_t output = _mm_cvtsi128_si32(A5);
- return output;
+ return (uint32_t)_mm_cvtsi128_si32(A5);
}
static WEBP_INLINE uint32_t Select_SSE2(uint32_t a, uint32_t b, uint32_t c) {
int pa_minus_pb;
const __m128i zero = _mm_setzero_si128();
- const __m128i A0 = _mm_cvtsi32_si128(a);
- const __m128i B0 = _mm_cvtsi32_si128(b);
- const __m128i C0 = _mm_cvtsi32_si128(c);
+ const __m128i A0 = _mm_cvtsi32_si128((int)a);
+ const __m128i B0 = _mm_cvtsi32_si128((int)b);
+ const __m128i C0 = _mm_cvtsi32_si128((int)c);
const __m128i AC0 = _mm_subs_epu8(A0, C0);
const __m128i CA0 = _mm_subs_epu8(C0, A0);
const __m128i BC0 = _mm_subs_epu8(B0, C0);
@@ -94,8 +92,8 @@ static WEBP_INLINE void Average2_uint32_SSE2(const uint32_t a0,
__m128i* const avg) {
// (a + b) >> 1 = ((a + b + 1) >> 1) - ((a ^ b) & 1)
const __m128i ones = _mm_set1_epi8(1);
- const __m128i A0 = _mm_cvtsi32_si128(a0);
- const __m128i A1 = _mm_cvtsi32_si128(a1);
+ const __m128i A0 = _mm_cvtsi32_si128((int)a0);
+ const __m128i A1 = _mm_cvtsi32_si128((int)a1);
const __m128i avg1 = _mm_avg_epu8(A0, A1);
const __m128i one = _mm_and_si128(_mm_xor_si128(A0, A1), ones);
*avg = _mm_sub_epi8(avg1, one);
@@ -103,8 +101,8 @@ static WEBP_INLINE void Average2_uint32_SSE2(const uint32_t a0,
static WEBP_INLINE __m128i Average2_uint32_16_SSE2(uint32_t a0, uint32_t a1) {
const __m128i zero = _mm_setzero_si128();
- const __m128i A0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(a0), zero);
- const __m128i A1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(a1), zero);
+ const __m128i A0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)a0), zero);
+ const __m128i A1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)a1), zero);
const __m128i sum = _mm_add_epi16(A1, A0);
return _mm_srli_epi16(sum, 1);
}
@@ -112,19 +110,18 @@ static WEBP_INLINE __m128i Average2_uint32_16_SSE2(uint32_t a0, uint32_t a1) {
static WEBP_INLINE uint32_t Average2_SSE2(uint32_t a0, uint32_t a1) {
__m128i output;
Average2_uint32_SSE2(a0, a1, &output);
- return _mm_cvtsi128_si32(output);
+ return (uint32_t)_mm_cvtsi128_si32(output);
}
static WEBP_INLINE uint32_t Average3_SSE2(uint32_t a0, uint32_t a1,
uint32_t a2) {
const __m128i zero = _mm_setzero_si128();
const __m128i avg1 = Average2_uint32_16_SSE2(a0, a2);
- const __m128i A1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(a1), zero);
+ const __m128i A1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)a1), zero);
const __m128i sum = _mm_add_epi16(avg1, A1);
const __m128i avg2 = _mm_srli_epi16(sum, 1);
const __m128i A2 = _mm_packus_epi16(avg2, avg2);
- const uint32_t output = _mm_cvtsi128_si32(A2);
- return output;
+ return (uint32_t)_mm_cvtsi128_si32(A2);
}
static WEBP_INLINE uint32_t Average4_SSE2(uint32_t a0, uint32_t a1,
@@ -134,8 +131,7 @@ static WEBP_INLINE uint32_t Average4_SSE2(uint32_t a0, uint32_t a1,
const __m128i sum = _mm_add_epi16(avg2, avg1);
const __m128i avg3 = _mm_srli_epi16(sum, 1);
const __m128i A0 = _mm_packus_epi16(avg3, avg3);
- const uint32_t output = _mm_cvtsi128_si32(A0);
- return output;
+ return (uint32_t)_mm_cvtsi128_si32(A0);
}
static uint32_t Predictor5_SSE2(const uint32_t* const left,
@@ -192,7 +188,7 @@ static uint32_t Predictor13_SSE2(const uint32_t* const left,
static void PredictorAdd0_SSE2(const uint32_t* in, const uint32_t* upper,
int num_pixels, uint32_t* out) {
int i;
- const __m128i black = _mm_set1_epi32(ARGB_BLACK);
+ const __m128i black = _mm_set1_epi32((int)ARGB_BLACK);
for (i = 0; i + 4 <= num_pixels; i += 4) {
const __m128i src = _mm_loadu_si128((const __m128i*)&in[i]);
const __m128i res = _mm_add_epi8(src, black);
@@ -208,7 +204,7 @@ static void PredictorAdd0_SSE2(const uint32_t* in, const uint32_t* upper,
static void PredictorAdd1_SSE2(const uint32_t* in, const uint32_t* upper,
int num_pixels, uint32_t* out) {
int i;
- __m128i prev = _mm_set1_epi32(out[-1]);
+ __m128i prev = _mm_set1_epi32((int)out[-1]);
for (i = 0; i + 4 <= num_pixels; i += 4) {
// a | b | c | d
const __m128i src = _mm_loadu_si128((const __m128i*)&in[i]);
@@ -285,12 +281,12 @@ GENERATE_PREDICTOR_2(9, upper[i + 1])
#undef GENERATE_PREDICTOR_2
// Predictor10: average of (average of (L,TL), average of (T, TR)).
-#define DO_PRED10(OUT) do { \
- __m128i avgLTL, avg; \
- Average2_m128i(&L, &TL, &avgLTL); \
- Average2_m128i(&avgTTR, &avgLTL, &avg); \
- L = _mm_add_epi8(avg, src); \
- out[i + (OUT)] = _mm_cvtsi128_si32(L); \
+#define DO_PRED10(OUT) do { \
+ __m128i avgLTL, avg; \
+ Average2_m128i(&L, &TL, &avgLTL); \
+ Average2_m128i(&avgTTR, &avgLTL, &avg); \
+ L = _mm_add_epi8(avg, src); \
+ out[i + (OUT)] = (uint32_t)_mm_cvtsi128_si32(L); \
} while (0)
#define DO_PRED10_SHIFT do { \
@@ -303,7 +299,7 @@ GENERATE_PREDICTOR_2(9, upper[i + 1])
static void PredictorAdd10_SSE2(const uint32_t* in, const uint32_t* upper,
int num_pixels, uint32_t* out) {
int i;
- __m128i L = _mm_cvtsi32_si128(out[-1]);
+ __m128i L = _mm_cvtsi32_si128((int)out[-1]);
for (i = 0; i + 4 <= num_pixels; i += 4) {
__m128i src = _mm_loadu_si128((const __m128i*)&in[i]);
__m128i TL = _mm_loadu_si128((const __m128i*)&upper[i - 1]);
@@ -336,7 +332,7 @@ static void PredictorAdd10_SSE2(const uint32_t* in, const uint32_t* upper,
const __m128i B = _mm_andnot_si128(mask, T); \
const __m128i pred = _mm_or_si128(A, B); /* pred = (pa > b)? L : T*/ \
L = _mm_add_epi8(src, pred); \
- out[i + (OUT)] = _mm_cvtsi128_si32(L); \
+ out[i + (OUT)] = (uint32_t)_mm_cvtsi128_si32(L); \
} while (0)
#define DO_PRED11_SHIFT do { \
@@ -351,7 +347,7 @@ static void PredictorAdd11_SSE2(const uint32_t* in, const uint32_t* upper,
int num_pixels, uint32_t* out) {
int i;
__m128i pa;
- __m128i L = _mm_cvtsi32_si128(out[-1]);
+ __m128i L = _mm_cvtsi32_si128((int)out[-1]);
for (i = 0; i + 4 <= num_pixels; i += 4) {
__m128i T = _mm_loadu_si128((const __m128i*)&upper[i]);
__m128i TL = _mm_loadu_si128((const __m128i*)&upper[i - 1]);
@@ -384,12 +380,12 @@ static void PredictorAdd11_SSE2(const uint32_t* in, const uint32_t* upper,
#undef DO_PRED11_SHIFT
// Predictor12: ClampedAddSubtractFull.
-#define DO_PRED12(DIFF, LANE, OUT) do { \
- const __m128i all = _mm_add_epi16(L, (DIFF)); \
- const __m128i alls = _mm_packus_epi16(all, all); \
- const __m128i res = _mm_add_epi8(src, alls); \
- out[i + (OUT)] = _mm_cvtsi128_si32(res); \
- L = _mm_unpacklo_epi8(res, zero); \
+#define DO_PRED12(DIFF, LANE, OUT) do { \
+ const __m128i all = _mm_add_epi16(L, (DIFF)); \
+ const __m128i alls = _mm_packus_epi16(all, all); \
+ const __m128i res = _mm_add_epi8(src, alls); \
+ out[i + (OUT)] = (uint32_t)_mm_cvtsi128_si32(res); \
+ L = _mm_unpacklo_epi8(res, zero); \
} while (0)
#define DO_PRED12_SHIFT(DIFF, LANE) do { \
@@ -402,7 +398,7 @@ static void PredictorAdd12_SSE2(const uint32_t* in, const uint32_t* upper,
int num_pixels, uint32_t* out) {
int i;
const __m128i zero = _mm_setzero_si128();
- const __m128i L8 = _mm_cvtsi32_si128(out[-1]);
+ const __m128i L8 = _mm_cvtsi32_si128((int)out[-1]);
__m128i L = _mm_unpacklo_epi8(L8, zero);
for (i = 0; i + 4 <= num_pixels; i += 4) {
// Load 4 pixels at a time.
@@ -468,7 +464,7 @@ static void TransformColorInverse_SSE2(const VP8LMultipliers* const m,
const __m128i mults_b2 = MK_CST_16(CST(red_to_blue_), 0);
#undef MK_CST_16
#undef CST
- const __m128i mask_ag = _mm_set1_epi32(0xff00ff00); // alpha-green masks
+ const __m128i mask_ag = _mm_set1_epi32((int)0xff00ff00); // alpha-green masks
int i;
for (i = 0; i + 4 <= num_pixels; i += 4) {
const __m128i in = _mm_loadu_si128((const __m128i*)&src[i]); // argb
@@ -532,7 +528,7 @@ static void ConvertBGRAToRGB_SSE2(const uint32_t* src, int num_pixels,
static void ConvertBGRAToRGBA_SSE2(const uint32_t* src,
int num_pixels, uint8_t* dst) {
- const __m128i red_blue_mask = _mm_set1_epi32(0x00ff00ffu);
+ const __m128i red_blue_mask = _mm_set1_epi32(0x00ff00ff);
const __m128i* in = (const __m128i*)src;
__m128i* out = (__m128i*)dst;
while (num_pixels >= 8) {
@@ -561,7 +557,7 @@ static void ConvertBGRAToRGBA_SSE2(const uint32_t* src,
static void ConvertBGRAToRGBA4444_SSE2(const uint32_t* src,
int num_pixels, uint8_t* dst) {
const __m128i mask_0x0f = _mm_set1_epi8(0x0f);
- const __m128i mask_0xf0 = _mm_set1_epi8(0xf0);
+ const __m128i mask_0xf0 = _mm_set1_epi8((char)0xf0);
const __m128i* in = (const __m128i*)src;
__m128i* out = (__m128i*)dst;
while (num_pixels >= 8) {
@@ -596,8 +592,8 @@ static void ConvertBGRAToRGBA4444_SSE2(const uint32_t* src,
static void ConvertBGRAToRGB565_SSE2(const uint32_t* src,
int num_pixels, uint8_t* dst) {
- const __m128i mask_0xe0 = _mm_set1_epi8(0xe0);
- const __m128i mask_0xf8 = _mm_set1_epi8(0xf8);
+ const __m128i mask_0xe0 = _mm_set1_epi8((char)0xe0);
+ const __m128i mask_0xf8 = _mm_set1_epi8((char)0xf8);
const __m128i mask_0x07 = _mm_set1_epi8(0x07);
const __m128i* in = (const __m128i*)src;
__m128i* out = (__m128i*)dst;
diff --git a/thirdparty/libwebp/src/dsp/lossless_sse41.c b/thirdparty/libwebp/src/dsp/lossless_sse41.c
index b0d6daa7fe..bb7ce7611f 100644
--- a/thirdparty/libwebp/src/dsp/lossless_sse41.c
+++ b/thirdparty/libwebp/src/dsp/lossless_sse41.c
@@ -25,11 +25,12 @@ static void TransformColorInverse_SSE41(const VP8LMultipliers* const m,
int num_pixels, uint32_t* dst) {
// sign-extended multiplying constants, pre-shifted by 5.
#define CST(X) (((int16_t)(m->X << 8)) >> 5) // sign-extend
- const __m128i mults_rb = _mm_set1_epi32((uint32_t)CST(green_to_red_) << 16 |
- (CST(green_to_blue_) & 0xffff));
+ const __m128i mults_rb =
+ _mm_set1_epi32((int)((uint32_t)CST(green_to_red_) << 16 |
+ (CST(green_to_blue_) & 0xffff)));
const __m128i mults_b2 = _mm_set1_epi32(CST(red_to_blue_));
#undef CST
- const __m128i mask_ag = _mm_set1_epi32(0xff00ff00);
+ const __m128i mask_ag = _mm_set1_epi32((int)0xff00ff00);
const __m128i perm1 = _mm_setr_epi8(-1, 1, -1, 1, -1, 5, -1, 5,
-1, 9, -1, 9, -1, 13, -1, 13);
const __m128i perm2 = _mm_setr_epi8(-1, 2, -1, -1, -1, 6, -1, -1,
diff --git a/thirdparty/libwebp/src/dsp/quant.h b/thirdparty/libwebp/src/dsp/quant.h
index 5e8dba8d19..fc099bf9d6 100644
--- a/thirdparty/libwebp/src/dsp/quant.h
+++ b/thirdparty/libwebp/src/dsp/quant.h
@@ -21,10 +21,15 @@
#define IsFlat IsFlat_NEON
-static uint32x2_t horizontal_add_uint32x4(const uint32x4_t a) {
+static uint32_t horizontal_add_uint32x4(const uint32x4_t a) {
+#if defined(__aarch64__)
+ return vaddvq_u32(a);
+#else
const uint64x2_t b = vpaddlq_u32(a);
- return vadd_u32(vreinterpret_u32_u64(vget_low_u64(b)),
- vreinterpret_u32_u64(vget_high_u64(b)));
+ const uint32x2_t c = vadd_u32(vreinterpret_u32_u64(vget_low_u64(b)),
+ vreinterpret_u32_u64(vget_high_u64(b)));
+ return vget_lane_u32(c, 0);
+#endif
}
static WEBP_INLINE int IsFlat(const int16_t* levels, int num_blocks,
@@ -45,7 +50,7 @@ static WEBP_INLINE int IsFlat(const int16_t* levels, int num_blocks,
levels += 16;
}
- return thresh >= (int32_t)vget_lane_u32(horizontal_add_uint32x4(sum), 0);
+ return thresh >= (int)horizontal_add_uint32x4(sum);
}
#else
diff --git a/thirdparty/libwebp/src/dsp/rescaler_sse2.c b/thirdparty/libwebp/src/dsp/rescaler_sse2.c
index d7effea16e..3f18e94e93 100644
--- a/thirdparty/libwebp/src/dsp/rescaler_sse2.c
+++ b/thirdparty/libwebp/src/dsp/rescaler_sse2.c
@@ -85,7 +85,7 @@ static void RescalerImportRowExpand_SSE2(WebPRescaler* const wrk,
const __m128i mult = _mm_cvtsi32_si128(((x_add - accum) << 16) | accum);
const __m128i out = _mm_madd_epi16(cur_pixels, mult);
assert(sizeof(*frow) == sizeof(uint32_t));
- WebPUint32ToMem((uint8_t*)frow, _mm_cvtsi128_si32(out));
+ WebPInt32ToMem((uint8_t*)frow, _mm_cvtsi128_si32(out));
frow += 1;
if (frow >= frow_end) break;
accum -= wrk->x_sub;
@@ -132,7 +132,7 @@ static void RescalerImportRowShrink_SSE2(WebPRescaler* const wrk,
__m128i base = zero;
accum += wrk->x_add;
while (accum > 0) {
- const __m128i A = _mm_cvtsi32_si128(WebPMemToUint32(src));
+ const __m128i A = _mm_cvtsi32_si128(WebPMemToInt32(src));
src += 4;
base = _mm_unpacklo_epi8(A, zero);
// To avoid overflow, we need: base * x_add / x_sub < 32768
@@ -198,7 +198,7 @@ static WEBP_INLINE void ProcessRow_SSE2(const __m128i* const A0,
const __m128i* const mult,
uint8_t* const dst) {
const __m128i rounder = _mm_set_epi32(0, ROUNDER, 0, ROUNDER);
- const __m128i mask = _mm_set_epi32(0xffffffffu, 0, 0xffffffffu, 0);
+ const __m128i mask = _mm_set_epi32(~0, 0, ~0, 0);
const __m128i B0 = _mm_mul_epu32(*A0, *mult);
const __m128i B1 = _mm_mul_epu32(*A1, *mult);
const __m128i B2 = _mm_mul_epu32(*A2, *mult);
diff --git a/thirdparty/libwebp/src/dsp/upsampling_sse2.c b/thirdparty/libwebp/src/dsp/upsampling_sse2.c
index 340f1e2ac2..08b6d0b1cf 100644
--- a/thirdparty/libwebp/src/dsp/upsampling_sse2.c
+++ b/thirdparty/libwebp/src/dsp/upsampling_sse2.c
@@ -121,7 +121,7 @@ static void FUNC_NAME(const uint8_t* top_y, const uint8_t* bottom_y, \
int uv_pos, pos; \
/* 16byte-aligned array to cache reconstructed u and v */ \
uint8_t uv_buf[14 * 32 + 15] = { 0 }; \
- uint8_t* const r_u = (uint8_t*)((uintptr_t)(uv_buf + 15) & ~15); \
+ uint8_t* const r_u = (uint8_t*)((uintptr_t)(uv_buf + 15) & ~(uintptr_t)15); \
uint8_t* const r_v = r_u + 32; \
\
assert(top_y != NULL); \
diff --git a/thirdparty/libwebp/src/dsp/yuv_sse2.c b/thirdparty/libwebp/src/dsp/yuv_sse2.c
index 970bbb7884..01a48f9af2 100644
--- a/thirdparty/libwebp/src/dsp/yuv_sse2.c
+++ b/thirdparty/libwebp/src/dsp/yuv_sse2.c
@@ -15,10 +15,12 @@
#if defined(WEBP_USE_SSE2)
-#include "src/dsp/common_sse2.h"
#include <stdlib.h>
#include <emmintrin.h>
+#include "src/dsp/common_sse2.h"
+#include "src/utils/utils.h"
+
//-----------------------------------------------------------------------------
// Convert spans of 32 pixels to various RGB formats for the fancy upsampler.
@@ -74,7 +76,7 @@ static WEBP_INLINE __m128i Load_HI_16_SSE2(const uint8_t* src) {
// Load and replicate the U/V samples
static WEBP_INLINE __m128i Load_UV_HI_8_SSE2(const uint8_t* src) {
const __m128i zero = _mm_setzero_si128();
- const __m128i tmp0 = _mm_cvtsi32_si128(*(const uint32_t*)src);
+ const __m128i tmp0 = _mm_cvtsi32_si128(WebPMemToInt32(src));
const __m128i tmp1 = _mm_unpacklo_epi8(zero, tmp0);
return _mm_unpacklo_epi16(tmp1, tmp1); // replicate samples
}
@@ -130,7 +132,7 @@ static WEBP_INLINE void PackAndStore4444_SSE2(const __m128i* const R,
const __m128i rg0 = _mm_packus_epi16(*B, *A);
const __m128i ba0 = _mm_packus_epi16(*R, *G);
#endif
- const __m128i mask_0xf0 = _mm_set1_epi8(0xf0);
+ const __m128i mask_0xf0 = _mm_set1_epi8((char)0xf0);
const __m128i rb1 = _mm_unpacklo_epi8(rg0, ba0); // rbrbrbrbrb...
const __m128i ga1 = _mm_unpackhi_epi8(rg0, ba0); // gagagagaga...
const __m128i rb2 = _mm_and_si128(rb1, mask_0xf0);
@@ -147,9 +149,10 @@ static WEBP_INLINE void PackAndStore565_SSE2(const __m128i* const R,
const __m128i r0 = _mm_packus_epi16(*R, *R);
const __m128i g0 = _mm_packus_epi16(*G, *G);
const __m128i b0 = _mm_packus_epi16(*B, *B);
- const __m128i r1 = _mm_and_si128(r0, _mm_set1_epi8(0xf8));
+ const __m128i r1 = _mm_and_si128(r0, _mm_set1_epi8((char)0xf8));
const __m128i b1 = _mm_and_si128(_mm_srli_epi16(b0, 3), _mm_set1_epi8(0x1f));
- const __m128i g1 = _mm_srli_epi16(_mm_and_si128(g0, _mm_set1_epi8(0xe0)), 5);
+ const __m128i g1 =
+ _mm_srli_epi16(_mm_and_si128(g0, _mm_set1_epi8((char)0xe0)), 5);
const __m128i g2 = _mm_slli_epi16(_mm_and_si128(g0, _mm_set1_epi8(0x1c)), 3);
const __m128i rg = _mm_or_si128(r1, g1);
const __m128i gb = _mm_or_si128(g2, b1);
diff --git a/thirdparty/libwebp/src/dsp/yuv_sse41.c b/thirdparty/libwebp/src/dsp/yuv_sse41.c
index 579d1f7402..f79b802e47 100644
--- a/thirdparty/libwebp/src/dsp/yuv_sse41.c
+++ b/thirdparty/libwebp/src/dsp/yuv_sse41.c
@@ -15,10 +15,12 @@
#if defined(WEBP_USE_SSE41)
-#include "src/dsp/common_sse41.h"
#include <stdlib.h>
#include <smmintrin.h>
+#include "src/dsp/common_sse41.h"
+#include "src/utils/utils.h"
+
//-----------------------------------------------------------------------------
// Convert spans of 32 pixels to various RGB formats for the fancy upsampler.
@@ -74,7 +76,7 @@ static WEBP_INLINE __m128i Load_HI_16_SSE41(const uint8_t* src) {
// Load and replicate the U/V samples
static WEBP_INLINE __m128i Load_UV_HI_8_SSE41(const uint8_t* src) {
const __m128i zero = _mm_setzero_si128();
- const __m128i tmp0 = _mm_cvtsi32_si128(*(const uint32_t*)src);
+ const __m128i tmp0 = _mm_cvtsi32_si128(WebPMemToInt32(src));
const __m128i tmp1 = _mm_unpacklo_epi8(zero, tmp0);
return _mm_unpacklo_epi16(tmp1, tmp1); // replicate samples
}
diff --git a/thirdparty/libwebp/src/enc/analysis_enc.c b/thirdparty/libwebp/src/enc/analysis_enc.c
index ebb784261c..a0001ac034 100644
--- a/thirdparty/libwebp/src/enc/analysis_enc.c
+++ b/thirdparty/libwebp/src/enc/analysis_enc.c
@@ -391,12 +391,14 @@ static int DoSegmentsJob(void* arg1, void* arg2) {
return ok;
}
+#ifdef WEBP_USE_THREAD
static void MergeJobs(const SegmentJob* const src, SegmentJob* const dst) {
int i;
for (i = 0; i <= MAX_ALPHA; ++i) dst->alphas[i] += src->alphas[i];
dst->alpha += src->alpha;
dst->uv_alpha += src->uv_alpha;
}
+#endif
// initialize the job struct with some tasks to perform
static void InitSegmentJob(VP8Encoder* const enc, SegmentJob* const job,
@@ -425,10 +427,10 @@ int VP8EncAnalyze(VP8Encoder* const enc) {
(enc->method_ <= 1); // for method 0 - 1, we need preds_[] to be filled.
if (do_segments) {
const int last_row = enc->mb_h_;
- // We give a little more than a half work to the main thread.
- const int split_row = (9 * last_row + 15) >> 4;
const int total_mb = last_row * enc->mb_w_;
#ifdef WEBP_USE_THREAD
+ // We give a little more than a half work to the main thread.
+ const int split_row = (9 * last_row + 15) >> 4;
const int kMinSplitRow = 2; // minimal rows needed for mt to be worth it
const int do_mt = (enc->thread_level_ > 0) && (split_row >= kMinSplitRow);
#else
@@ -438,6 +440,7 @@ int VP8EncAnalyze(VP8Encoder* const enc) {
WebPGetWorkerInterface();
SegmentJob main_job;
if (do_mt) {
+#ifdef WEBP_USE_THREAD
SegmentJob side_job;
// Note the use of '&' instead of '&&' because we must call the functions
// no matter what.
@@ -455,6 +458,7 @@ int VP8EncAnalyze(VP8Encoder* const enc) {
}
worker_interface->End(&side_job.worker);
if (ok) MergeJobs(&side_job, &main_job); // merge results together
+#endif // WEBP_USE_THREAD
} else {
// Even for single-thread case, we use the generic Worker tools.
InitSegmentJob(enc, &main_job, 0, last_row);
diff --git a/thirdparty/libwebp/src/enc/picture_csp_enc.c b/thirdparty/libwebp/src/enc/picture_csp_enc.c
index fabebcf202..78c8ca479b 100644
--- a/thirdparty/libwebp/src/enc/picture_csp_enc.c
+++ b/thirdparty/libwebp/src/enc/picture_csp_enc.c
@@ -69,10 +69,12 @@ static int CheckNonOpaque(const uint8_t* alpha, int width, int height,
int WebPPictureHasTransparency(const WebPPicture* picture) {
if (picture == NULL) return 0;
if (picture->use_argb) {
- const int alpha_offset = ALPHA_OFFSET;
- return CheckNonOpaque((const uint8_t*)picture->argb + alpha_offset,
- picture->width, picture->height,
- 4, picture->argb_stride * sizeof(*picture->argb));
+ if (picture->argb != NULL) {
+ return CheckNonOpaque((const uint8_t*)picture->argb + ALPHA_OFFSET,
+ picture->width, picture->height,
+ 4, picture->argb_stride * sizeof(*picture->argb));
+ }
+ return 0;
}
return CheckNonOpaque(picture->a, picture->width, picture->height,
1, picture->a_stride);
@@ -170,21 +172,6 @@ static const int kMinDimensionIterativeConversion = 4;
//------------------------------------------------------------------------------
// Main function
-extern void SharpYuvInit(VP8CPUInfo cpu_info_func);
-
-static void SafeInitSharpYuv(void) {
-#if defined(WEBP_USE_THREAD) && !defined(_WIN32)
- static pthread_mutex_t initsharpyuv_lock = PTHREAD_MUTEX_INITIALIZER;
- if (pthread_mutex_lock(&initsharpyuv_lock)) return;
-#endif
-
- SharpYuvInit(VP8GetCPUInfo);
-
-#if defined(WEBP_USE_THREAD) && !defined(_WIN32)
- (void)pthread_mutex_unlock(&initsharpyuv_lock);
-#endif
-}
-
static int PreprocessARGB(const uint8_t* r_ptr,
const uint8_t* g_ptr,
const uint8_t* b_ptr,
@@ -481,6 +468,8 @@ static WEBP_INLINE void ConvertRowsToUV(const uint16_t* rgb,
}
}
+extern void SharpYuvInit(VP8CPUInfo cpu_info_func);
+
static int ImportYUVAFromRGBA(const uint8_t* r_ptr,
const uint8_t* g_ptr,
const uint8_t* b_ptr,
@@ -516,7 +505,7 @@ static int ImportYUVAFromRGBA(const uint8_t* r_ptr,
}
if (use_iterative_conversion) {
- SafeInitSharpYuv();
+ SharpYuvInit(VP8GetCPUInfo);
if (!PreprocessARGB(r_ptr, g_ptr, b_ptr, step, rgb_stride, picture)) {
return 0;
}
diff --git a/thirdparty/libwebp/src/enc/vp8i_enc.h b/thirdparty/libwebp/src/enc/vp8i_enc.h
index 71f76702ae..c9927c47d8 100644
--- a/thirdparty/libwebp/src/enc/vp8i_enc.h
+++ b/thirdparty/libwebp/src/enc/vp8i_enc.h
@@ -31,8 +31,8 @@ extern "C" {
// version numbers
#define ENC_MAJ_VERSION 1
-#define ENC_MIN_VERSION 2
-#define ENC_REV_VERSION 4
+#define ENC_MIN_VERSION 3
+#define ENC_REV_VERSION 0
enum { MAX_LF_LEVELS = 64, // Maximum loop filter level
MAX_VARIABLE_LEVEL = 67, // last (inclusive) level with variable cost
diff --git a/thirdparty/libwebp/src/enc/vp8l_enc.c b/thirdparty/libwebp/src/enc/vp8l_enc.c
index 2b345df610..0b07e529a9 100644
--- a/thirdparty/libwebp/src/enc/vp8l_enc.c
+++ b/thirdparty/libwebp/src/enc/vp8l_enc.c
@@ -361,10 +361,11 @@ typedef enum {
kHistoTotal // Must be last.
} HistoIx;
-static void AddSingleSubGreen(int p, uint32_t* const r, uint32_t* const b) {
- const int green = p >> 8; // The upper bits are masked away later.
- ++r[((p >> 16) - green) & 0xff];
- ++b[((p >> 0) - green) & 0xff];
+static void AddSingleSubGreen(uint32_t p,
+ uint32_t* const r, uint32_t* const b) {
+ const int green = (int)p >> 8; // The upper bits are masked away later.
+ ++r[(((int)p >> 16) - green) & 0xff];
+ ++b[(((int)p >> 0) - green) & 0xff];
}
static void AddSingle(uint32_t p,
@@ -1354,7 +1355,7 @@ static int EncodeImageInternal(
static void ApplySubtractGreen(VP8LEncoder* const enc, int width, int height,
VP8LBitWriter* const bw) {
VP8LPutBits(bw, TRANSFORM_PRESENT, 1);
- VP8LPutBits(bw, SUBTRACT_GREEN, 2);
+ VP8LPutBits(bw, SUBTRACT_GREEN_TRANSFORM, 2);
VP8LSubtractGreenFromBlueAndRed(enc->argb_, width * height);
}
diff --git a/thirdparty/libwebp/src/mux/muxi.h b/thirdparty/libwebp/src/mux/muxi.h
index 0f4af1784d..7929138c44 100644
--- a/thirdparty/libwebp/src/mux/muxi.h
+++ b/thirdparty/libwebp/src/mux/muxi.h
@@ -28,8 +28,8 @@ extern "C" {
// Defines and constants.
#define MUX_MAJ_VERSION 1
-#define MUX_MIN_VERSION 2
-#define MUX_REV_VERSION 4
+#define MUX_MIN_VERSION 3
+#define MUX_REV_VERSION 0
// Chunk object.
typedef struct WebPChunk WebPChunk;
diff --git a/thirdparty/libwebp/src/utils/bit_reader_inl_utils.h b/thirdparty/libwebp/src/utils/bit_reader_inl_utils.h
index 404b9a6d8c..24f3af7b54 100644
--- a/thirdparty/libwebp/src/utils/bit_reader_inl_utils.h
+++ b/thirdparty/libwebp/src/utils/bit_reader_inl_utils.h
@@ -148,9 +148,9 @@ int VP8GetSigned(VP8BitReader* WEBP_RESTRICT const br, int v,
const range_t value = (range_t)(br->value_ >> pos);
const int32_t mask = (int32_t)(split - value) >> 31; // -1 or 0
br->bits_ -= 1;
- br->range_ += mask;
+ br->range_ += (range_t)mask;
br->range_ |= 1;
- br->value_ -= (bit_t)((split + 1) & mask) << pos;
+ br->value_ -= (bit_t)((split + 1) & (uint32_t)mask) << pos;
BT_TRACK(br);
return (v ^ mask) - mask;
}
diff --git a/thirdparty/libwebp/src/utils/huffman_utils.c b/thirdparty/libwebp/src/utils/huffman_utils.c
index 0cba0fbb7d..90c2fbf7c1 100644
--- a/thirdparty/libwebp/src/utils/huffman_utils.c
+++ b/thirdparty/libwebp/src/utils/huffman_utils.c
@@ -142,7 +142,7 @@ static int BuildHuffmanTable(HuffmanCode* const root_table, int root_bits,
{
int step; // step size to replicate values in current table
- uint32_t low = -1; // low bits for current root entry
+ uint32_t low = 0xffffffffu; // low bits for current root entry
uint32_t mask = total_size - 1; // mask for low bits
uint32_t key = 0; // reversed prefix code
int num_nodes = 1; // number of Huffman tree nodes
diff --git a/thirdparty/libwebp/src/utils/utils.h b/thirdparty/libwebp/src/utils/utils.h
index ef04f108fe..c5ee873357 100644
--- a/thirdparty/libwebp/src/utils/utils.h
+++ b/thirdparty/libwebp/src/utils/utils.h
@@ -64,7 +64,8 @@ WEBP_EXTERN void WebPSafeFree(void* const ptr);
// Alignment
#define WEBP_ALIGN_CST 31
-#define WEBP_ALIGN(PTR) (((uintptr_t)(PTR) + WEBP_ALIGN_CST) & ~WEBP_ALIGN_CST)
+#define WEBP_ALIGN(PTR) (((uintptr_t)(PTR) + WEBP_ALIGN_CST) & \
+ ~(uintptr_t)WEBP_ALIGN_CST)
#include <string.h>
// memcpy() is the safe way of moving potentially unaligned 32b memory.
@@ -73,10 +74,19 @@ static WEBP_INLINE uint32_t WebPMemToUint32(const uint8_t* const ptr) {
memcpy(&A, ptr, sizeof(A));
return A;
}
+
+static WEBP_INLINE int32_t WebPMemToInt32(const uint8_t* const ptr) {
+ return (int32_t)WebPMemToUint32(ptr);
+}
+
static WEBP_INLINE void WebPUint32ToMem(uint8_t* const ptr, uint32_t val) {
memcpy(ptr, &val, sizeof(val));
}
+static WEBP_INLINE void WebPInt32ToMem(uint8_t* const ptr, int val) {
+ WebPUint32ToMem(ptr, (uint32_t)val);
+}
+
//------------------------------------------------------------------------------
// Reading/writing data.
diff --git a/thirdparty/libwebp/src/webp/format_constants.h b/thirdparty/libwebp/src/webp/format_constants.h
index eca6981a47..999035c5d2 100644
--- a/thirdparty/libwebp/src/webp/format_constants.h
+++ b/thirdparty/libwebp/src/webp/format_constants.h
@@ -55,7 +55,7 @@
typedef enum {
PREDICTOR_TRANSFORM = 0,
CROSS_COLOR_TRANSFORM = 1,
- SUBTRACT_GREEN = 2,
+ SUBTRACT_GREEN_TRANSFORM = 2,
COLOR_INDEXING_TRANSFORM = 3
} VP8LImageTransformType;
diff --git a/thirdparty/libwebp/src/webp/types.h b/thirdparty/libwebp/src/webp/types.h
index 47f7f2b007..f255432e41 100644
--- a/thirdparty/libwebp/src/webp/types.h
+++ b/thirdparty/libwebp/src/webp/types.h
@@ -42,7 +42,11 @@ typedef long long int int64_t;
# if defined(__GNUC__) && __GNUC__ >= 4
# define WEBP_EXTERN extern __attribute__ ((visibility ("default")))
# else
-# define WEBP_EXTERN extern
+# if defined(_MSC_VER) && defined(WEBP_DLL)
+# define WEBP_EXTERN __declspec(dllexport)
+# else
+# define WEBP_EXTERN extern
+# endif
# endif /* __GNUC__ >= 4 */
#endif /* WEBP_EXTERN */